본문 바로가기

system/writeup

hitcon 2016 house of orange

house_of_orange

2016 hitcon house of orange

일단 문제 풀이를 들어가기 전에 알게된 것들을 정리하고자 한다.

이런 상황에서 malloc(0x10)을 하게 되면

 

다음과 같은 상황이 발생한다.

물론 ubuntu 16.04 LTS glibc 2.23 기준이지만 glibc malloc에서도 데이터가 그대로 남아있을 줄은 몰랐다..

 

또, unsorted bin 혹은 small bin, large bin에서 large bin을 할당받았을 때, 할당과 동시에 그 자리에 fd, bk, fd_nextsize, bk_nextsize가 생성 된다.

왜 이러는지는 아직은 잘 모르겠다.

이런 상황에서 0x400 크기의 heap을 할당하면

 

다음과 같이 할당과 동시에 정보들이 기록된다.. free된 것도 아닌데 정말 신기하다.

 

그리고, 예전에 secretholdersleepyholder를 풀면서 top chunk보다 큰 크기를 할당하면 mmap으로 할당한다고 알고 있었는데, 얘는 mmap이 아니라 top chunkfree시키고 새로운 top chunk를 만든다.

그 이유가 궁금해서 찾아봤다.

밑에 glibc 코드를 보자.

 

glibc 2.26 #2312 ~ #2321

nb(need byte)mp_.mmap_threshold보다 크고, mmapchunk가 최대 크기를 넘지 않으면 top chunk를 늘리는 대신 mmap으로 해당 chunk를 할당한다.

 

여기서 mp_.mmap_threshold를 보면

glibc 2.26 #865 ~ #867

128 * 1024, 즉 0x20000으로 되어 있다.

때문에 이보다 낮은 크기지만, top chunk보다 크게 할당하면 top chunkfree되는 것이다.

 

문제에 대한 자세한 설명은 하지 않고 이 문제에서 쓰인 기법에 대해서 설명하도록 하겠다.

이 문제는 간단한 heap overflow이다.

하지만 free가 존재하지 않는다.

여기서 만약 top chunk(0x20fa1)top chunk(0xfa1)로 바꾼 후 0xfa1보다 큰 chunk를 할당하면?

top chunkfree시킬 수 있다.

이걸로 free가 없는 문제는 해결됐다.

그리고 이를 이용하여 libc, heapleak한 후

unsorted bin attack을 하면 되는데, _IO_list_all 변수에 attack을 할 것이다.

그 후, abort를 내서 쉘을 따는 것이다.

 

mallocabort 과정은 다음과 같다.

 

마지막 _IO_flush_all_lockp 함수의 동작을 살펴보자.

 

glibc 2.21 genops.c #695 ~ #712

fp_IO_list_all의 값을 넣고

 

fp->_mode <= 0

fp->_IO_write_ptr > fp->_IO_write_base

혹은

_IO_vtable_offset == 0

fp->_mode <= 0

fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_write_base

 

가 충족이 되면 _IO_OVERFLOW 함수를 부른다.

_IO_OVERFLOW 함수는 _IO_FILE_JUMP vtable에 속해 있는 함수로써, 이를 바꾸면 원하는 함수를 실행시킬 수 있다.

 

관련된 FILE STRUCTURE을 살펴보자.

glibc 2.23 libio.h #214 ~ #317

_IO_wide_data, _IO_FILE, _IO_FILE_complete 구조체이다.

 

여기서

위의 조건을 맞춰주도록 페이로드를 짜면 되는데, fp->_IO_write_ptrfp->_IO_write_basechunk 범위에 포함되어 변경하지 못하므로 밑의 조건을 맞춰 _IO_overflow를 실행시키자.

그럼 abort와 함께 쉘이 짜잔~

 


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

trustctf 2019 start  (2) 2019.02.15
trustctf 2019 로꾸꺼  (3) 2019.02.15
pwnable.tw babystack  (0) 2019.02.11
pwnable.tw death note  (0) 2019.02.10
pwnable.tw starbound  (0) 2019.02.10