2012-04-06 77 views
7

當您嘗試覆蓋$esp指針時,您有沒有遇到以下問題?Ubuntu 11.10上的Smashing Stack

當然,嘗試一個合法的緩衝區大小始終有效!但是,當您嘗試增加緩衝區大小以覆蓋$esp,並且設法成功觸摸$esp的第一個字節,第二個字節或第三個字節時,它可以很好地工作。但是,只要您嘗試覆蓋$esp的整個4個字節,它就會完全改變它的內容以及地址。它不再顯示41 s,因爲我使用「A」填充緩衝區。我附上了一個屏幕截圖,也許它會解釋更多細節。謝謝大家。

#include <stdio.h> 
#include <string.h> 
int main(int argc, char** argv) 
{ 
    char buffer[500]; 
    strcpy(buffer, argv[1]); 
    return 0; 
} 

smash attempt

回答

5

這涉及到的NX emulation在32位非PAE Ubuntu的內核的執行,並在CPU異常。對於NX仿真線以下的內存區域(例如,在仿真NX區域內:從地址0到程序文本段的末尾 - 小於/proc/$pid/maps中此二進制的0x08049000結束地址),段錯誤在EIP已落在實際的無效地址上。對於線路上方的地址,通過不同的路徑觸發故障,報告故障而不將EIP向前移動到故障地址,而是停留在導致故障的「ret」指令上。

你可以在gdb看到:

(gdb) x/1i $pc 
=> 0x8048454 <main+64>: ret  
(gdb) info reg esp 
esp   0xbffff54c  0xbffff54c 
(gdb) x/wx $esp 
0xbffff54c:  0x41414141 

您還可以看到故障如何dmesg輸出中報告的差異。這與「508」的嘗試相關的輸出:

[ 585.913896] a.out[1528] general protection ip:8048454 sp:bff1e8ec error:0 in a.out[8048000+1000] 

這是「507」:

[ 598.999760] a.out[1531]: segfault at 414141 ip 00414141 sp bfcac2c0 error 4 in libc-2.13.so[5e7000+178000] 

如果您安裝,sudo apt-get install linux-image-$(uname -r)-pae PAE內核啓動,和你有一個PAE您將看到您期望的行爲(因爲NX仿真將被禁用,以支持硬件NX),並且所有4次嘗試都會按照預期的EIP進行段錯誤。