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



我目前正在练习缓冲区溢出和逆向工程。我的代码包含一个未使用的函数。我的意图是通过修改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: %sn", userinput, buffer);
return 0;
}
int main(int argc, char *argv[]) {
overflow();
return 0;
}

我用gdb 得到了"helper"函数的地址,如下所示

助手功能(图像(地址

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

反向文本调用辅助函数(图像(

运行时,程序启动一个进程并退出。。没有按预期创建任何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)

我用gdb 得到了"helper"函数的地址,如下所示

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

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

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

一旦你做到了这一点,你就需要弄清楚如何在启用ASLR的情况下使其工作(ASLR旨在使这种攻击更加困难(。

相关内容

最新更新