无法通过修改EIP寄存器执行系统功能

问题描述 投票:0回答:1

我目前正在练习缓冲区溢出和逆向工程。我的代码包含一个未使用的函数。我的意图是通过修改EIP寄存器来调用未使用的功能。但是,当我这样做时,程序将启动一个进程并退出。该函数似乎已被调用,但未按预期创建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中获得了如下“ helper”函数的地址

Address of helper Function (image)

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

Reversed Text to call the helper function (image)

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

Program starts a process and exits (image)

我该如何修复?

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

Pattern Tools in peda (image)

EXE文件在gcc编译器上使用-m32标志在64位OS上构建为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)
gdb reverse-engineering buffer-overflow shellcode eip
1个回答
0
投票

我在gdb中获得了如下“ helper”函数的地址

您获得的地址:0x565561b9表示您编译了一个position independent executable,每次运行时都会将其加载到另一个地址(GDB除外,因为GDB禁用了地址随机化)。

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

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

一旦完成该工作,您将需要弄清楚如何使其在启用ASLR的情况下起作用(ASLR旨在使这种攻击更加困难)。

© www.soinside.com 2019 - 2024. All rights reserved.