Double Free

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 ์ง€์›ํ•˜๊ธฐ

Basic Information

๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ๋‘ ๋ฒˆ ์ด์ƒ ํ•ด์ œํ•˜๋ฉด ํ• ๋‹น์ž์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—‰๋ง์ด ๋˜์–ด ๊ณต๊ฒฉ์˜ ๊ธธ์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค: ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ํ•ด์ œํ•˜๋ฉด, ๊ทธ๊ฒƒ์€ ๋ฌด๋ฃŒ ์ฒญํฌ ๋ชฉ๋ก(์˜ˆ: โ€œfast binโ€)์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ธ”๋ก์„ ์—ฐ์†์œผ๋กœ ๋‘ ๋ฒˆ ํ•ด์ œํ•˜๋ฉด, ํ• ๋‹น์ž๋Š” ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์‚ฌ์ด์— ๋‹ค๋ฅธ ์ฒญํฌ๋ฅผ ํ•ด์ œํ•˜๋ฉด, ์ด์ค‘ ํ•ด์ œ ๊ฒ€์‚ฌ๊ฐ€ ์šฐํšŒ๋˜์–ด ์†์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”์ฒญํ•  ๋•Œ(malloc ์‚ฌ์šฉ), ํ• ๋‹น์ž๋Š” ๋‘ ๋ฒˆ ํ•ด์ œ๋œ ๋ธ”๋ก์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ๊ฐ€ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ๊ทธ ํฌ์ธํ„ฐ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ์–ดํ•˜๋ฉด, ๊ทธ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Example:

#include <stdio.h>
#include <stdlib.h>

int main() {
// Allocate memory for three chunks
char *a = (char *)malloc(10);
char *b = (char *)malloc(10);
char *c = (char *)malloc(10);
char *d = (char *)malloc(10);
char *e = (char *)malloc(10);
char *f = (char *)malloc(10);
char *g = (char *)malloc(10);
char *h = (char *)malloc(10);
char *i = (char *)malloc(10);

// Print initial memory addresses
printf("Initial allocations:\n");
printf("a: %p\n", (void *)a);
printf("b: %p\n", (void *)b);
printf("c: %p\n", (void *)c);
printf("d: %p\n", (void *)d);
printf("e: %p\n", (void *)e);
printf("f: %p\n", (void *)f);
printf("g: %p\n", (void *)g);
printf("h: %p\n", (void *)h);
printf("i: %p\n", (void *)i);

// Fill tcache
free(a);
free(b);
free(c);
free(d);
free(e);
free(f);
free(g);

// Introduce double-free vulnerability in fast bin
free(h);
free(i);
free(h);


// Reallocate memory and print the addresses
char *a1 = (char *)malloc(10);
char *b1 = (char *)malloc(10);
char *c1 = (char *)malloc(10);
char *d1 = (char *)malloc(10);
char *e1 = (char *)malloc(10);
char *f1 = (char *)malloc(10);
char *g1 = (char *)malloc(10);
char *h1 = (char *)malloc(10);
char *i1 = (char *)malloc(10);
char *i2 = (char *)malloc(10);

// Print initial memory addresses
printf("After reallocations:\n");
printf("a1: %p\n", (void *)a1);
printf("b1: %p\n", (void *)b1);
printf("c1: %p\n", (void *)c1);
printf("d1: %p\n", (void *)d1);
printf("e1: %p\n", (void *)e1);
printf("f1: %p\n", (void *)f1);
printf("g1: %p\n", (void *)g1);
printf("h1: %p\n", (void *)h1);
printf("i1: %p\n", (void *)i1);
printf("i2: %p\n", (void *)i2);

return 0;
}

