일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- GOT overwrite
- Lazenca
- seccomp
- srop
- Reversing
- DFC 2022
- RTL
- Dynamic Analysis
- DreamHack
- ROP
- BOF
- HackCTF
- _IO_FILE
- malware
- Android
- K-shield Junior
- H4CKING GAME
- heap feng shui
- UAF
- heap exploit
- master canary
- _IO_FILE Arbitrary Address Write
- heap
- _IO_FILE Arbitrary Address Read
- shellcode
- vtable
- __environ
- DFB
- tcache
- 나뭇잎 책
- Today
- Total
Studying Security
[glibc] malloc 정리 본문
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)의 메모리 영역을 미리 할당해두고 이 영역을 사용함
할당한 영역을 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 |