0

我目前正在练习缓冲区溢出和逆向工程。我的代码包含一个未使用的函数。我的意图是通过修改 EIP Register 来调用未使用的函数。但是当我这样做时,程序启动了一个进程并退出。函数似乎被调用了,但 txt 文件没有按预期创建。

我的代码:

#include <stdio.h>
#include <unistd.h>

int helper(){
    system("touch pwn.txt");
}

int overflow() {
    char buffer[500];
    int userinput;
    userinput = read(0, buffer, 700);
    printf("\nUser provided %d bytes. Buffer content is: %s\n", userinput, buffer);
    return 0;
}

int main(int argc, char *argv[]) {
    overflow();
    return 0;
}

我用 gdb 得到了“帮助”函数的地址,如下所示

辅助函数地址(图片)

如图所示,我将其反转以将其发送到缓冲区中。

反转文本以调用辅助函数(图像)

运行时,程序启动一个进程并退出。没有按预期创建 txt 文件。

程序启动一个进程并退出(图片)

伙计们,我该如何解决?

注意:我在 peda 工具中找到了使用模式模块修改 EIP 寄存器的偏移量。

peda 中的模式工具(图片)

EXE 文件在 64 位操作系统上使用 -m32 标志和 gcc 编译器构建为 32 位可执行文件。

OS : PRETTY_NAME="Kali GNU/Linux Rolling"
     NAME="Kali GNU/Linux"
     ID=kali
     VERSION="2020.2"
     VERSION_ID="2020.2"
     VERSION_CODENAME="kali-rolling"
     ID_LIKE=debian

GCC : gcc version 9.3.0 (Debian 9.3.0-10)
4

1 回答 1

0

我用 gdb 得到了“帮助”函数的地址,如下所示

你得到的地址:0x565561b9表示你编译了一个与位置无关的可执行文件,它每次运行时都会加载到不同的地址(GDB 下除外,因为 GDB 禁用了地址随机化)。

作为第一步,您应该使用-fno-pie -no-pie标志重建可执行文件,并在禁用 ASLR 的情况下运行它(就像它在 GDB 下运行一样):

setarch `uname -m` -R /root/vulnerable

一旦你开始工作,你就需要弄清楚如何让它在启用 ASLR 的情况下工作(ASLR 旨在使这种攻击更加困难)。

于 2020-04-29T14:43:18.580 回答