본문 바로가기

system/writeup

2019 hitcon lazyhouse

lazyhouse

hitcon 2019 lazyhouse

정말.. 어려운 문제였다

일단 전체적으로 흘러가는 흐름은 다음과 같다.

 

  1. mmap 셋팅 후 calloc으로 heap, libc leak
  2. unsafe unlinkoverlapping chunk
  3. house of loretcache_pertheread_struct 공격
  4. __malloc_hookleave;ret
  5. orw 이용해서 print flag (mprotect 이용해서 shellcode도 가능)

 

근데, 이 위 과정이 진짜 미쳤다..

일단 이 exploitbalsnwriteup을 설명해 놓은 https://syedfarazabrar.com/2019-10-24-hitconctf-lazyhouse-balsn-exploit-analysis/ 이 블로그를 참고했음을 알린다.

 

 

whitelist 기반으로 샌박이 걸려있다.

execve를 막아놓았다..

 

분석하면서 특이한 점들만 살펴보도록 하자.

 

 

fastbin 크기로는 할당이 불가능한데 calloc으로 heap을 할당해준다.

이 말은 즉슨 glibc 2.29인 이 환경에서 unsortedbin, smallbin을 이용하여 공격해야 한다는 말이라고 받아들이면 되겠다.

 

그리고, money 검사에서 integer overflow가 발생하므로 돈을 크게 불려줄 수 있다!

 

 

upgrade 함수에서 0x20바이트 만큼 heap overflow가 발생한다.

하지만.. upgrade2번 밖에 진행하지 못한다.

 

 

buy_super 함수에서 malloc으로 0x217바이트를 할당해준다.

여기서는 특이하게 calloc이 아닌 malloc으로 할당해 준다.

하지만 이 함수는 한 번만 부를 수 있음을 명심하자.

 

 

총합해 보면, glibc 2.29 환경에서 integer overflow, heap overflow * 2, calloc, malloc*1 이와 같은 조건으로 flag를 읽어야 한다!

 

문제를 풀면서 Angelboy의 손바닥 위에서 노는 것이 느껴질 정도로 굉장히 제한적이다.

 

일단 그럼 leak부터 스윽 따보도록 하자.

 

overflow를 한 번 사용해서 freed_largebinin_use, mmap bit를 활성화 시키고 calloc으로 할당해서 heap, libcleak할 수 있다.

그 이유는 밑의 코드에서 확인해 볼 수 있다.

 

 

이런 식으로 heaplibc leak이 가능하다.

 

 

그 후엔 unsafe unlinkoverlapping chunk를 진행하자.

 

 

위와 같이 피같은 overflow를 마지막으로 써가며 unlink check를 우회해 준다.

 

이젠, house_of_loretcache_perthread_structure를 공격해야 한다.

 

 

대충 위와 같은 방식으로 smallbinbk를 공격하여 tcache_perthread_structchain을 만들어주면 된다.

 

이를 위해서 tcache_perthread_structfake_chunk를 만들어야 하는데, 일단 완성된 fake_chunk를 보자.

 

 

여기서 0x100에 해당하는 부분은 0x3b0 size tcacheindex이다.

그리고, fd, bk에 해당하는 부분은 각각 0x20, 0x30 size tcache의 주소이다.

 

자, 여기까지 왔으면 우리는 이제 tcache_perthread_chunkcalloc으로 할당받을 수 있으니 0x220 size tcache의 주소가 있는 부분에 __malloc_hook의 주소를 넣으면 __malloc_hook을 덮어씌울 수 있다!

 

execve가 막혀있기 때문에, one_gadget은 부르지 못하고 leave;ret을 이용하여 orw를 해야 한다.

 

이 것이 가능한 이유는 밑의 사진을 보자.

 

 

calloc 내부에서 rbp를 조작할 수 있기 때문에 leave;ret을 통하여 rspheap으로 바꿔주고 orw를 진행하면 된다!!!!

 


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

2019 csaw final arevenge  (0) 2019.11.29
2019 hack.lu chat  (0) 2019.11.12
2019 hitcon trick_or_treat  (0) 2019.11.04
2019 codegate maris_shop  (0) 2019.11.03
2019 hack.lu no_risc_no_future  (0) 2019.11.03