Yas*_*Agl 7 ubuntu x86 stack segmentation-fault
当您尝试覆盖$esp指针时,是否有任何人遇到以下问题?
当然尝试合法的缓冲区大小始终有效!但是,当您尝试增加缓冲区大小以覆盖$esp并且您设法成功触摸它的第一个字节,第二个字节或第三个字节时,$esp它可以正常工作.但是,一旦你试图覆盖它的整个4个字节,$esp它就会完全改变它的内容以及地址.它不再显示41s,因为我使用"A"来填充缓冲区.我附上了一个屏幕截图,可能会更详细地解释.谢谢大家.
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

这与在32位非PAE Ubuntu内核中实现NX仿真以及引发CPU异常有关.对于NX仿真线下方的内存区域(即"在仿真的NX区域内":从地址0到程序文本段的末尾 - 小于此二进制文件的0x08049000结束地址/proc/$pid/maps),在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
Run Code Online (Sandbox Code Playgroud)
您还可以看到dmesg输出中报告故障的方式不同.这是与"508"尝试相关的输出:
[ 585.913896] a.out[1528] general protection ip:8048454 sp:bff1e8ec error:0 in a.out[8048000+1000]
Run Code Online (Sandbox Code Playgroud)
这是"507":
[ 598.999760] a.out[1531]: segfault at 414141 ip 00414141 sp bfcac2c0 error 4 in libc-2.13.so[5e7000+178000]
Run Code Online (Sandbox Code Playgroud)
如果您在安装了PAE内核的情况下启动sudo apt-get install linux-image-$(uname -r)-pae,并且您有一个支持PAE的CPU,您将看到您期望的行为(因为NX仿真将被禁用而支持硬件NX),并且所有4次尝试都将与预期的EIP.