티스토리 뷰
반응형
이 포스트에서는 malloc.c에서 사용되어지는 대표적인 구조체들을 알아보고,
malloc(), free()함수에서 사용되는, 여러가지 정보를 포스팅할 것이다.
malloc_state 구조체

주요 항목들
- fastbinsY[NFASTBINS] → 해당 Arena에서 fastbin의 시작 포인터들로 이루어진 배열.
배열의 각 인덱스가 byte별 fastbin의 시작 포인터가 된다. - top → Top Chunk의 주소가 들어있는 포인터 변수.
- last_remainder → bin에 들어있는 chunk를 분할하여 할당해주고 남은 chunk의 주소가 들어있는 포인터 변수.
- bins[NBINS * 2 - 2] → unsorted bin, small bin, large bin의 시작 포인터로 이루어진 배열.
0~63 인덱스에 따라서 어떤 bin의 시작 포인터인지 구분된다. - *next → Thread가 여러개일 경우 Arena가 여러개가 생길 수 있는데, 그 때 Arena끼리 linked list를 구성하게
된다. 그 때 사용되는 포인터 변수.
============================================================================
[TIP]
- 기본적으로 Thread마다 하나의 Heap Arena를 가지고, Main Thread가 가지는 Arena는 특별히 main_arena라고 함.
- 그러나 Thread와 Heap Arena가 항상 1대1로 매칭되는 것은 아니다.
- Thread가 많아진다면, 1개의 Arena를 여러개의 Thread가 공유할 수도 있다.
(그래서 heap_info 구조체에 mutex 멤버 변수를 가지고 있다.)
[TIP]
- 항상 모든 bin들은 가장 왼쪽에 새로운 chunk를 추가한다.
- 하지만 chunk를 할당할 때는 다르다. fastbin은 가장 왼쪽의 chunk를 우선 할당하고 (LIFO)
나머지 bin들은 가장 오른쪽의 chunk를 우선 할당한다 (FIFO)
[TIP]
- bin 포인터가 자기자신을 가리키고 있다는 것은, 해당 빈이 비어있다는 뜻이다
- malloc()함수 최초 호출시 malloc_init_state()함수를 통해 bin을 초기화하는데, 그 때 자기자신을 가리키게 한다.
============================================================================

heap_info 구조체

주요 항목들
- ar_ptr → 위 사진과 같이 해당 arena의 주소를 담고 있다.
- 이 구조체는 main_arena에는 존재하지 않는다.
반응형
'Pwnable > Heap' 카테고리의 다른 글
[Heap Exploit] Fastbin_dup Consolidate (0) | 2019.05.22 |
---|---|
[Heap Exploit] Fastbin_dup (Feat. how2heap) (0) | 2019.05.22 |
[Heap] malloc.c 분석(4) - malloc() (0) | 2019.05.06 |
[Heap] malloc.c 분석(3) - unlink_chunk() (0) | 2019.05.05 |
[Heap] malloc.c 분석(1) (0) | 2019.05.04 |