通过GDB运行程序时是否更改了功能位置?

时间:2015-02-17 16:09:32

标签: linux gdb buffer overflow eip

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

#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

1 个答案:

答案 0 :(得分:2)

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

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