-
fastbin_dup_consolidate - how2heapHeap exploitation/how2heap 2020. 2. 17. 21:20
Abstract
fast chunk와 large chunk를 이용한 fastbin_dup 기법이다. 이름대로 청크 병합을 할 때 발생하는 취약점인데, 힙에서 병합이 일어나는 경우는 아래 두가지가 있다.
- prev_inuse비트가 해제된 청크를 해제했을 때 prev chunk와 병합 혹은 prev_inuse 비트가 해제된 청크의 앞으로 두번째 청크가 해제했을 때 그 뒤 청크와 병합한다. (해제하는 청크의 앞 혹은 뒤 청크가 해제된 경우)
- large chunk를 할당했을 때 fastbin chunk와 인접해있는 경우 fastbin chunk와 병합한다.
위 2번째 상황에서 large chunk와 fastbin chunk가 인접해있지 않은 경우 fastbin chunk를 smallbin으로 이동한다 → fast bin에서 해제되고 fastbinsY[i]에 있던 경우 bins[2*(i+1)]에 들어가게 된다. (smallbin의 같은 인덱스) 이후 다음 fast chunk의 prev_inuse 비트가 해제된다.
Exploit Flow
- 같은 크기의 fast chunk를 두개 생성한다.
- 첫번째 힙을 해제한다.
- large chunk 사이즈의 힙을 할당한다.
- 첫번째 힙을 다시 해제한다.
- 같은 크기로 다시 두번 할당받으면 같은 주소가 반환된다.
Code
두개의 힙을 생성한 후 힙 영역의 상태이다. 이제 첫번째 힙을 해제한다.
fastbinsY[3]에 들어갔다. 이 상황에서 large chunk를 할당하면 이 청크가 smallbin으로 옮겨가면서 bins[8]에 들어가게 될 것이다.
large chunk가 생성되었고, 첫번째 힙이 smallbin에 들어간 것을 확인할 수 있다.
이제 fastbin에서 첫번째 청크가 사라졌기 때문에 다시 한번 해제할 수 있다.
첫번째 청크가 fastbin으로 들어가면서 fd가 0으로 초기화 되었기 때문에 smallbiin에서 fd가 깨졌다. 여기서 한번 malloc을 하게 되면 fastbin에서 먼저 꺼내서 할당해준다.
한번 더 할당을 하면 smallbin에서 반환해주며 할당이 끝난 뒤 smallbin은 정상적으로 복원된다.
'Heap exploitation > how2heap' 카테고리의 다른 글
House of Orange - how2heap (0) 2020.02.26 fastbin_dup_into_stack - how2heap (0) 2020.02.17 fastbin_dup - how2heap (0) 2020.02.17