首页 > 解决方案 > 为什么设置断点并运行失败(第 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上放置中断并试图运行它。在此处输入图像描述

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

标签: gdbvirtual-machinebuffer-overflowkali-linux

解决方案


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

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

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


推荐阅读