Fedora 32位上的缓冲区溢出测试未更改$ eip寄存器值

时间:2019-04-21 16:10:58

标签: c gdb fedora cpu-registers buffer-overflow

我正在尝试在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尚未成功修改。

我已经阅读了具有相同问题的其他问题,但是没有一种解决方案适合我。 您知道如何进行这项工作吗?

2 个答案:

答案 0 :(得分:0)

一个可能的结果是,副本将覆盖在调用main之前堆栈中所有内容。您正在检查寄存器。而是从EPB指向的位置检查堆栈。

EIP是指令指针寄存器,所以我不明白为什么您会认为它会以某种有趣的方式改变。请注意,x86中的堆栈上没有机器指令。同样,也不能保证返回地址在堆栈上,因此如果您需要的话,就不必通过溢出写来修改它。

如果要修改EIP,则需要修改一些功能指针或其他内容。通过缓冲区添加一个函数指针,然后在main的末尾调用它,看看是否通过溢出覆盖函数指针来修改EIP。

答案 1 :(得分:0)

好的,我想我终于弄明白了出什么问题了。我曾尝试在Linux的Fedore 9上进行缓冲区溢出测试。我尝试了所有修改,但无济于事。

因此,我将操作系统更改为Ubuntu 12.04,并且测试正常进行。 通过执行./boftest `perl -e 'print "A" x 200'`$eip寄存器值被覆盖为0x41414141,其中0x41是'A'字符的十六进制值,这意味着缓冲区溢出测试有效。 / p>

我认为问题出在Fedora OS上,也许它提供了我不知道的其他级别的防止缓冲区溢出的保护,而ubuntu 12.04版本却没有。我只需要命令echo 0 > /proc/sys/kernel/randomize_va_space就可以进行测试。