این دو تا رو همیشه جدا نگه دارید
Crash
↓
چه اتفاقی افتاد
ولی
Root Cause
↓
چرا این اتفاق افتاد
مثلا:
Crash
↓
SIGSEGV
↓
Invalid Memory Access
هنوز Root Cause مشخص نیست
ممکنه بعد از بررسی بفهمیم
Input
↓
Unsafe Copy
↓
Buffer Overflow
↓
Memory Corruption
↓
Crash
اینجا دیگه علت اصلی رو پیدا کردیم
از دید Reverse Engineer:
وقتی یک Crash دارید مدام این سوالها رو از خودتون بپرسید
CPU
کجا Crash کرد
کدوم Instruction مشکلدار بود
کدوم Register یا Address درگیر بود
این مقدار از کجا اومده
چه دادهای باعث رسیدن به این وضعیت شده
اولین جایی که رفتار اشتباه ایجاد شده کجاست
آخرین سؤال از همه مهمتره
چون ممکنه Crash در یک نقطه اتفاق بیفته ولی Bug چند تابع قبلتر ایجاد شده باشه
وقتی یک Crash پیدا کردیم
مستقیم نمیگیم علت باگ رو فهمیدیم
اول محل Crash رو پیدا میکنیم
بعد Instruction مشکلدار رو بررسی میکنیم بعد Register ها و Memory رو نگاه میکنیم بعد مسیر داده رو به عقب دنبال میکنیم تا برسیم به جایی که مشکل واقعا ایجاد شده
یعنی
Crash
↓
Where
↓
How
↓
Why
↓
Root Cause
و این دقیقا تفاوت بین دیدن Crash و فهمیدن باگ هست
@reverseengine
Post #1795
67