이번에 hitcon 문제를 풀면서 이 기법을 사용해봤는데 헷갈리는 점이 많았어서 정리한다.
이 기법을 설명하기 이전에 병합이 언제 일어나는지 알아야 한다.
내가 여태까지 알기로는 병합은 두 경우에서 일어난다.
- inuse_bit flag가 존재하지 않는 chunk를 free했을 때 prev chunk와 consolidate
- large bin range chunk를 할당했을 때 fastbin chunk와 인접해 있는 경우
fastbin dup consolidate는 large bin range chunk를 할당했을 때 fastbin chunk와 인접해있지 않은 경우 fastbin chunk를 smallbin chunk로 이동시키는 것을 이용한 기법이다.
xxxxxxxxxx
int main() {
void* p1 = malloc(0x40);
void* p2 = malloc(0x40);
free(p1);
void* p3 = malloc(0x400);
free(p1);
fprintf(stderr, "Now p1 is in unsorted bin and fast bin. So we'will get it twice: %p %p\n", malloc(0x40), malloc(0x40));
}
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 |