我目前正在练习缓冲区溢出和逆向工程。我的代码包含一个未使用的函数。我的意图是通过修改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寄存器的偏移量。
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中获得了如下“ helper”函数的地址
您获得的地址:0x565561b9
表示您编译了一个position independent executable,每次运行时都会将其加载到另一个地址(GDB除外,因为GDB禁用了地址随机化)。
[第一步,应使用-fno-pie -no-pie
标志重建可执行文件,并在禁用ASLR的情况下运行它(就像在GDB下运行一样:]
setarch `uname -m` -R /root/vulnerable
一旦完成该工作,您将需要弄清楚如何使其在启用ASLR的情况下起作用(ASLR旨在使这种攻击更加困难)。