본문 바로가기

system/writeup

2019 hack.lu tcalc

TCalc

hack.lu 2019 TCalc

숫자를 입력하고, 평균을 출력하며, 숫자를 삭제하는 3가지 메뉴가 존재한다.

 

이 문제의 특이한 점은 2.30 glibc를 이용했다는 점과, code를 제공했다는 점이다.

 

code 리뷰를 진행해보면, 취약점을 찾기가 힘든데, ida로 보면 다음 코드가 아래와 같이 바뀌어 있다.

어떻게 이런 일이 가능한 것일까?

이는 S1R1US https://www.s1r1us.ninja/2019/10/hacklu-ctf-2019-writeups.html#tcalc를 참고하였다.

c style languager에서는 0 <= idx < ARR_LEN과 같은 문법은 허용되지 않는다.

이는 컴파일러에서 (0 <= idx) < ARR_LEN으로 인식되며, 이는 항상 참인 구문이 되므로 컴파일러 최적화에 의해 삭제된 것이다.

gdb로 해당 코드를 disassemble 한 결과도 동일하게 삭제되어 있음을 알 수 있다.

 

이와 같은 security 구문은 print average, delete number 두 함수에 포함되어 있으므로, 이 구문이 삭제됨으로써 oob가 발생한다!

 

또한, calloc으로 힙을 할당하므로 tcache를 다시 할당 받을 수 없음을 주의하자.

 

그럼, heap leak을 시작해보자^^!

 

number chunknum of number, num arr으로 이루어져 있으므로, num of numbernum arr의 크기보다 크게 잡아주면 dataleak할 수 있는데, fd를 맞춰주고 leak을 하려고 보면 너무나도 커서 오류가 뜬다.

 

이를 우회하기 위해 freefastbin을 이용하여 leak을 진행하면 된다.

그러면 print_average는 다음과 같이 작동할 것이다.

 

num of number자리에는 previous chunk에서 입력이 가능하므로 이를 통해 leak을 진행하자!

libc leakunsorted bin을 통해 비슷하게 진행할 수 있다.

 

이를 통해 heap, libc를 모두 leak하고 나면 heap에서 oob free가 가능하므로 chunkoverlapping하여 fd__malloc_hook으로 조작하고, system을 써넣은 뒤 system("/bin/sh")를 실행시키면 쉘을 얻을 수 있다!

 


'system > writeup' 카테고리의 다른 글

2019 codegate maris_shop  (0) 2019.11.03
2019 hack.lu no_risc_no_future  (0) 2019.11.03
2018 hctf babyprintf_ver2  (0) 2019.10.29
2019 seccon monoid_operator  (0) 2019.10.27
holyshield 2019 masked_calculator  (0) 2019.10.27