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)
  1. libc 버전에 따라 `` main_arena`` symbol이 없을 수 있다. ( 64bit 2.23, 32bit libc.so에는 없다. )
  2. ``c _int_free()``에서 next size check 시 사용하는 ``c av->system_mem``이 arena에 있기 때문에, fake arena 등을 사용하는 경우 주의해야 한다.
  3. 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