이 기술은 glibc의 allocator의 first-fit 동작을 설명한다.
모든 청크(fastbin 제외)가 free될 때마다 unsorted bin에서 끝난다.
삽입은 리스트의 HEAD에서 일어난다. fastbin을 제외하고 새로운 청크를 요청할때, small bin이 비어있을 때 처음에 unsorted bin에서 찾는다.
이 조회는 TAIL에서 일어난다.
만약 unsorted bin에 필요한 크기의 청크가 있다면 사용하겠지만, 요청된 크기보다 큰 청크가 존재할때 두개로 분할되어 반환된다. 이렇게 하면 FIFO 구조가 된다.
char *a = malloc(300); // 0x***010
char *b = malloc(250); // 0x***150
free(a);
a = malloc(250); // 0x***010
unsorted bin에서 free와 malloc은 아래와 같이 진행된다.
1. 'a'가 free된다.
head -> a -> tail
2. 'malloc'이 요청된다.
head -> a2 -> tail ['a1' is returned]
'a' chunk는 'a1' , 'a2'로 나눠진다. 요청된 크기(250바이트)는 'a'(300바이트)보다 작아서.
이과정은 _int_malloc에서도 해당된다. 그리고 fastbin의 경우에도 마찬가지이다.
unsorted bin에서 free되는 대신에, fasbin에서 fast chunk는 끝난다. 앞에서 언급 했듯이, fastbin은 single linked list를 가지고 있어
HEAD에서 추가와 삭제가 이루어진다. 그래서 fastbin은 FILO구조를 같는다.(?)
char *a = malloc(20); // 0xe4b010
char *b = malloc(20); // 0xe4b030
char *c = malloc(20); // 0xe4b050
char *d = malloc(20); // 0xe4b070
free(a);
free(b);
free(c);
free(d);
a = malloc(20); // 0xe4b070
b = malloc(20); // 0xe4b050
c = malloc(20); // 0xe4b030
d = malloc(20); // 0xe4b010
deferred coalescing
fastbin에서의 free, malloc 진행
1. 'a'가 free됨
head -> a -> tail
2. 'b' free됨
head -> b -> a -> tail
3. 'c' free됨
head -> c -> b -> a -> tail
4. 'd' free됨
head -> d -> c -> b -> a ->tail
5. malloc 요청
d, c, b, a순으로 return됨
20byte의 작은 청크는 unsortedbin 대신에 fastbin으로 들어간다.
Use after Free Vulnerability
위의 예제에서 malloc은 이전에 사용되었고 free된 청크를 return하는 것을 알 수 있었다. 결국 free된 메모리 청크의 재사용은 취약할 수 있다. 청크가 free되면 공격자는 청크 내부의 데이터를 제어 할 수 있다는 뜻이 된다.
'Heap' 카테고리의 다른 글
10.Forging chunks (0) | 2018.06.07 |
---|---|
09.Double Free (0) | 2018.06.07 |
07.Security Checks (1) | 2018.06.05 |
06.malloc 분석 (0) | 2018.06.05 |
05.Internal functions (0) | 2018.06.01 |