2012-04-06 92 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进行段错误。