[glibc] malloc - 2
circular doubly linked list
fastbin을 제외한 나머지 bins는 circular doubly linked list 구조를 사용한다.
fastbin range에 속하지 않는 chunk일 경우, chunk 하나만 ``c free()``해도 ``bash <main_arena+88>(unsorted bin-8)``을 가리키는 `` fd/bk``가 생성된다.
* fastbin은 `` main_arena``를 가리키지 않으며 두 개를 ``c free()``해야 첫 번째 free'd chunk에 `` fd``가 생성된다.
Note) `` fd/bk``가 가리키는 곳이 그대로 다음 `` fd/bk``가 아니라, `` mchunkptr``이다. 그래서 `` +8`` 해주어야 다음 `` fd/bk``가 나온다.
`` fd/bk``가 가리키는 곳인 ``bash <main_arena+88>``에 `` +8``을 더해줘야 unsorted bin이다.
* 여기서 ``bash <main_arena+88>``는 `` top ptr``이며 따라서 ``c top ptr + 8``은 ``c unsorted bin( bins[0] )``이다.
```c
free(0x6020f0) // top chunk 아닌 small chunk.
0x602030: 0x0000000000000000 0x0000000000000091
0x602040: 0x00007ffff7dd37b8 0x00007ffff7dd37b8
gdb-peda$ x/4x 0x7ffff7dd37b8
0x7ffff7dd37b8 <main_arena+88> : 0x0000000000602100 [top ptr] 0x0000000000000000 [last_remainder]
0x7ffff7dd37c8 <main_arena+104>: 0x0000000000602030 [fd] 0x0000000000602030 [bk]
```
* ``c av->last_remainder``는 small request가 들어왔을 때 이를 처리하기 위해 split하는 경우, split하고 이후 남은 부분을 가리킨다.
arena structure
2.25 arena.c's _heap_info
```c
typedef struct _heap_info
{
mstate ar_ptr; /* Arena for this heap. */
struct _heap_info *prev;
size_t size;
size_t mprotect_size;
char pad[-6 * SIZE_SZ & MALLOC_ALIGN_MASK];
} heap_info;
```
``c mstate``는 ``c malloc_state``다.
2.25 malloc_state
```c
struct malloc_state
{
__libc_lock_define (, mutex);
int flags;
mfastbinptr fastbinsY[NFASTBINS];
mchunkptr top;
mchunkptr last_remainder;
mchunkptr bins[NBINS * 2 - 2];
unsigned int binmap[BINMAPSIZE];
struct malloc_state *next;
struct malloc_state *next_free;
INTERNAL_SIZE_T attached_threads;
INTERNAL_SIZE_T system_mem; // _int_free's next size check
INTERNAL_SIZE_T max_system_mem;
};
```
Note)
- libc 버전에 따라 `` main_arena`` symbol이 없을 수 있다. ( 64bit 2.23, 32bit libc.so에는 없다. )
- ``c _int_free()``에서 next size check 시 사용하는 ``c av->system_mem``이 arena에 있기 때문에, fake arena 등을 사용하는 경우 주의해야 한다.
- libc 버전마다 구조체 멤버가 조금씩 다르다.
그래서 항상 ``bash <main_arena+88>``이 `` top ptr``인 것은 아니다.
'Security > System Exploit' 카테고리의 다른 글
[glibc] malloc - 4 (0) | 2017.07.21 |
---|---|
[glibc] malloc - 3 (0) | 2017.07.21 |
[glibc] malloc - 1 (6) | 2017.07.19 |
[메모리 보호 기법] PIE (0) | 2017.07.16 |
[메모리 보호 기법] RELRO (0) | 2017.07.15 |