본문 바로가기
Pwnable

Heap Basic

by ms-eo 2025. 11. 19.

Heap

Stack vs Heap

  • Heap은 운영체제가 아닌 프로그래머에 의해서 메모리 공간을 동적으로 할당하고 해제

Dynamic Memory Allocation 관련 함수

  • 운영체제가 아닌 프로그래머에 의해서 메모리 공간을 동적으로 할당하고 해제할 때 호출
    • *int*malloc() : 동적 메모리 할당 시, 메모리 블록을 할당하고 추적해 메모리를 효율적으로 관리
    • _int_free() : 동적으로 할당된 메모리 블록을 해제하고 재활용 가능한 리스트에 추가 및 관리

Heap 영역

  • 메모리에서의 힙 영역은 낮은 주소에서 높은 주소의 방향으로 할당
  • 프로그램 실행 중, 동적으로 메모리를 할당/해제해 사용하는 공간이며, pointer로 데이터에 접근

Memory Allocator

  • 시스템에게 동적 메모리 할당을 요구할 때 작업을 처리하는 heap 영역 관리 모듈
  • dlmalloc, ptmalloc2, tcmalloc, jemalloc 등의 메모리 할당자 존재

ptmalloc2

  • GNU C Library의 메모리 할당자로 리눅스 유저 모드에서 주로 사용 (dlmalloc + Multi Thread)
  • 새로운 할당을 받았을 때 기억하고 있던 유사한 크기의 메모리 블록(chunk) 반환

Heap Basic

  • C언어에서 동적 메모리 할당할 때 사용하는 기초 개념
  • Heap 관련 공격 기법의 기반이 되는 내용

Arena

Arena

  • 각 thread가 서로 다른 메모리 영역에서 액세스할 수 있게 하는 heap 영역
  • multi thread 환경을 지원하는 ptmalloc2에 도입된 개념
  • Thread 당 할당된 heap을 관리하며, Main Arena와 Sub Arena로 분류
  • 자원 고갈 방지를 위해 시스템 환경에 따라 arena의 갯수 제한

Main Arena & Sub Arena

  • Main Arena는 sbrk()를, Sub Arena는 mmap(), mprotect()를 통해 Heap을 확장

malloc_state 구조체

  • arena의 정보를 저장하고 있는 arena header로 모든 arena가 하나씩 가짐

_heap_info 구조체

  • heap 영역에 대한 정보가 저장되어 있는 heap header
  • sub arena에만 존재하는 구조체로, main arena에는 없음

Chunk

Chunk

  • malloc 함수에 메모리 할당 요청 시, heap을 다양한 크기로 나눈 덩어리
  • arena가 관리하는 heap에서 할당된 영역
  • 현재 chunk 크기와 인접 chunk 위치 등에 대한 메타 데이터 + 사용자 저장 데이터

malloc_chunk 구조체

  • malloc()이 chunk를 관리하기 위한 메타 데이터가 존재하는 구조체

Top Chunk

  • arena의 최상단에 존재하는 chunk로, 필요 시 이 영역을 분할 해 할당 작업 처리
  • 인접한 free chunk가 존재할 경우 하나의 top chunk로 병합

In-use Chunk

  • 메모리를 allocator로부터 할당받아서 사용 중인 chunk로
  • prev_size, size, data로 구성

Free Chunk

  • 할당된 메모리 영역이 해제된 chunk
  • 여러 인접한 free chunk들은 단일 free chunk로 병합하기도 함

Bin

Bin

  • 재사용을 위해 크기 단위로 관리하는 (binning)되는, free()된 chunk들을 관리하는 리스트
  • free chunk의 재활용을 위해 크기 단위로 저장 및 관리(binning)하기 위한 배열 목록
  • 메모리 할당/해제 작업의 성능 향상을 위해 도입된 개념

※ fastbinY[]

  • 각 Fast Bin 리스트의 head를 가리키는 포인터 배열
  • 정의된 최대 인덱스는 10개, 보통 실질적으로 관리되는 인덱스 7개

※ bins[]

  • Unsorted Bin, Small Bin, Large Bin 리스트의 head를 가리키는 포인터 배열

Fast Bin

  • 상한 값(32bit: 64byte: 128byte) 이하의 작은 free chunk를 관리하는 Bin
  • 단일 연결 리스트이며 고정 크기의 chunk를 자동으로 분류해 메모리 할당/해제 속도가 빠름

Unsorted Bin

  • Small bin과 Large bin 크기의 free chunk를 관리하는 bin
  • Unsorted bin에서 재할당할 수 있는 기회는 한 번이므로, 재할당 후 본래의 bin으로 이동

Small bin

  • MIN_LARGE_SIZE(32bit: 512byte, 64bit: 1024byte) 미만의 free chunk를 관리하는 bin
  • 인덱스당 고정된 값의 사이즈를 가진 chunk의 리스트가 저장

Large Bin

  • MIN_LARGE_SIZE(32bit: 512byte, 64bit: 1024byte) 이상의 free chunk를 관리하는 bin
  • 인덱스당 특정 범위의 사이즈를 가진 chunk들의 리스트가 내림차순으로 정렬

Tcache

Tcache (Thread Local Caching)

  • 각 thread에서 독립적으로 할당되는 cache 저장소로, 힘 관리 성능 향상을 위한 기술
  • Multi Thread 환경에서 힙 메모리 관리 속도 향상을 위한 개념 (glibc 2.26 이상)
  • 각 thread에서 독립적으로 할당되는 cache 저장소

Tcache 관련 함수

  • tcache_init : tcache 초기화 관련 함수로 tcache_perthread_struct 생성
  • tcache_put : tcache list에 새로운 chunk를 삽입하는 함수
  • tcache_get : tcache list에서 chunk를 가져와 제거하는 함수

Tcache Bin

  • 크기가 32bit: 512byte, 64bit: 1024byte 이하의 free chunk를 관리하는 bin

tcache_perthread_struct 구조체

  • 전체적인 tcache list를 관리하는 구조체로 counts 배열과 enties 배열 활용

tcache_entry 구조체

  • 동일한 크기의 free chunk를 관리하는 구조체

Pwndbg Command

Pwndbg Heap Command

'Pwnable' 카테고리의 다른 글

Heap Exploitation  (0) 2025.11.19
Integer Overflow  (0) 2025.11.19
Format String Bug  (0) 2025.11.19
Buffer Overflow  (0) 2025.11.19
Pwnable Tools  (0) 2025.11.19