Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/Pwnable

ptmalloc2 bin 분석

Ainsetin 2020. 12. 1. 11:02

1. fastbin

  • M_MXFAST 매개변수를 사용하여 청크의 범위를 설정한다. (1이면 사용, 0이면 fastbin을 사용하지 않음)
  • default 범위는 0~80*(size_t)/4까지
  • 일반적으로 사용하는 범위는 0 ~ 64*(size_t)/4
  • 32bit에서는 size_t가 4, 64bit에서는 8
  • 따라서 fastbin의 상한은 32bit에서는 64byte(0x40), 64bit에서는 128byte(0x80)
  • LIFO (Last In First Out) 방식을 채택, 즉 마지막으로 해제된 chunk를 먼저 재사용한다.
  • fastbin에서 서로 chunk가 인접해 있어도 병합하지 않는다.

2. smallbin

  • MIN_LARGE_SIZE보다 작은 값을 사용 : 32bit에서는 512(0x200), 64bit에서는 1024(0x400)
  • 32bit 시스템에서 smallbin의 범위는 0x10~(0x200-8), 64bit에서는 0x20~(0x400-0x10)
  • 총 64개의 bin을 관리하며, doubly-linked list로 구성되어 있음. (FD, BK)
  • 같은 크기의 chunk가 해제되면 원래 smallbin에 마지막으로 남아있던 chunk의 FD에 새로 해제된 chunk의 주소를 넣는다.
  • FIFO (First In First Out) 방식을 채택, 처음에 free된 chunk를 먼저 재사용한다.
  • bin에서 chunk가 서로 인접해 있을 경우 병합 과정을 거친다(malloc_consolidate). 따라서 서로 붙어있을 수 없다.

3. largebin

  • MIN_LARGE_SIZE <= Large_Bin_Range
  • 64bit의 경우에 chunk의 크기가 1024byte 이상이면 Largebin에 배치
  • Largebin도 smallbin과 마찬가지로 bin에서 chunk가 서로 인접할 경우 하나의 chunk로 병합
  • 63개의 bin을 사용, doubly-linked list로 구성. FIFO 방식. 
    • 그러나, 하나의 bin에 다양한 크기의 chunk를 넣을 수 있다는 것이 smallbin과의 차이점.
    • bin 내에서는 내부적으로 크기별로 정렬되어 있지만 free된 순서대로 FD, BK를 통해 연결되어 있음.

4. unsorted bin

  • fastbin을 제외한 smallbin, largebin 크기의 chunk를 free했을 경우 먼저 배치가 되는 곳
  • unsorted bin에 있는 chunk와 같은 크기의 chunk를 할당할 때 unsorted bin에 있는 그 chunk를 재할당
  • FIFO(First In First Out) 방식
  • unsorted bin에 있는 chunk는 재할당되거나 smallbin이나 largebin에 배치된다.

그 이외의 128KB 이상의 메모리는 bin에 속하지 않고, IS_MMAPPED 플래그가 설정된다.

(size의 flag값에 0x2 & 연산)