我有這樣的功能:堆棧中「缺失」的空間是什麼?
int vulnerableFunc(char *input)
{
char buffer[256];
memcpy(buffer, input, 1024);
return 1;
}
當我把它與2000年 「A」,並與OllyDbg的dissassemble它一個32位的Windows XP計算機上,我得到堆棧上的以下地址:
22FB6C Ret Addr |
22FB68 Old EBP | |
| 268 |
| | 264
22FA60 Buffer for Writing A | |
22FA5C ?? RETURN from ntdll.7c92755D to ntdll.7C927553 |
22FA58 1024 |
22FA54 SRC - Ptr to 22FBB0 (22FBB0 = A * 2000 (Original Arg to Func)) | 16
22FA50 DEST - Ptr to 22FA60 (Copy is Inc From 22FA60) |
22FA4C local var end (last local var 22FA50)
Q1)我只分配256個字節的局部變量,但我從「緩衝區寫入時的」 264個字節,直到「老EBP」,這是爲什麼?
Q2)什麼是 「從ntdll.7c92755D到ntdll.7C927553 RETURN」,在地址22FA5C?不應該只有12個字節的參數memcpy?
的/ GS編譯選項創建檢測棧幀的腐敗,你在這裏鍛鍊的那種棧金絲雀。/RTC還創建額外的空間來檢測錯誤。 –
我認爲Q1的答案可能是因爲的char []相同的char *,這本身是一個64位系統上的8個字節+您所分配的256個字節。再說,我不知道.. – Brandon
@ CantChooseUsernames的操作系統是32位的,對不起,早不說明 – user962460