First Fit
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
First Fit
glibc๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ๋, ์๋ก ๋ค๋ฅธ โ๋นโ์ด ๋ฉ๋ชจ๋ฆฌ ์ฒญํฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์์ ๋ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์ ๋ํ ๊ฐ๋จํ ์ค๋ช ์ ๋๋ค: ์ ๋ ฌ๋์ง ์์ ๋น๊ณผ ํจ์คํธ ๋น.
Unsorted Bins
ํจ์คํธ ์ฒญํฌ๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฒญํฌ๋ฅผ ํด์ ํ๋ฉด, ๊ทธ๊ฒ์ ์ ๋ ฌ๋์ง ์์ ๋น์ผ๋ก ์ด๋ํฉ๋๋ค. ์ด ๋น์ ์๋ก ํด์ ๋ ์ฒญํฌ๊ฐ ์์ชฝ(โํค๋โ)์ ์ถ๊ฐ๋๋ ๋ชฉ๋ก์ฒ๋ผ ์๋ํฉ๋๋ค. ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์ฒญํฌ๋ฅผ ์์ฒญํ ๋, ํ ๋น์๋ ์ ๋ ฌ๋์ง ์์ ๋น์ ๋ค์ชฝ(โํ ์ผโ)์์ ์ถฉ๋ถํ ํฐ ์ฒญํฌ๋ฅผ ์ฐพ์ต๋๋ค. ์ ๋ ฌ๋์ง ์์ ๋น์ ์ฒญํฌ๊ฐ ํ์ํ ๊ฒ๋ณด๋ค ํฌ๋ฉด, ๊ทธ๊ฒ์ ๋ถํ ๋์ด ์๋ถ๋ถ์ด ๋ฐํ๋๊ณ ๋๋จธ์ง ๋ถ๋ถ์ ๋น์ ๋จ์ ์์ต๋๋ค.
์์:
- 300 ๋ฐ์ดํธ(
a)๋ฅผ ํ ๋นํ ๋ค์, 250 ๋ฐ์ดํธ(b)๋ฅผ ํ ๋นํ๊ณ ,a๋ฅผ ํด์ ํ ํ ๋ค์ 250 ๋ฐ์ดํธ(c)๋ฅผ ์์ฒญํฉ๋๋ค. a๋ฅผ ํด์ ํ๋ฉด, ๊ทธ๊ฒ์ ์ ๋ ฌ๋์ง ์์ ๋น์ผ๋ก ์ด๋ํฉ๋๋ค.- ๊ทธ ํ ๋ค์ 250 ๋ฐ์ดํธ๋ฅผ ์์ฒญํ๋ฉด, ํ ๋น์๋ ํ
์ผ์์
a๋ฅผ ์ฐพ์ ๋ถํ ํ๊ณ , ์์ฒญ์ ๋ง๋ ๋ถ๋ถ์ ๋ฐํํ๋ฉฐ ๋๋จธ์ง๋ ๋น์ ๋จ๊น๋๋ค. c๋ ์ด์ ์a๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐa์ ๋ด์ฉ์ผ๋ก ์ฑ์์ง๋๋ค.
char *a = malloc(300);
char *b = malloc(250);
free(a);
char *c = malloc(250);
Fastbins
Fastbins์ ์์ ๋ฉ๋ชจ๋ฆฌ ์ฒญํฌ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ ๋ ฌ๋์ง ์์ ๋น๊ณผ ๋ฌ๋ฆฌ, fastbins์ ์๋ก์ด ์ฒญํฌ๋ฅผ ๋จธ๋ฆฌ์ ์ถ๊ฐํ์ฌ ํ์ ์ ์ถ(LIFO) ๋์์ ์์ฑํฉ๋๋ค. ์์ ๋ฉ๋ชจ๋ฆฌ ์ฒญํฌ๋ฅผ ์์ฒญํ๋ฉด, ํ ๋น์๋ fastbin์ ๋จธ๋ฆฌ์์ ๊ฐ์ ธ์ต๋๋ค.
Example:
char *a = malloc(20);
char *b = malloc(20);
char *c = malloc(20);
char *d = malloc(20);
free(a);
free(b);
free(c);
free(d);
a = malloc(20); // d
b = malloc(20); // c
c = malloc(20); // b
d = malloc(20); // a
๐ฅ ํ๋ glibc ๊ณ ๋ ค์ฌํญ (tcache โฅ 2.26)
glibc 2.26๋ถํฐ ๊ฐ ์ค๋ ๋๋ tcache๋ฅผ ์ ์งํ๋ฉฐ, ์ด๋ ์ ๋ ฌ๋์ง ์์ ๋น ์์์ ์ฟผ๋ฆฌ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ์ ํฉ ์๋๋ฆฌ์ค๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ง ๋๋ฌํ ์ ์์ต๋๋ค:
- ์์ฒญ๋ ํฌ๊ธฐ๊ฐ
tcache_max(๊ธฐ๋ณธ์ ์ผ๋ก 64๋นํธ์์ 0x420)๋ณด๋ค ์ปค์ผ ํ๋ฉฐ, ๋๋ - ํด๋น tcache ๋น์ด ์ด๋ฏธ ๊ฐ๋ ์ฐจ ์๊ฑฐ๋ ์๋์ผ๋ก ๋น์์ก์ ๋ (7๊ฐ์ ์์๋ฅผ ํ ๋นํ๊ณ ์ฌ์ฉ ์ค์ผ๋ก ์ ์ง).
์ค์ ์ต์คํ๋ก์์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋์ฐ๋ฏธ ๋ฃจํด์ ์ถ๊ฐํฉ๋๋ค:
// Drain the tcache for a given size
for(int i = 0; i < 7; i++) pool[i] = malloc(0x100);
for(int i = 0; i < 7; i++) free(pool[i]);
tcache๊ฐ ์์ง๋๋ฉด, ์ดํ์ free๋ unsorted bin์ผ๋ก ๊ฐ๊ณ ๊ณ ์ ์ ์ธ first-fit ๋์(๊ผฌ๋ฆฌ ๊ฒ์, ๋จธ๋ฆฌ ์ฝ์ )์ด ๋ค์ ๋ฐ์ํ ์ ์์ต๋๋ค.
๐ฉ first-fit์ ์ด์ฉํ ๊ฒน์น๋ ์ฒญํฌ UAF ๋ง๋ค๊ธฐ
์๋์ ์กฐ๊ฐ(ํ ์คํธ๋ glibc 2.38์์ ์ํ๋จ)์ unsorted bin์ ๋ถํ ๊ธฐ๋ฅผ ์ ์ฉํ์ฌ 2๊ฐ์ ๊ฒน์น๋ ํฌ์ธํฐ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด๋ ๋จ์ผ free๋ฅผ write-after-free๋ก ๋ณํํ๋ ๊ฐ๋ ฅํ ์์ ๊ธฐ๋ฅ์ ๋๋ค.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
setbuf(stdout, NULL);
/* 1. prepare 2 adjacent chunks and free the first one */
char *A = malloc(0x420); // big enough to bypass tcache
char *B = malloc(0x420);
strcpy(A, "AAAA\n");
free(A); // A โ unsorted
/* 2. request a *smaller* size to force a split of A */
char *C = malloc(0x400); // returns lower half of former A
/* 3. The remainder of A is still in the unsorted bin.
Another 0x400-byte malloc will now return the *same*
region pointed to by B โ creating a UAF/overlap. */
char *C2 = malloc(0x400);
printf("B = %p\nC2 = %p (overlaps B)\n", B, C2);
// Arbitrary write in B is immediately visible via C2
memset(B, 'X', 0x10);
fwrite(C2, 1, 0x10, stdout); // prints Xs
}
Exploitation recipe (common in recent CTFs):
- ๋์ ํฌ๊ธฐ์ ๋ํ tcache๋ฅผ ๋น์ฐ๊ธฐ.
- ์ฒญํฌ๋ฅผ ํด์ ํ์ฌ ์ ๋ ฌ๋์ง ์์ ๋น์ ๋ฐฐ์นํ๊ธฐ.
- ์กฐ๊ธ ๋ ์์ ํฌ๊ธฐ๋ฅผ ํ ๋นํ๊ธฐ โ ํ ๋น์๋ ์ ๋ ฌ๋์ง ์์ ์ฒญํฌ๋ฅผ ๋ถํ ํฉ๋๋ค.
- ๋ค์ ํ ๋นํ๊ธฐ โ ๋จ์ ๋ถ๋ถ์ด ๊ธฐ์กด ์ฌ์ฉ ์ค์ธ ์ฒญํฌ์ ๊ฒน์นจ โ UAF.
- ๋ฏผ๊ฐํ ํ๋(ํจ์ ํฌ์ธํฐ, FILE vtable ๋ฑ)๋ฅผ ๋ฎ์ด์ฐ๊ธฐ.
์ค์ฉ์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ์ 2024 HITCON Quals Setjmp ์ฑ๋ฆฐ์ง์์ ์ด ์ ํํ ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ UAF์์ __free_hook์ ์ ์ฒด ์ ์ด๋ก ํผ๋ฒํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ์ฐพ์ ์ ์์ต๋๋ค.
๐ก๏ธ ์ํ ๋ฐ ๊ฐํ
- **์์ ํ ๋งํฌ(glibc โฅ 2.32)**๋ ๋จ์ผ ์ฐ๊ฒฐ๋ tcache/fastbin ๋ชฉ๋ก๋ง ๋ณดํธํฉ๋๋ค. ์ ๋ ฌ๋์ง ์์/์์/ํฐ ๋น์ ์ฌ์ ํ ์์ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๋ฏ๋ก, ํ ๋์๋ฅผ ์ป์ ์ ์๋ค๋ฉด ์ฒซ ๋ฒ์งธ ์ ํฉ ๊ธฐ๋ฐ์ ๊ฒน์นจ์ด ์ฌ์ ํ ์ ํจํฉ๋๋ค.
- ํ ํฌ์ธํฐ ์ํธํ ๋ฐ MTE (ARM64)๋ ์์ง x86-64 glibc์ ์ํฅ์ ๋ฏธ์น์ง ์์ง๋ง,
GLIBC_TUNABLES=glibc.malloc.check=3์ ๊ฐ์ ๋ฐฐํฌ ๊ฐํ ํ๋๊ทธ๋ ์ผ๊ด์ฑ ์๋ ๋ฉํ๋ฐ์ดํฐ์์ ์ค๋จ๋๋ฉฐ ๋จ์ํ PoC๋ฅผ ๊นจ๋จ๋ฆด ์ ์์ต๋๋ค. - ํด์ ์ tcache ์ฑ์ฐ๊ธฐ (2024๋ glibc 2.41์ ์ ์๋จ)๋ ์ ๋ ฌ๋์ง ์์ ์ฌ์ฉ์ ๋์ฑ ์ค์ผ ๊ฒ์ ๋๋ค; ์ผ๋ฐ์ ์ธ ์ต์คํ๋ก์์ ๊ฐ๋ฐํ ๋ ํฅํ ๋ฆด๋ฆฌ์ค๋ฅผ ๋ชจ๋ํฐ๋งํ์ธ์.
๊ธฐํ ์ฐธ์กฐ ๋ฐ ์์
- https://heap-exploitation.dhavalkapil.com/attacks/first_fit
- https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/
- ARM64. Use after free: ์ฌ์ฉ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ํด์ ํ ํ, ํด์ ๋ ์ฒญํฌ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๊ทธ์ ์ธ ์ ์๊ฒ ํ์ฌ, ์ด์ ์ user->password ์์น๋ฅผ ๋ฎ์ด์ฐ๊ธฐ. ์ฌ์ฉ์๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ๋น๋ฐ๋ฒํธ ํ์ธ์ ์ฐํํ๊ธฐ
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example
- ํ๋ก๊ทธ๋จ์ ๋
ธํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋
ธํธ๋ malloc(8)์์ ๋
ธํธ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ(ํธ์ถํ ์ ์๋ ํจ์์ ๋ํ ํฌ์ธํฐ ํฌํจ) ๋ค๋ฅธ malloc(
)์ ๋ ธํธ์ ๋ด์ฉ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๋๋ค. - ๊ณต๊ฒฉ์ ๋ ธํธ ์ ๋ณด ํฌ๊ธฐ๋ณด๋ค ๋ ํฐ malloc ๋ด์ฉ์ ๊ฐ์ง 2๊ฐ์ ๋ ธํธ(note0 ๋ฐ note1)๋ฅผ ์์ฑํ ๋ค์, ์ด๋ฅผ ํด์ ํ์ฌ ๋น ๋ฅธ ๋น(๋๋ tcache)์ผ๋ก ๋ค์ด๊ฐ๊ฒ ํ๋ ๊ฒ์ ๋๋ค.
- ๊ทธ๋ฐ ๋ค์, ๋ด์ฉ ํฌ๊ธฐ๊ฐ 8์ธ ๋ ๋ค๋ฅธ ๋ ธํธ(note2)๋ฅผ ์์ฑํฉ๋๋ค. ๋ด์ฉ์ note1์ ์์ ๊ฒ์ด๋ฉฐ, ์ฒญํฌ๊ฐ ์ฌ์ฌ์ฉ๋๋ฏ๋ก ํจ์ ํฌ์ธํฐ๋ฅผ win ํจ์๋ก ๊ฐ๋ฆฌํค๋๋ก ์์ ํ ์ ์๊ณ , ๊ทธ๋ฐ ๋ค์ Use-After-Free๋ฅผ ํตํด note1์ ํธ์ถํ์ฌ ์๋ก์ด ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ์ํ๋ ๊ฐ์ ์ฐ๊ณ , ํด์ ํ ํ, ์ฌํ ๋นํ ์ ์์ผ๋ฉฐ, ์ด์ ๋ฐ์ดํฐ๊ฐ ์ฌ์ ํ ์กด์ฌํ๋ฏ๋ก ์ฒญํฌ์ ์๋ก์ด ์์ ๊ตฌ์กฐ์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋์ด ๊ฐ์ ์ค์ ํ๊ฑฐ๋ ํ๋๊ทธ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html
- ์ด ๊ฒฝ์ฐ ํน์ ์ฒญํฌ์ 4๋ฅผ ์จ์ผ ํ๋ฉฐ, ์ด๋ ํ ๋น๋ ์ฒซ ๋ฒ์งธ ์ฒญํฌ์ ๋๋ค(๋ชจ๋ ์ฒญํฌ๋ฅผ ๊ฐ์ ๋ก ํด์ ํ ํ์๋). ๊ฐ ์๋ก ํ ๋น๋ ์ฒญํฌ์ ๋ฐฐ์ด ์ธ๋ฑ์ค ๋ฒํธ๊ฐ ์ ์ฅ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ 4๊ฐ์ ์ฒญํฌ(+ ์ฒ์ ํ ๋น๋ ์ฒญํฌ)๋ฅผ ํ ๋นํ๊ณ , ๋ง์ง๋ง ์ฒญํฌ์๋ 4๊ฐ ๋ค์ด ์์ผ๋ฉฐ, ์ด๋ฅผ ํด์ ํ๊ณ ์ฒซ ๋ฒ์งธ ์ฒญํฌ์ ์ฌํ ๋น์ ๊ฐ์ ๋ก ํ์ฌ ๋ง์ง๋ง์ผ๋ก ํด์ ๋ ์ฒญํฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ด ์ฒญํฌ์๋ 4๊ฐ ๋ค์ด ์์ต๋๋ค.
- 2024 HITCON Quals Setjmp write-up (Quarkslab) โ ์ค์ฉ์ ์ธ first-fit / ์ ๋ ฌ๋์ง ์์ ๋ถํ ๊ฒน์นจ ๊ณต๊ฒฉ: https://ctftime.org/writeup/39355
- Angstrom CTF 2024 heapify write-up โ ์ ๋ ฌ๋์ง ์์ ๋น ๋ถํ ์ ์ ์ฉํ์ฌ libc๋ฅผ ๋์ถํ๊ณ ๊ฒน์นจ์ ์ป๊ธฐ: https://hackmd.io/@aneii11/H1S2snV40
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


