본문 바로가기

시스템해킹/개념

Unsorted bin 공격 정리

Unsorted bin이란?

Unsorted bin은 다음에 정리할 small bin과 large bin 크기의 힙 chunk가 해제되면 이후 재할당을 위해 사용되는 bin입니다. tcache와 비교했을 때 비교적 큰 크기가 Unsorted bin에 할당되며, 한 번만 사용할 수 있습니다.

tcache와 비교한 결과를 정리하면 다음과 같습니다.

  • 0x410 미만의 크기는 tcache에 할당됨
  • 0x410 이상의 크기는 unsorted bin에 할당됨.

공격에 어떻게 활용할 수 있는가?

Unsorted bin은 free되었을 때 fd와 bk에 특정 libc 영역의 주소가 저장되어 있습니다.

이러한 특성을 이용해서 만약 코드에 OOB를 이용한 임의 주소 읽기 취약점이 존재한다면, Libc의 base 주소를 유출시킬 수 있습니다.

그러나, 그냥 무턱대고 큰 크기를 할당한다고 해서 Unsorted bin 이 할당되는 것은 아닙니다.

#include <stdio.h>
#include <stdlib.h>

int main(){
	int size;
    scanf("%d", &size);
    int *arr = (int *)malloc(size);
    free(arr);
}

 

이 코드에서 큰 크기를 할당해주고 free될 때 브레이크 포인트를 걸어보겠습니다.

분명히 free를 시켰음에도 불구하고, unsorted bin이 없는 것을 확인할 수 있습니다. 왜일까요?

그 이유는 unsorted bin이 top chunk와 병합되어서 입니다. 만약, free 시키려는 chunk 뒤에 chunk가 하나 더 존재한다면, 아마 달라질 것입니다.

다음과 같이 수정해보았습니다.

#include <stdio.h>
#include <stdlib.h>

int main(){
	int size, size2;
    scanf("%d", &size);
    scanf("%d", &size2);
    int *arr = (int *)malloc(size);
    int *arr2 = (int *)malloc(size2);
    free(arr);
}

이제 free되는 부분에 브레이크 포인트를 걸고 heap을 살펴보겠습니다.

다음과 같이 정상적으로 unsorted bin이 생성되는 것을 확인할 수 있습니다.