Tuesday, August 2, 2011

Binary Code Modification / Patching

Patching چیست ؟

همانطور که می دانید وقتی یک فایل EXE اجرا می شود به همان صورتی که بر روی هارد قرار داشته بر رویMemory قرار می گیرد. بنابراین اگر ما بتوانیم به حافظه دسترسی پیدا کنیم می توانیم به صورت مستقیم تغییراتی را داخل برنامه در حین اجرا انجام دهیم. به این کار Patching گفته می شود. مهندسی معکوس روش های و تکنیک های بسیار زیادی دارد ما فقط در این مطلب تکنیک patching را مورد بررسی قرار می دهیم.

ابزار این کار چیست ؟

در هر مهندسی معکوس ما نیاز به ابزار جدایی ناپذیر این کار یعنی (Editor debuggers, disassemblers, hex) داریم. در این مقاله ما از ابزار IDA Pro , Ollydbg برای فهم بهتر شما استفاده می کنیم. به علت inline assembler بودن و داشتن قابلیت binary edit ما از این debugger/disassembler ها استفاده می کنیم. البته ما این debugger/disassemblerو inline assemble را فقط در معماری های “ x86 استفاده می کنیم. IDA فقط در بخش disassembler به شما کمک خواهد کرد. برای patching و به شما کتاب های processor resource و Opcode (instruction encoding) مطاله کنید بد نیست ;)

در این مقاله بر روی یک برنامه ساده که با C نوشته شده و دارای باگ Buffer Overflow هست کار Patching انجام میدیم.

#include

int main()

{

char buf[16];

printf("\nString giriniz:");

scanf("%s", &buf);

return 0;

}


نکته: با توجه به این که شما دانش کافی در مورد Buffer Overflow و سر ریز حافظه اطلاع کافی دارید به این مطاب نمی پرداریم.





به همین شکل که در تصویر بالا مشاهده میکنید فانکشن “scanf” رشته ورودی را کنترل نمی کند . همان طور که می دانید ما می توانیم به فانکشن هایی مثل scanf , sprintf به میزان کارکتر های format و با روش format string کنترل داشته باشم. مثل (%15s , %.15s)


و حالا قدم به قدم به کار اصلیمون یعنی (patching) می پردازیم. من برای این کار برنامه ollydbg را ترجیح میدم. برای کار ollydbg محیط بسیار راحت و کاربر پسندی ارائه میده. من از IDA بیشتر برای کار های آنالیر استفاده می کنم.

و حالا برنامه اسیب پذیر رو در ollydbg باز می کنیم.



همان طور که در قسمت Disassembler دیباگر می بینید برنامه برای سر ریز شدن به آدرس “00403011” فراخوانی می شود.

در دیباگر کلید میانبر CTRL+G رو وارد میکنیم و به آدرس 00403011 می رویم.

بر روی AND EAX, 694D0073 کلیک راست می کنیم و گزینه Assemble را انتخاب می کنیم .

%s ' i %15s را جایگزین و در تابع “buf مقدار String ورودی را کنترل و جلوگیری از Buffer Overflow می کنیم.


کد “AND EAX, 694D0073” را با کد “AND EAX, 733531”جایگزین می کنیم.

بله تمام کار همین بود ! قسمت اسیب پذیر برنامه را اصلاح کردیم. برای ذخیره کردن برنامه مورد نظر را با اصلاحات اعمال شده روی کد های تصحیح شده کلیک راست می کنیم و گزینه “Copy to executable> Selection” را کلیک می کنیم.

یک تست می کنیم تا مطمئن شویم تمام اعمال برای کنترل overflow را درست انجام داده ایم. با IDA به کد های جدید نگاهی می کنیم !