Working, tested code for every chapter of the book The Art of Exploit Development: Vulnerability Research and Exploitation on Today's Hardened Systems.
https://github.com/KazamaDono/taoxd
Post #1807
150
RE @reverseengine
Showing posts older than #1808 · Back to latest
ReverseEngineering بخش سی و یکم بافر اور فلو Root Cause Analysis پیدا کردن علت واقعی Crash توی قسمت قبل یاد گرفتیم وقتی Fuzzer کلی Crash پیدا میکنه چطور اونها رو دستهبندی کنیم حالا میخوایم یک مرحله عمیقتر بشیم این بار فقط نمیخوایم بدونیم برنامه کجا Crash کرده میخوایم…
ReverseEngineering بخش سی و یکم بافر اور فلو Root Cause Analysis پیدا کردن علت واقعی Crash توی قسمت قبل یاد گرفتیم وقتی Fuzzer کلی Crash پیدا میکنه چطور اونها رو دستهبندی کنیم حالا میخوایم یک مرحله عمیقتر بشیم این بار فقط نمیخوایم بدونیم برنامه کجا Crash کرده میخوایم…
Part 31 Buffer Overflow
بخش سی و یکم بافر اور فلو
پیدا کردن دستور مشکل دار
فرض کنید Debugger این دستور رو نشون بده
mov eax,[rcx]
و دقیقاً همینجا برنامه Crash کنه
اینجا اولین سوال اینه
RCX چه مقداری داشته
مثلا
RCX = 0x0000000000000000
خب اینجا برنامه عملا داره از آدرس صفر چیزی بخونه پس مسیر میتونه این شکلی باشه
mov eax,[rcx]
↓
RCX = 0
↓
Invalid Memory Access
↓
Crash
ولی هنوز علت اصلی رو پیدا نکردیم
باید بفهمیم
RCX چرا صفر شده
بررسی Register ها
بعد از Crash وضعیت Registerها رو بررسی میکنیم
مثلا:
RAX = 0x00000001
RBX = 0x00000000
RCX = 0x00000000
RDX = 0x00000020
RIP = 0x401234
اینجا RIP به ما میگه CPU موقع Crash تقریبا کجا بوده
و RCX هم میتونه اطلاعات مهمی درباره آدرسی که قرار بوده استفاده بشه بده
ولی سوال اصلی هنوز همونه
RCX
↓
از کجا اومده
برگردیم عقب
فرض کنید قبل از Crash این دستورات رو داریم
mov rcx,[rbp-20h]
mov eax,[rcx]
پس RCX از اینجا مقدار گرفته
mov rcx,[rbp-20h]
حالا باید یک مرحله دیگه عقب بریم
و ببینیم
[rbp-20h]
چطور مقدار گرفته
مثلا ممکنه قبلتر چیزی شبیه این داشته باشیم
mov [rbp-20h], rdi
حالا میپرسیم
RDI از کجا اومده
و همینطور عقب میریم
Crash
↓
RCX
↓
[rbp-20h]
↓
RDI
↓
Function Argument
↓
Input
اینجا کمکم داریم به منشا مشکل نزدیک میشیم
مسیر کلی تحلیل
این مسیریه که موقع Root Cause Analysis زیاد باهاش کار میکنیم
Crash
↓
Faulting Instruction
↓
Register / Memory
↓
Previous Instruction
↓
Data Origin
↓
Root Cause
یعنی فقط به آخرین دستور نگاه نمیکنیم
دنبال این میگردیم که این وضعیت چطور به وجود اومده
اینجاست که Reverse Engineering واقعا خودش رو نشون میده
یک مثال ساده:
فرض کنید کد اینه
C
void process(char *input)
{
char buffer[8];
strcpy(buffer, input);
printf("%s", buffer);
}
حالا فرض کنید ورودی خیلی بزرگ باشه
input
↓
strcpy
↓
buffer
↓
Stack Corruption
↓
Crashprintf Crash کنهstrcpy بیشتر از ظرفیت buffer داده نوشتهNULL برگردونده ولی برنامه بدون بررسی اون رو استفاده کرده پس خود mov rax,[rbx] فقط جاییه که مشکل خودش رو نشون داده نه لزواما جایی که مشکل ایجاد شدهReverseEngineering Taint Analysis دنبال کردن یک داده در کل برنامه تا اینجا با Forward Slicing و Backward Slicing یاد گرفتیم چطور مسیر داده رو پیدا کنیم حالا یه قدم جلوتر میریم Taint Analysis یعنی یه داده مشخص رو علامت گذاری کنیم و بعد ببینیم این داده توی ادامه برنامه کجاها…
input is tainted.ReverseEngineering Taint Analysis دنبال کردن یک داده در کل برنامه تا اینجا با Forward Slicing و Backward Slicing یاد گرفتیم چطور مسیر داده رو پیدا کنیم حالا یه قدم جلوتر میریم Taint Analysis یعنی یه داده مشخص رو علامت گذاری کنیم و بعد ببینیم این داده توی ادامه برنامه کجاها…
input to be "Tainted"—x is also considered Tainted.y is also influenced by the initial input.temp remains "Clean."input.data as the starting pointx did not come from input:int input = get_input();
input رو Tainted در نظر میگیریمx هم Tainted حساب میشهy هم تحت تاثیر ورودی اولیه قرار گرفتهinput رو Tainted میکنیمtemp همچنان Clean هستinput نداریمdata رو نقطه شروع قرار بدیمx از Input نیومدهinput رو Tainted کردیمReverseEngineering Trap و ورود از User Mode به Kernel Mode تا اینجا فهمیدیم برنامه ها توی User Mode اجرا میشن و وقتی بخوان از سیستم عامل یه کار حساس بخوان از System Call استفاده میکنن ولی یه سوال مهم داریم CPU دقیقا چطوری از اجرای عادی برنامه توی User Mode میره داخل Kernel…
ReverseEngineering Trap و ورود از User Mode به Kernel Mode تا اینجا فهمیدیم برنامه ها توی User Mode اجرا میشن و وقتی بخوان از سیستم عامل یه کار حساس بخوان از System Call استفاده میکنن ولی یه سوال مهم داریم CPU دقیقا چطوری از اجرای عادی برنامه توی User Mode میره داخل Kernel…