Gdb 为什么设置断点并运行它失败(第2章shellcoder&x27;手册)

Gdb 为什么设置断点并运行它失败(第2章shellcoder&x27;手册),gdb,virtual-machine,buffer-overflow,kali-linux,Gdb,Virtual Machine,Buffer Overflow,Kali Linux,我正在阅读《炮弹编码员手册》,试图解决书中提出的问题。然而,鉴于这本书是十多年前写的,很难理解。我遇到的一个问题是,在我分解使用它的函数后,在调用get和printf时设置断点。每当我设置断点并运行它时,我的程序就会停止。我很想知道为什么。这是第2章分配,处理堆栈上溢出缓冲区的特定部分。我正在64位Kali Lix vim上运行我的代码。这是源代码 #include <stdio.h> void return_input (void){ char array[30];

我正在阅读《炮弹编码员手册》,试图解决书中提出的问题。然而,鉴于这本书是十多年前写的,很难理解。我遇到的一个问题是,在我分解使用它的函数后,在调用get和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;
}
#包括
无效返回\输入(无效){
字符数组[30];
获取(数组);
printf(“%s\n”,数组);
}
main(){
返回_输入();
返回0;
}
我用这些标志cc-m32-mprefered stack boundary=2-ggdb-fmax errors=1-w overflow.c-o overflow编译了代码,当我分解它,在gets和prinft上加上中断符并尝试运行它时,它给了我这个


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

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

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


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

这可能不会解决您的问题,但无论如何都是一个好主意:在创建
main
函数时,始终使用
int main()
。有关原因的更多信息,请查看的答案。请不要显示文本的图片。显示您的GDB会话的文本。您是否在询问输出中停止的原因(GDB为什么停止自己)?他们可以解释“在重新定位二进制文件之前已将其反汇编,并且您有一个位置独立的可执行文件”我不明白。还有-fno-pie-no-pie做什么?1)首先,不要感到无助和好奇。2) 最终我还是会这么做的,使用搜索引擎并不是解决生活中所有问题的唯一方法。最后,3),有些东西,如编译器标志,要么太具体,搜索引擎无法使用,要么阅读文档,在这种情况下,gcc的手册页变得相当深奥,以至于你最终迷失了方向“最终我还是要这么做”——那么,你还在等什么?答案已更新。