ghkdtlwns987

[glibc2.23] Heap bins 정리3 (smallbin) 본문

Heap Exploitation

[glibc2.23] Heap bins 정리3 (smallbin)

2020/03/31 2021. 1. 28. 18:16

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의 첫번째 리스트로 만듭니다.

최종적으로 청크를 반환하고 해당 과정은 종료된다. 

 

 

Comments