chunk = 할당된 메모리
1 2 3 4 5 6 7 8 9 | struct malloc_chunk { INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */ INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */ struct malloc_chunk* fd; /* double links — used only if free. */ struct malloc_chunk* bk; /* Only used for large blocks: pointer to next larger size. */ struct malloc_chunk* fd_nextsize; /* double links — used only if free. */ struct malloc_chunk* bk_nextsize; }; | cs |
할당된 메모리(chunk)에 대한 정보들로는 prev_size, size, fd, bk, fd_nextsize, bk_nextsize 가 있습니다.
prev_size
prev_size는 이전 chunk가 free 되면 설정되는 값으로, 플래그를 제외한 이전 chunk의 크기 정보가 기록됩니다.
이 정보를 통해 이전 chunk 의 위치를 쉽게 찾을 수 있습니다.
size
size에는 현재 chunk의 사이즈가 기록됩니다.
chunk는 8바이트 단위로 정렬되는데, 이때 하위 3비트는 플래그 용도로 쓰입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* size field is or’ed with PREV_INUSE when previous adjacent chunk in use */ #define PREV_INUSE 0x1 /* extract inuse bit of previous chunk */ #define prev_inuse(p) ((p)->size & PREV_INUSE) /* size field is or’ed with IS_MMAPPED if the chunk was obtained with mmap() */ #define IS_MMAPPED 0x2 /* check for mmap()’ed chunk */ #define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED) /* size field is or’ed with NON_MAIN_ARENA if the chunk was obtained from a non-main arena. This is only set immediately before handing the chunk to the user, if necessary. */ #define NON_MAIN_ARENA 0x4 /* check for chunk from non-main arena */ #define chunk_non_main_arena(p) ((p)->size & NON_MAIN_ARENA) | cs |
※ PREV_INUSE : 이전 chunk가 사용중일 때 설정되는 플래그
※ IS_MMAPPED : mmap() 함수로 할당된 chunk일 때 설정되는 플래그
※ NON_MAIN_ARENA : 멀티 쓰레드 환경에서 main 이 아닌 쓰레드에서 생성된 메모리 일 때 설정되는 플래그
fd는 forward pointer, bk는 backward pointer 로, chunk 리스트를 관리하기 위해 chunk의 리스트들 중 각각 이전 chunk와 다음 chunk의 주소를 가리킵니다.
'Hacking' 카테고리의 다른 글
syscall Exploit 예제 (0) | 2019.11.23 |
---|---|
CVE-2019-14287 발표 자료 (0) | 2019.11.23 |
[2018codegate]catshop (0) | 2019.11.13 |
[2016codegate]Watermelon (0) | 2019.11.13 |
SQLI 정리 (0) | 2019.11.12 |