-1

我阅读了 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上放置中断并试图运行它。在此处输入图像描述

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

4

1 回答 1

0

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

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

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

于 2019-08-21T14:39:07.130 回答