linux - 通过 GDB 运行程序时函数位置是否改变?

标签 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,Kernel 3.14,我关闭了 ASLR,我正在使用 execstack 来允许可执行堆栈。我做错了什么吗?

更新:

在黑暗中我试图通过移动地址来找到正确的指令,0x0804849b 成功了。为什么这与 GDB 显示的不同。运行GDB时,0x0804849a是前导指令push ebp所在位置,0x0804849b是前导指令mov ebp,esp

最佳答案

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

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

关于linux - 通过 GDB 运行程序时函数位置是否改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28565797/

相关文章:

android - 如何在 Android 上使用 GDB 运行 Dalvik 可执行文件?

c++ - GDB 回溯未显示正确信息

arrays - 如何处理 nodejs 中的数组缓冲区分配失败?

java - Linux 上 64 位架构的 JNI 库名称

assembly - 二元炸弹 - 第 2 阶段

java - TCP如何在Java中发送/接收实时大数据包?

c++ - 从 float 组创建缓冲区

node.js - fs.readFile().toString 以空字符串终止

c - 使用 strcpy 的 64 位缓冲区溢出

linux - xmlstarlet,根据子标签在XML中找到一个标题