1) prev_inuse 비트가 해제된 청크를 해제(free) 시 prevChunk와 병합 또는
prev_inuse 비트가 해제된 청크 앞으로 두 번째 청크가 해제됐을 때 그 뒤 청크와 병합
2) largeChunk 할당(malloc) 시 fastbinChunk와 인접해있는 경우 fastbinChunk와 병합
- 청크 병합 시 발생하는 취약점
- largeChunk를 할당했을 때 fastbinChunk와 인접해있지 않은 경우 fastbinChunk가 smallbin으로 이동하는 것을 이용한 기법
fastbin에서 해제되고 fastbinsY[i]에 있던 경우 bins[i+1]에 들어간다.
이후 다음 fastChunk의 prev_inuse 비트가 해제된다.
- fastChunk 2개 malloc
- 첫 번째 chunk free
- largeChunk 1개 할당
- 첫 번째 chunk free (DFB, double free bug)
- fastChunk 2개 재할당
#bp1 : fastChunk 두 개 할당
fastChunk 두 개 할당된 후 heap 영역 상태. size에서 헤더(0x10) + 데이터(0x20) + prev_inuse 비트(0x1) = 0x31 바이트로 적혀있는 것 확인 가능
# bp2 : 첫 번째 fastChunk 해제(free)
fastbin에 해제된 청크의 주소가 등록된다.
# bp3 : largeChunk 할당
largeChunk 할당 시 fastbinChunk가 largeChunk와 인접해있지 않으므로 fastbinChunk는 smallbin에 등록된다.
bins를 확인해보면 해제된 chunk의 주소가 bins에 등록되어있다.
# 첫 번째 다시 chunk 해제 - double free bug
fastbin에 첫 번째 chunk가 없는 상태에서 첫 번째 chunk를 또 해제, 즉 DFB(Double Free bug) 한다.
이때 해제된 주소는 fastbin과 smallbin에 둘다 등록된다.
이것이 fastbin_dup_consolidate의 핵심.
# 첫 번째 chunk 재할당
현재 fastbin과 smallbin에 둘다 등록되어 있는데, 첫 번째 재할당 시 fastbin에서 할당해준다.
stbin과 smallbin에 동일한 주소가 적히는 상황에서 처음 fastchunk 재할당 시 fastbin에 등록된 chunk를 할당해준다.
근데 이 할당받은 주소는 현재 smallbin에 등록되어 있다.
즉, fastbin chunk이지만 smallbin에 등록되어 있어서 smallbin chunk 크기로 사용할 수 있다.
아직 해당 chunk는 smallbin에서 관리되는 상태이기 때문에 nextChunk에 prev_size가 들어있고 prev_inuse 비트가 제거되어 있다.
prev_size만 수정 가능하면 두 번째 chunk를 free해서 fastbin(smallbin)과 병합을 일으키면 unsafe_unlink를 발생시킬 수 있다.
# 두 번째 chunk 재할당
두 번째 chunk 재할당 시 smallbin에서 할당해준다.
할당받은 청크의 bk에 등록되었던 smallbin의 arena 주소가 적힌다.
[Heap exploitation] Unsorted Bin Attack (0) | 2020.01.09 |
---|---|
[Heap Exploitation] unsafe unlink (0) | 2020.01.05 |
[Heap Exploitation] fastbin_dup_into_stack (0) | 2019.11.25 |
[Heap Exploitation] fast_dup (0) | 2019.11.25 |
[Heap Exploitation] Use-After-Free (UAF) (0) | 2019.11.25 |