본문 바로가기

system/writeup

trustctf 2019 abyss

abyss

trustctf 2019 abyss

푸는데 가장 오래 걸렸던 문제이다.

잠수하는 힙문제기도 하고 내가 약한 언솔빈이기도 해서..

어쨋든 취약점을 설명하자면

 

맨 처음에 heap 주소를 준다.

 

message 함수에서 chunknbytes만큼 입력받는데, 그 계산을 자신의 size에서 뒷 청크의 size와 1을 빼서 계산한다.

 

즉, nbytes가 음수가 되어 heap overflow가 발생할 수 있다는 것이다.

 

또, dive 함수에서 malloc을 해주는데, deep 변수에 음수 값을 넣을 수 있다.

근데 음수 값을 넣으면 dive 함수에서 malloc이 실행되지 않는다.

 

하지만 main 함수에서 calloc으로 다시 할당해주기 때문에 음수 값으로 chunk 전역변수 뒷부분에 주소값을 저장시킬 수 있다.

 

이를 통해 전역 변수쪽에서 size가 작은 곳을 찾아 heap overflow를 일으키고 뒷부분의 chunkfree시켜 libcleak할 수 있다.

 

여기서 다시 한번 heap overflow를 일으켜서 unsorted bin attack을 트리거하여 _IO_list_all 변수를 덮는다.

 

unsorted binsize0x61으로 변경시켜주고, heapfake _IO_FILE structfake _wide_data struct를 만들어준 후 _IO_OVERFLOW 부분을 system으로 덮어 malloc 후 쉘을 얻으면 된다.

 

사실 이 문제의 인텐디드는 house of force라고 한다. 나는 아직 이 기법을 몰라서 이렇게 풀었는데 나중에 공부해봐야겠다.

 


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

hackingcamp 2019 secret note  (6) 2019.02.19
hackingcamp 2019 can you get shell?  (0) 2019.02.19
trustctf 2019 start  (2) 2019.02.15
trustctf 2019 로꾸꺼  (3) 2019.02.15
hitcon 2016 house of orange  (0) 2019.02.13