hacktricks/binary-exploitation/libc-heap/double-free.md

10 KiB

Double Free

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Basic Information

рдпрджрд┐ рдЖрдк рдПрдХ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрд╡рдВрдЯрдХ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рджрд░рд╡рд╛рдЬрд╛ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ: рдЬрдм рдЖрдк рдПрдХ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдореБрдХреНрдд рдЯреБрдХрдбрд╝реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╡рд╛рдкрд╕ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ "рдлрд╛рд╕реНрдЯ рдмрд┐рди")ред рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рдмреНрд▓реЙрдХ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рджреЛ рдмрд╛рд░ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрд╡рдВрдЯрдХ рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдмреАрдЪ рдореЗрдВ рдПрдХ рдФрд░ рдЯреБрдХрдбрд╝рд╛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбрдмрд▓-рдлреНрд░реА рдЬрд╛рдВрдЪ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

рдЕрдм, рдЬрдм рдЖрдк рдирдИ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдкреВрдЫрддреЗ рд╣реИрдВ ( 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 рдХреЛ рд╡рд╣реА рдкрддрд╛ рдорд┐рд▓рд╛:

Initial allocations:
a: 0xaaab0f0c22a0
b: 0xaaab0f0c22c0
c: 0xaaab0f0c22e0
d: 0xaaab0f0c2300
e: 0xaaab0f0c2320
f: 0xaaab0f0c2340
g: 0xaaab0f0c2360
h: 0xaaab0f0c2380
i: 0xaaab0f0c23a0
After reallocations:
a1: 0xaaab0f0c2360
b1: 0xaaab0f0c2340
c1: 0xaaab0f0c2320
d1: 0xaaab0f0c2300
e1: 0xaaab0f0c22e0
f1: 0xaaab0f0c22c0
g1: 0xaaab0f0c22a0
h1: 0xaaab0f0c2380
i1: 0xaaab0f0c23a0
i2: 0xaaab0f0c23a0

Examples

  • Dragon Army. Hack The Box
  • рд╣рдо рдХреЗрд╡рд▓ Fast-Bin рдЖрдХрд╛рд░ рдХреЗ рдЪрдВрдХреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╕рд┐рд╡рд╛рдп рдЖрдХрд╛рд░ 0x70 рдХреЗ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп __malloc_hook рдУрд╡рд░рд░рд╛рдЗрдЯ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред
  • рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо Fast Bin dup (1/2 рдореМрдХрд╛) рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдХреЗ рд░реВрдк рдореЗрдВ 0x56 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ PIE рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  • рдПрдХ рд╕реНрдерд╛рди рдЬрд╣рд╛рдВ PIE рдкрддреЗ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ main_arena, рдЬреЛ Glibc рдХреЗ рдЕрдВрджрд░ рд╣реИ рдФрд░ __malloc_hook рдХреЗ рдкрд╛рд╕ рд╣реИред
  • рд╣рдо main_arena рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдлрд╕реЗрдЯ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡рд╣рд╛рдВ рдПрдХ рдЪрдВрдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ __malloc_hook рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрдВрдХреНрд╕ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рддрд╛рдХрд┐ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
  • zero_to_hero. PicoCTF
  • Tcache рдмрд┐рди рдФрд░ рдПрдХ null-byte рдУрд╡рд░рдлреНрд▓реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдПрдХ рдбрдмрд▓-рдлреНрд░реА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
  • рд╣рдо рдЖрдХрд╛рд░ 0x110 рдХреЗ рддреАрди рдЪрдВрдХреНрд╕ (A, B, C) рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
  • рд╣рдо B рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ
  • рд╣рдо A рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ null-byte рдУрд╡рд░рдлреНрд▓реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
  • рдЕрдм B рдХрд╛ рдЖрдХрд╛рд░ рдХреНрд╖реЗрддреНрд░ 0x100 рд╣реИ, 0x111 рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдореБрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдХрд╛рд░ 0x110 рдХрд╛ рдПрдХ Tcache-bin рдФрд░ рдЖрдХрд╛рд░ 0x100 рдХрд╛ рдПрдХ рд╣реИ рдЬреЛ рдЙрд╕реА рдкрддреЗ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдбрдмрд▓ рдлреНрд░реА рд╣реИред
  • рд╣рдо Tcache poisoning рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрдмрд▓ рдлреНрд░реА рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВред

References

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}