Valid
data[0] ─┐
data[1] │
data[2] │
data[3] ─┘
Invalid
data[10] → خارج از محدوده
به این حالت میگیم "Out-of-Bounds Read"
یعنی برنامه داره از جایی خارج از محدودهای که برای آرایه در نظر گرفته شده داده میخونه
حالا از دید Reverse Engineer
فرض کنید Crash داریم و Stack Trace اینو نشون میده
#0 process
#1 main
پس میریم داخل "process"
void process(int index) {
int data[4];
printf("%d\n", data[index]);
}
اینجا سریع دنبال الگوهایی مثل این میگردیم
array[index]
بعد باید بفهمیم "index" از کجا اومده
index
↓
Where did it come from
↓
Was it validated
↓
Was the upper bound checked
مثلا اگر قبل از دسترسی چنین بررسی ای وجود داشته باشه
if (index < 0 || index >= 4)
return;
برنامه قبل از دسترسی نامعتبر جلوی این حالت رو میگیره
ولی اگر چنین بررسیای وجود نداشته باشه
index
↓
array[index]
↓
No Bounds Check
↓
Out-of-Bounds Access
احتمال وجود باگ خیلی بیشتر میشه
هدف اصلی Crash Triage
در اخر میخوایم هزاران Crash رو تبدیل کنیم به چند مورد محدود و قابل بررسی
مثلا
1000 Crash
↓
250 Crash Groups
↓
20 Unique Crash
↓
7 Root Cause
↓
7 Bug
یعنی Fuzzer کارش اینه که کلی ورودی مختلف رو امتحان کنه و رفتارهای غیرعادی رو پیدا کنه
ولی بعدش باید بفهمیم این رفتارها دقیقا چی هستن
اینجاست که ما وارد داستان میشیم
Fuzzer
↓
Crash
↓
Crash Triage
↓
Crash Deduplication
↓
Root Cause Analysis
در واقع Fuzzer میگه
یه جای برنامه یه اتفاق عجیب افتاد
ما باید بفهمهیم
کجا
چرا
و دقیقا چه چیزی باعثش شد
این دقیقا جاییه که Fuzzing و ما به هم وصل میشیم
@reverseengine
Post #1761
65