我试图在32位Fedora上执行简单的缓冲区溢出,但是eip寄存器值没有改变
我的C代码如下:
#include <string.h>
int main(int argc, char ** argv){
char buffer[8];
strcpy(buffer, argv[1]);
}
我试过执行:
echo 0 > /proc/sys/kernel/exec-shield
echo 0 > /proc/sys/kernel/randomize_va_space
禁用任何类型的保护。以及我编译如下:
gcc -g -Wall -fno-stack-protector -z execstack -m32 boftest.c -o boftest
当我运行命令
./boftest AAAABBBBCCCCDDDD
然后使用gdb观察寄存器值;我看到:
ebp contains 0x44444444, but
eip contains 0x80483F4
这意味着$ eip尚未成功修改。
我已经阅读了同样问题的其他问题,但没有一个解决方案适合我。你知道怎么做这个工作吗?
好吧,我想我最终弄清楚出了什么问题。我正在尝试在Linux的Fedore 9上进行缓冲区溢出测试。我尝试了所有修改,但没有任何效果。
所以我将操作系统改为Ubuntu 12.04,测试工作完美。通过执行./boftest `perl -e 'print "A" x 200'`
,$eip
寄存器值被覆盖到0x41414141
,其中0x41
是'A'字符的十六进制值,这意味着缓冲区溢出测试工作。
我认为问题出在Fedora OS上,也许它提供了其他级别的防止缓冲区溢出的保护,我不知道,而ubuntu 12.04版本没有。我只需要命令echo 0 > /proc/sys/kernel/randomize_va_space
来进行测试。
一种可能的结果是,在调用main之前,副本会覆盖堆栈中的任何内容。你正在检查寄存器。而不是从EPB指向的位置检查堆栈。
EIP是指令指针寄存器,所以我不明白为什么你认为这会以某种有趣的方式改变。请注意,机器指令不在x86的堆栈中。此外,无法保证返回地址在堆栈上,因此如果您想要的话,您不必使用溢出写入来修改它。
如果要修改EIP,则需要修改某些函数指针或其他内容。通过缓冲区添加一个函数指针,然后在main的末尾调用它,看看是否通过溢出写入函数指针来修改EIP。