【问题标题】:Why setting breakpoints and running it fail (Chapter 2 shellcoder's handbook)为什么设置断点并运行失败(第 2 章 shellcoder 手册)
【发布时间】:2019-12-26 08:26:40
【问题描述】:

我阅读了 shellcoder 的手册并尝试尝试书中提供的问题。然而,鉴于这本书是十多年前写的,很难跟上。我遇到的问题之一是在我反汇编正在使用它的函数后,在调用 gets 和 printf 时设置断点。每当我设置断点并运行它时,我的程序就会停止。我很想知道为什么。这是第 2 章的赋值,涉及处理堆栈上溢出缓冲区的特定部分。我在 64 位 Kali Lix vim 上运行我的代码。这是源代码

#include <stdio.h>

void return_input (void){
    char array[30];

    gets(array);
    printf("%s\n", array);
}

main(){
    return_input();
    return 0;
}

我用这些标志编译了代码 cc -m32 -mpreferred-stack-boundary=2 -ggdb -fmax-errors=1 -w overflow.c -o overflow,当我反汇编它时它给了我这个,把中断获取并打印并尝试运行它。

就像我说的,我更感兴趣的是为什么我无法让程序运行到断点。

【问题讨论】:

  • 这可能无法解决您的问题,但无论如何都是一个好主意:创建main 函数时,始终使用int main()。查看this question 的答案以了解更多信息。
  • 请不要显示文字图片。改为显示 GDB 会话的文本。
  • 您是在询问输出中Stopped 的原因(为什么gdb 会自行停止)?

标签: gdb virtual-machine buffer-overflow kali-linux


【解决方案1】:

问题是你在错误的地址上设置了断点,因为你在重新定位之前已经反汇编了二进制文件,并且你有一个与位置无关的可执行文件。

位置无关的可执行文件不会在链接地址(通常为 0)处运行,而是重新定位到随机地址。

再次重新构建您的二进制文件,添加-fno-pie -no-pie 标志。这将构建一个位置相关的可执行文件,其地址类似于0x08049152。这个二进制文件实际上会在它链接的地址处运行,并且你的断点会起作用。

【讨论】:

  • 嘿,可以解释一下“在重新定位之前将二进制文件反汇编,并且您有一个与位置无关的可执行文件”我不明白。 -fno-pie -no-pie 还有什么作用?
  • 1) 首先不是无助的好奇。 2) 无论如何,我最终还是会这样做,而且使用搜索引擎并不是所有生活问题的全部。最后,3),像编译器标志这样的东西要么太具体以至于搜索引擎无法使用,要么阅读文档,在这种情况下,gcc 的手册页变得非常深奥,你最终会迷路
  • “最终我还是要这么做”——好吧,你还在等什么?答案已更新。
猜你喜欢
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多