Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

Share what I know............... learn what I don’t

آخرین نظرات

آنالیز بدافزار ZeroAccess (قسمت اول)

پنجشنبه, ۲۶ شهریور ۱۳۹۴، ۱۱:۰۹ ق.ظ

یکی از کارهای دوست داشتنی در مهندسی معکوس آنالیز بدافزار هستش

کاری که شمارو با ابعاد مختلف مهندسی معکوس آشنا می کنه مثل انواع آنتی ها, حقه ها, نحوه ی استفاده از امکانات سیستم عامل, نحوه ی سواستفاده از این امکانات, Zero Day ها و خیلی چیزای دیگه...:)

نمیدونم شروع این سری آموزشی بجا باشه یا نه, ولی فک کنم روند آموزشیمون نیاز به یه چالش داشته باشه.البته در کنار این سری آموزشی سعی میکنم روند آموزشی قبل رو هم ادامه بدم.

ما قراره سری آموزشی Dr.FU که تحلیل یه نسخه ی قدیمی از بدافزار ZeroAccess که بهش Max++ هم میگن هستش رو اینجا قرار بدیم.

 

ما فرض می کنیم که شما با مسائل پایه مهندسی معکوس مثل X86 asm , Debugging , OS و زبان برنامه نویسی آشنایی مختصری دارید, اگه این اطلاعات رو ندارید میتونید آموزش های قبلی این وبلاگ رو بخونید.

موارد مورد نیاز در طول این آموزش:

1- یک راه انداز ماشین مجازی مثل Virtual Box یا Vmware

2- ویندوز XP سرویس پک 2 برای نصب در VMWare

3- IDA Pro , OllyDbg یا ImmDbg

4- یک هگزادیتور

5- WinDbg

6- Wireshark

7- ZeroAccess (نسخه ای که قراره آنالیز کنیم رو اینجا می تونید دانلود کنید)

 

نکته: ویندوز میزبان ما XP-SP2 هست و VM رو در این ویندوز نصب کردیم و یه ویندوز XP-SP2 مجازی هم راه اندازی کردیم.

نکته دوم: قبل شروع آنالیز حتما یه snapshot از VM خودتون بگیرد.

 

طریقه ی راه اندازی یک ماشین مجازی رو احتمالا باهاش آشنا هستید اگه اینطور نیست می تونید از دکتر Google بپرسید:)

 

 

وقتی فایل رو در IDA باز میکنیم: 



حالا چیزی که در دیباگر می بینیم:


خوب میبینید که انگار این بدافزار فقط چندتا دستور اسمبلی ساده داره و دیگر هیچ :)

و این دستورات هم کار خاصی انجام نمیدند جز یک دستور, اون هم INT 2Dh هستش.

 

دستور INT برای وقفه ها مورد استفاده قرار میگیره.

حالا INT 2Dh چه کاری انجام میده؟

 من نمیخوام توضیح زیادی در مورد این دستور بدم فقط بدونید که یک بایت پرش میکنه در صورتی که eax = 1  (یا بقولی true) باشه و تنها دستور یک آدرس رو اجرا می کنه و در آدرس بعدی متوقف میشه.(در دیباگر)

جز دستوراتی هستش که بیشتر برای آنتی دیباگینگ استفاده میشه.

اینکه چطور این پرش صورت میگیره یا استفاده های دیگه ی این دستور رو میتونید جستجو کنید یا اینکه منتظر باشید تا بعدها یه پست در موردش قرار بدم.دستور جالبیه.

 

حالا اگه این پرش انجام بشه EIP ما به کجا میره؟

ما که دستوری در ادامه نمیبینیم؟!

پس مشخصه که حتما در ادامه, دستوراتی وجود داره که ما مشاهده نمیکنیم. برای مشاهده ادامه کد در IDA , ابتدا Space رو بزنید تا از حالت گراف به حالت text بریم, Data هایی که در ادامه وجود دارند رو انتخاب کنید سپس کلید C رو فشار بدید و گزینه Force رو انتخاب کنید و بعد هم Yes رو بزنید. با اینکار میبینید که کدها ظاهر میشند:)


در ادامه:


خوب میبینید که بلافاصله پس از retn , یک تابع وجود داره, پس با اجرای INT 2Dh ما از retn پرش می کنیم و به داخل تابع sub_413A38 وارد میشیم و در آدرس 413A38 متوقف میشیم.

نکته:همونطور که گفتم تنها یک دستور اجرا میشه و دستور در آدرس بعد اجرا نمیشه. و در اینجا میبینید که ما در دستور داخل این تابع متوقف میشیم و کل تابع اجرا نمیشه.



خوب اینها هم یه دستورات ساده هستند که نیاز به توضیح ندارند



نکته:دلیل اینکه من دارم این بدافزار رو داخل IDA Pro بررسی می کنم فقط بخاطر این هستش که VMWare سیستمم مشکل پیدا کرده برای همین دارم بجای آنالیز پویا از روش استاتیک استفاده می کنم. ولی یکم که بریم جلوتر خواهید دید که دیگه روش استاتیک جواب نمیده و حتما باید از دیباگر برای تحلیل استفاده کنیم.


حالا ما وارد تابع sub_4138B4 میشیم.



باز هم میبینید که int 2dh وجود داره و چون eax =3  و True هستش پس یک بایت قراره پرش کنیم و این یک بایت هم دستور retn هستش.

پس باید در ادامه هم کدهایی وجود داشته باشه.مثل روش قبل data رو به کد تبدیل می کنیم.



دستور call اول که یکم عجیب هستش و دستورات بعد خودش رو فراخوانی می کنه (اگه توی دیباگر این دستورو نگاه کنید آدرس دستور بعد call رو جلوش خواهید دید ولی چون IDA استاتیک نشون میده میگه که 5 بایت جلوتر که اون هم یعنی آدرس دستور بعدی)


وقتی یک call فراخوانی میشه چه اتفاقاتی می افته:

1- دستور call میاد آدرس دستور بعد خودش رو داخل stack پوش میکنه

2- بعد میاد به آدرس ورودی تابع پرش میکنه


با این تفاسیر:

وقتی call ما فراخوانی میشه آدرس دستور بعدی خودش رو روی stack قرار میده و بعد به دستور بعدی خودش پرش میکنه.و حالا اگه دستور call ما به اتمام بررسه و بخوایم return کنیم چه اتفاقی میافته؟

ما دوباره به آدرس بعد call میریم:)


در ادامه eax  برابر با 3 میشه و دستور int 2dh از یک بایت پرش خواهد کرد و یک آدرس در ادامه را اجرا خواهد کرد.

 

اگه ما فرض کنیم که این پرش توسط int 2dh اتفاق نیوفته چی پیش میاد؟

دستور retn اجرا میشه. اگه این دستور اجرا بشه میاد آدرس ادامه دستورات پس از call رو از stack پاپ میکنه همون آدرسی که call پوش کرده بود رو میگم.بعد به اون آدرس پرش میکنه. پس ما دوباره به آدرس 413BB9 میریم. و دوباره دستورات ازین آدرس اجرا میشند و اگه باز retn اجرا بشه ما به آدرس 413A40 پرش میکنیم و دستور iret اجرا خواهد شد و ما بدین ترتیب به اتمام برنامه میرسیم






نظرات (۲)

pass:infected
سلام
پست مفید و جذابی بود، امیدوارم این کار خوبتون ادامه داشته باشه.
موفق باشید
پاسخ:
سلام دوست عزیز.
ممنون. من هم منتظر پست های خوب شما هستم.
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی