Fedora 32 位缓冲区溢出测试未更改 $eip 寄存器值
Buffer Overflow Test on Fedora 32-bit not changing $eip register value
我正在尝试在 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没有修改成功
我已经阅读了具有相同问题的其他问题,但是 none 的解决方案对我有用。
您知道如何进行这项工作吗?
一个可能的结果是副本覆盖调用 main 之前堆栈上的任何内容。您正在检查寄存器。而不是从 EPB 指向的地方检查堆栈。
EIP 是指令指针寄存器,所以我不明白您为什么认为它会以某种有趣的方式发生变化。请注意,机器指令不在 x86 中的堆栈中。此外,无法保证 return 地址在堆栈上,因此如果您想要的话,您不一定会通过溢出写入来修改它。
如果你想修改EIP你需要修改一些函数指针什么的。通过buffer添加一个函数指针,然后在main的末尾调用,看看是否溢出写函数指针修改了EIP。
好吧,我想我终于弄清楚出了什么问题。我正在 Linux 的 Fedore 9 上尝试缓冲区溢出测试。我尝试了所有修改但没有任何效果。
所以我将 OS 更改为 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
就可以进行测试。
我正在尝试在 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没有修改成功
我已经阅读了具有相同问题的其他问题,但是 none 的解决方案对我有用。 您知道如何进行这项工作吗?
一个可能的结果是副本覆盖调用 main 之前堆栈上的任何内容。您正在检查寄存器。而不是从 EPB 指向的地方检查堆栈。
EIP 是指令指针寄存器,所以我不明白您为什么认为它会以某种有趣的方式发生变化。请注意,机器指令不在 x86 中的堆栈中。此外,无法保证 return 地址在堆栈上,因此如果您想要的话,您不一定会通过溢出写入来修改它。
如果你想修改EIP你需要修改一些函数指针什么的。通过buffer添加一个函数指针,然后在main的末尾调用,看看是否溢出写函数指针修改了EIP。
好吧,我想我终于弄清楚出了什么问题。我正在 Linux 的 Fedore 9 上尝试缓冲区溢出测试。我尝试了所有修改但没有任何效果。
所以我将 OS 更改为 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
就可以进行测试。