본문 바로가기

system/writeup

2019 codegate maris_shop

maris_shop

codegate 2019 maris_shop

파일포인터에 익숙해질겸 다시 풀어본 문제다.

 

메뉴로 구성되어있는 heap 문제로 보인다.

 

add를 하면 itemamount를 입력받고 우리의 chunk를 하나 만들어주는데 다음과 같은 형태이다.

 

(item_name이 아무리 길어도 4바이트를 안넘으므로 그냥 이렇게 정의했다. 실제론 0x80바이트)

 

일단 add에서 cart_chunk17번째 인덱스까지 입력받을 수 있다.

다른 곳에서 다 16바이트 인것처럼 chunk를 관리해서 처음엔 이게 취약점인 줄 알았는데 이거로 할만한게 없다..

 

핵심적인 취약점은 따로 있다.

 

buy에서 cart_chunk를 모두 free시켜준다.

하지만 그에 반해 밑에 for문에서 freecart_chunk14번 째 인덱스까지밖에 초기화를 안시킨다.

찾았다! uaf가 발생한다.

 

이걸로 libc leak후 쉘까지 모두 딸 수 있다.

 

libc leak은 먼저 16개의 chunk를 할당한 뒤 buy를 이용하여 15번 째 인덱스만을 남겨두고 모든 chunkcart_chunk에서 제거한다.

이 때, 할당했던 chunk들이 top chunk에 모두 병합될 것이다.

괜찮다.

 

그 후, 새롭게 15개의 chunk를 할당하는데, free를 시켜주지 않지만 chunkcart_chunk를 제거해주는 remove 함수를 사용하여 병합된 15번 째 chunk까지 쭉 할당을 하자.

 

최종적으로, 14개의 chunk를 다시 할당하면 0번 째 인덱스와 15번 째 인덱스의 chunk가 같은 주소를 가르키고 있을 것이다.

이로써 0번 째 chunkfree시킨 후, libc leak을 진행할 수 있게 되었다!

 

add 함수에서 만약 카트에 담은 물건을 또 담으려고 하면 amount를 늘릴 수 있게 해주는데, 우리의 chunk에서 amount 자리는 unsortedbinbk 자리이다.

즉, unsortedbin attack이 가능해진다.

 

이를 통해 buf_end를 덮으면, buf_base로부터 0x215만큼 입력받을 수 있고, libc arangefake_vtable을 만들어 vtable check를 우회하며 one_gadget으로 쉘을 따면 된다 ~_~

 


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

2019 hitcon lazyhouse  (0) 2019.11.06
2019 hitcon trick_or_treat  (0) 2019.11.04
2019 hack.lu no_risc_no_future  (0) 2019.11.03
2019 hack.lu tcalc  (0) 2019.11.01
2018 hctf babyprintf_ver2  (0) 2019.10.29