본문 바로가기

system/material

fastbin dup consolidate 정리

fastbin_dup_consolidate 정리

이번에 hitcon 문제를 풀면서 이 기법을 사용해봤는데 헷갈리는 점이 많았어서 정리한다.

 

이 기법을 설명하기 이전에 병합이 언제 일어나는지 알아야 한다.

내가 여태까지 알기로는 병합은 두 경우에서 일어난다.

 

  1. inuse_bit flag가 존재하지 않는 chunk를 free했을 때 prev chunk와 consolidate
  2. large bin range chunk를 할당했을 때 fastbin chunk와 인접해 있는 경우

 

fastbin dup consolidate는 large bin range chunk를 할당했을 때 fastbin chunk와 인접해있지 않은 경우 fastbin chunk를 smallbin chunk로 이동시키는 것을 이용한 기법이다.

 

how2heap glibc_2.25에서 가져온 코드이다.

https://github.com/shellphish/how2heap

 

위 코드와 같은 상황이 발생하면동일한 주소가 fastbin, smallbin에 존재하게 되어 fastbin dup을 일으킬 수 있다.

나는 처음에 이렇게만 사용하는 기법이라고 생각하고 있었는데 아니었다. 이 기법의 이름은 fastbin dup consolidate이다. 한 가지 상황을 더 생각해 보자.

 

fastbin과 smallbin에 동일한 주소가 들어있는 상황이라고 쳐보자. 여기서 동일한 크기로 malloc을 한 번 실행하면 fastbin의 chunk를 할당받을 것이다.

그렇다면 현재 할당받은 주소는 smallbin에 존재하고 있다. 즉, fastbin range chunk로 smallbin range chunk를 사용할 수 있는 것이다.

 

아직 해당 chunk는 smallbin_freed 상태이기 때문에 next chunk에 prev_size가 들어 있고 inuse_bit가 제거되어 있을 것이다.

 

즉, prev_size만 수정이 가능하다면 두 번째 chunk를 free함으로써 fastbin(smallbin)과 병합을 일으켜 unsafe_unlink를 trigger할 수 있다.


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

dynamic, static, pie..  (0) 2019.01.24
c++ std::string  (0) 2019.01.22
x86, x64 srop 정리  (0) 2019.01.21
glibc 2.26 tcache 동작 분석 및 exploit (how2heap)  (2) 2019.01.15
got_overwrite stack_smashing_detected  (0) 2019.01.12