상세 컨텐츠

본문 제목

[Heap Exploitation] fastbin_dup_consolidate

SYSTEM HACKING/Exploit Tech

by koharin 2020. 1. 1. 16:47

본문

728x90
반응형

1. heap에서 병합이 일어나는 경우

 

1) prev_inuse 비트가 해제된 청크를 해제(free) 시 prevChunk와 병합 또는

     prev_inuse 비트가 해제된 청크 앞으로 두 번째 청크가 해제됐을 때 그 뒤 청크와 병합

 

2) largeChunk 할당(malloc) 시 fastbinChunk와 인접해있는 경우 fastbinChunk와 병합

 

2. fastbin_dup_consolidate

 

- 청크 병합 시 발생하는 취약점

- largeChunk를 할당했을 때 fastbinChunk와 인접해있지 않은 경우 fastbinChunk가 smallbin으로 이동하는 것을 이용한 기법

 

fastbin에서 해제되고 fastbinsY[i]에 있던 경우 bins[i+1]에 들어간다.

이후 다음 fastChunk의 prev_inuse 비트가 해제된다.

 

3. example 

1) example code

 

- fastChunk 2개 malloc

- 첫 번째 chunk free

- largeChunk 1개 할당

- 첫 번째 chunk free (DFB, double free bug)

- fastChunk 2개 재할당

 

2) disassamble

 

#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 주소가 적힌다.

 

 

728x90
반응형

관련글 더보기