gdb - 为什么设置断点并运行失败(第 2 章 shellcoder 手册)
问题描述
我阅读了 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 并且当我反汇编它时它给了我这个,在gets和prinft上放置中断并试图运行它。
就像我说的,我更感兴趣的是为什么我不能让程序运行到断点。
解决方案
问题是你在错误的地址上设置了断点,因为你在重新定位之前已经反汇编了二进制文件,并且你有一个与位置无关的可执行文件。
位置无关的可执行文件不会在链接地址(通常为 0)处运行,而是重新定位到随机地址。
再次重新构建您的二进制文件,添加-fno-pie -no-pie
标志。这将构建一个位置相关的可执行文件,其地址如0x08049152
. 这个二进制文件实际上将在它链接的地址处运行,并且您的断点将起作用。
推荐阅读
- wpf - 无法更改 ItemsControl WPF 中的 z 索引
- javascript - 将变量插入导入的字符串
- javascript - 是否可以在网页中截取 iframe 的屏幕截图?
- php - 无法使用级联 xpath 查询访问指定节点
- cart - Hybris,如何使用 cartId 加载购物车
- java - 在 quarkus 应用程序中找不到骆驼推特组件
- javascript - 如何创建从一个 div 的边界到另一个 div 的语音气泡指针
- jquery - 仅选择同一行内的元素
- c++ - 如何从 CMakeLists.txt 读取变量到 cpp 文件
- c# - 使用 ExecuteSqlCommand 时限制插入/更新查询的最佳方法是什么?