我正在尝试进行缓冲区溢出练习,这是代码:
#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)。
第二步:找到 的内存位置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
。