์ด ์˜ˆ์ œ์—์„œ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•ด์ œ๋œ ์ฒญํฌ(7)๋กœ tcache๋ฅผ ์ฑ„์šด ํ›„, ์ฝ”๋“œ๋Š” ์ฒญํฌ h๋ฅผ ํ•ด์ œํ•œ ๋‹ค์Œ ์ฒญํฌ i๋ฅผ ํ•ด์ œํ•˜๊ณ  ๋‹ค์‹œ h๋ฅผ ํ•ด์ œํ•˜์—ฌ ์ด์ค‘ ํ•ด์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค(Fast Bin dup์ด๋ผ๊ณ ๋„ ํ•จ). ์ด๋Š” ์žฌํ• ๋‹น ์‹œ ๊ฒน์น˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ฃผ๋ฉฐ, ๋‘ ๊ฐœ ์ด์ƒ์˜ ํฌ์ธํ„ฐ๊ฐ€ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋ฉด ๋‹ค๋ฅธ ํฌ์ธํ„ฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์–ด, ์ด๋Š” ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ์œ„ํ—˜๊ณผ ์•…์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ํ•  ๋•Œ, i1๊ณผ i2๊ฐ€ ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€์กŒ์Œ์„ ์ฃผ๋ชฉํ•˜์„ธ์š”:

์ดˆ๊ธฐ ํ• ๋‹น:
a: 0xaaab0f0c22a0
b: 0xaaab0f0c22c0
c: 0xaaab0f0c22e0
d: 0xaaab0f0c2300
e: 0xaaab0f0c2320
f: 0xaaab0f0c2340
g: 0xaaab0f0c2360
h: 0xaaab0f0c2380
i: 0xaaab0f0c23a0
์žฌํ• ๋‹น ํ›„:
a1: 0xaaab0f0c2360
b1: 0xaaab0f0c2340
c1: 0xaaab0f0c2320
d1: 0xaaab0f0c2300
e1: 0xaaab0f0c22e0
f1: 0xaaab0f0c22c0
g1: 0xaaab0f0c22a0
h1: 0xaaab0f0c2380
i1: 0xaaab0f0c23a0
i2: 0xaaab0f0c23a0

์˜ˆ์ œ

  • Dragon Army. Hack The Box
  • ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์ธ __malloc_hook ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ํฌ๊ธฐ 0x70๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” Fast-Bin ํฌ๊ธฐ์˜ ์ฒญํฌ๋งŒ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์‹ , Fast Bin dup์˜ ๋Œ€์ƒ์œผ๋กœ 0x56๋กœ ์‹œ์ž‘ํ•˜๋Š” PIE ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(1/2 ํ™•๋ฅ ).
  • PIE ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋˜๋Š” ํ•œ ๊ณณ์€ Glibc ๋‚ด๋ถ€์˜ main_arena์ด๋ฉฐ, __malloc_hook ๊ทผ์ฒ˜์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” main_arena์˜ ํŠน์ • ์˜คํ”„์…‹์„ ๋ชฉํ‘œ๋กœ ํ•˜์—ฌ ๊ทธ๊ณณ์— ์ฒญํฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , __malloc_hook์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์ฒญํฌ๋ฅผ ๊ณ„์† ํ• ๋‹นํ•˜์—ฌ ์ฝ”๋“œ ์‹คํ–‰์„ ์–ป์Šต๋‹ˆ๋‹ค.
  • zero_to_hero. PicoCTF
  • Tcache ๋นˆ๊ณผ ๋„ ๋ฐ”์ดํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ค‘ ํ•ด์ œ ์ƒํ™ฉ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  • ์šฐ๋ฆฌ๋Š” ํฌ๊ธฐ 0x110์˜ ์ฒญํฌ ์„ธ ๊ฐœ(A, B, C)๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • B๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.
  • A๋ฅผ ํ•ด์ œํ•˜๊ณ  ๋„ ๋ฐ”์ดํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ œ B์˜ ํฌ๊ธฐ ํ•„๋“œ๋Š” 0x100์ด ๋˜์–ด, 0x111 ๋Œ€์‹  ๋‹ค์‹œ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ๊ธฐ 0x110์˜ Tcache-bin ํ•˜๋‚˜์™€ ํฌ๊ธฐ 0x100์˜ Tcache-bin ํ•˜๋‚˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ค‘ ํ•ด์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” Tcache poisoning์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ค‘ ํ•ด์ œ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋ฌธํ—Œ

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 ์ง€์›ํ•˜๊ธฐ