ghkdtlwns987
[glibc2.23] Heap bins 정리3 (smallbin) 본문
smallbin
smallbin -> 이중 연결리스트, FIFO 구조 사용
smallbin 의 크기는 512 바이트 미만 ( smallbin < 512(0x200))
if (in_smallbin_range (nb)) ( size < 512 )
{
idx = smallbin_index (nb);
bin = bin_at (av, idx); ( bin 은 main_arena ) 를 가리킴
if ((victim = last (bin)) != bin)
{
if (victim == 0) /* initialization check */
malloc_consolidate (av);
else
{
bck = victim->bk;
if (__glibc_unlikely (bck->fd != victim))
{
errstr = "malloc(): smallbin double linked list corrupted";
goto errout;
}
set_inuse_bit_at_offset (victim, nb);
bin->bk = bck;
bck->fd = bin;
if (av != &main_arena)
victim->size |= NON_MAIN_ARENA;
check_malloced_chunk (av, victim, nb);
void *p = chunk2mem (victim);
alloc_perturb (p, bytes);
return p;
}
}
}
smallbin 은 512바이트 미만의 사이즈로 chunk가 해제되었을 때,
unsorted bin 에 리스트가 추가된 후 저장되는 bin이다.
먼저 해당 chunk가 smallbin 크기에 속하는지를 판별해
smallbin 크기에 속한다면 현재 chunk가 smallbin 의 배열을 선정한다.
이후 반환할 chunk를 main_arena 에서 가져오면서 smallbin의 연결리스트가 비어있는지 확인한다.
만약 비어있으면 malloc_consolidate 함수를 호출해 존재하는 fastbin 과 병합한다.
만일 그렇지 않으면 smallbin 인 heap chunk 를 재할당 한다.
이후 인접한 청크에 prev_inuse 비트를 설정하고 반환될 청크 뒤에 존재하는 청크를 main_arena가 BK로 가르키게 하고, 해당 청크의 FD는 main_arena를 가르키게 설정하여 이중 연결 리스트를 만들고 smallbin의 첫번째 리스트로 만듭니다.
최종적으로 청크를 반환하고 해당 과정은 종료된다.
'Heap Exploitation' 카테고리의 다른 글
UAF vs Double free Bug간단 정리 (0) | 2021.01.29 |
---|---|
[glibc2.23] Heap bins 정리 4 (largebin) (0) | 2021.01.28 |
[glibc2.23] Heap bins 정리 2 (Unsorted bin) (0) | 2021.01.28 |
[glibc2.23] Heap bins 정리1 (fastbins) (0) | 2021.01.28 |
[Heap] Unsorted bin attack (0) | 2020.09.16 |
Comments