1

我正在尝试进行缓冲区溢出练习,这是代码:

#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 ebp0x0804849b 是前奏指令的位置mov ebp,esp

4

1 回答 1

2

gdb 不会做任何事情来改变它执行的程序中函数的位置。ASLR 可能很重要,但默认情况下 gdb 将其关闭以启用更简单的调试。

很难说为什么你会看到你的结果。反汇编 gdb 中的函数显示什么?

于 2015-02-17T22:34:36.773 回答