Studying Security

[glibc] malloc 정리 본문

개념 정리/Heap

[glibc] malloc 정리

J4guar 2022. 4. 19. 17:41
728x90
반응형

Heap이란?

프로그램이 실행되는 도중 동적으로 할당하고 해제하여 사용하는 메모리 영역

동적 메모리 할당자의 종류

tcmalloc (Google)

Libumem (Solaris)

Jemalloc (FreeBSD and Firefox)

dlmalloc (General purpose allocator)

  • 리눅스에서 사용되는 힙 관리에 사용되는 memory allocatior
  • dlmalloc이 사용되다가 쓰레드 기능이 추가된 ptmalloc이 현재 사용됨

ptmalloc2

  • 현재 우분투에서 사용되는 memory allocator의 기본 알고리즘은 dlmalloc과 동일하다
  • dlmalloc 코드를 기반으로 하며 멀티 스레드에서 사용되도록 확장됨
  • 사용하면 한 번에 두개 이상의 메모리 영역을 활성화하여 멀티 스레드 어플리케이션을 효율적으로 처리할 수 있음
  • 복수의 스레드가 동시에 malloc을 호출하면 각 스레드는 별도의 힙 세그먼트가 생성되고, 해당 힙을 유지 보수하는 데이터 구조도 분리되어 메모리에 할당됨
  • 서로 다른 스레드가 서로 간섭하지 않고 서로 다른 메모리 영역에 접근할 수 있음

 

heap 생성시

아래와 같이 특정 크기(0x21000)의 메모리 영역을 미리 할당해두고 이 영역을 사용함

<malloc으로 메모리 할당>

할당한 영역을 free 해주면 → 그대로 남아 있음!!

<free로 메모리 반환>

 

chunk 구조

mem : malloc으로 할당받은 부분

chunk : header(사이즈 정보)와 mem을 포함하는 영역

size : chunk의 크기 ( 32bit는 8byte, 64bit는 16byte 단위로 정렬됨)

prev_size : 인접한 앞쪽 chunk의 크기 (앞쪽 chunk가 free가 되면 prev_size도 이에 맞춰 초기화 됨)

 

chunk size는 32bit의 경우 8byte, 64bit의 경우 16 byte 단위로 정렬되기 때문에

하위 3bit를 이용해 3가지 속성을 나타내는데 사용한다.

8byte 단위 정렬

3가지 속성

prev_inuse bit

인접한 이전 chunk가 할당되면 1

인접한 이전 chunk가 해제되면 0

is_mmaped bit

mmap으로 할당되었으면 1

mmap으로 할당되지 않았으면 0

non_main_arena bit

thread arena에 속하면 1

thread arena에 속하지 않으면 0

 

chunk 종류

Allocated chunk

) char* heap = malloc(0x10)

malloc()을 호출한 뒤 rax레지스터에 반환되는 값은 할당된 chunk의 주소(mem)

prev_size = 0

size = mem(0x10) + chunk header(prev_size+size)(0x10) + prev_inuse bit(1) = 0x21

mem = 0x10

 

Freed chunk - 할당된 chunk와 구조가 다름

free로 할당받았던 메모리를 반환할 때 실제로 반환하지 않고 힙 메모리 영역에 남아 있음

대신 allocated chunk에서 freed chunk 구조로 변경됨

  • data가 있던 부분에 fd와 bk가 생김
  • 크기가 큰 경우 fd_next_size, bk_next_size도 생김 (512byte보다 크기가 큰 chunk == large chunk)

free된 chunk들을 효율적으로 관리하기 위해 비슷한 크기끼리 관리하는데 이때 linked list를 이용함

 

Top chunk (Wildness chunk)

힙 영역의 가장 마지막에 위치한 chunk로 bin에 포함되지 않는다.

prev_inuse flag가 설정됨

새롭게  malloc되면 top chunk에서 분리해서 할당하고

  • 할당시에 재사용 가능한 chunk가 없을 때 (bin에 요청에 적합한 chunk가 없을 때)
  • top chunk에서 분리하여 할당(할당할 크기가 있을 때)

top chunk에서 인접한 chunk가 free되면 병합됨

fastbin의 경우 병합되지 않음

largebin의 경우 병합됨

0x1400 size씩 할당했다가 해제

Top chunk size = 0x1d141 --> 0x1e551

0x1d140 + mem(0x1400) + header(0x10) = 0x1e550

 

만약 top chunk size가 요청한 size 보다 적다면?

sbrk(main arena)를 이용해 확장하거나 mmap(thread arena) syscall을 수행

 

Last Remainder chunk

분할되고 남은 덩어리

size_t가 void*와 같은 크기가 아니라면 청크의 최소 크기는 4*sizeof(void*)입니다. 

플랫폼의 ABI에 추가 정렬이 필요한 경우 최소 크기가 더 클 수 있다.

 

Reference

 

01.Malloc - glibc(ptmalloc2)[Korean] - TechNote - Lazenca.0x0

“html” 매크로 렌더링 오류 Notify your Confluence administrator that "Bob Swift Atlassian Apps - HTML" requires a valid license. Reason: VERSION_MISMATCH Excuse the ads! We need some help to keep our site up. “html” 매크로 렌더링 오

www.lazenca.net

 

malloc.c - malloc/malloc.c - Glibc source code (glibc-2.31) - Bootlin

/* Malloc implementation for multiple threads without lock contention. Copyright (C) 1996-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Wolfram Gloger and Doug Lea , 2001. The GNU C Library is free software; you

elixir.bootlin.com

 

반응형

'개념 정리 > Heap' 카테고리의 다른 글

[Heap Exploit] Double Free Bug(DFB)  (0) 2022.04.22
[glibc] malloc 정리4 - tcache  (0) 2022.04.21
[Heap Exploit] Use-After-Free(UAF)  (0) 2022.04.21
[glibc] malloc 정리3 - arena  (0) 2022.04.20
[glibc] malloc 정리2 - bin  (0) 2022.04.20
Comments