First Fit

Reading time: 4 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

First Fit

Lorsque vous libérez de la mémoire dans un programme utilisant glibc, différents "bins" sont utilisés pour gérer les morceaux de mémoire. Voici une explication simplifiée de deux scénarios courants : les bins non triés et les fastbins.

Bins Non Triés

Lorsque vous libĂ©rez un morceau de mĂ©moire qui n'est pas un morceau rapide, il va dans le bin non triĂ©. Ce bin agit comme une liste oĂč de nouveaux morceaux libĂ©rĂ©s sont ajoutĂ©s Ă  l'avant (la "tĂȘte"). Lorsque vous demandez un nouveau morceau de mĂ©moire, l'allocateur examine le bin non triĂ© depuis l'arriĂšre (la "queue") pour trouver un morceau suffisamment grand. Si un morceau du bin non triĂ© est plus grand que ce dont vous avez besoin, il est divisĂ©, la partie avant Ă©tant retournĂ©e et la partie restante restant dans le bin.

Exemple :

  • Vous allouez 300 octets (a), puis 250 octets (b), vous libĂ©rez a et demandez Ă  nouveau 250 octets (c).
  • Lorsque vous libĂ©rez a, il va dans le bin non triĂ©.
  • Si vous demandez Ă  nouveau 250 octets, l'allocateur trouve a Ă  la queue et le divise, retournant la partie qui correspond Ă  votre demande et gardant le reste dans le bin.
  • c pointera vers le prĂ©cĂ©dent a et sera rempli avec les a's.
c
char *a = malloc(300);
char *b = malloc(250);
free(a);
char *c = malloc(250);

Fastbins

Les fastbins sont utilisĂ©s pour de petits morceaux de mĂ©moire. Contrairement aux unsorted bins, les fastbins ajoutent de nouveaux morceaux Ă  la tĂȘte, crĂ©ant un comportement de dernier entrĂ©, premier sorti (LIFO). Si vous demandez un petit morceau de mĂ©moire, l'allocateur prendra Ă  partir de la tĂȘte du fastbin.

Exemple :

  • Vous allouez quatre morceaux de 20 octets chacun (a, b, c, d).
  • Lorsque vous les libĂ©rez dans n'importe quel ordre, les morceaux libĂ©rĂ©s sont ajoutĂ©s Ă  la tĂȘte du fastbin.
  • Si vous demandez ensuite un morceau de 20 octets, l'allocateur renverra le morceau le plus rĂ©cemment libĂ©rĂ© de la tĂȘte du fastbin.
c
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

Autres Références & Exemples

  • https://heap-exploitation.dhavalkapil.com/attacks/first_fit
  • https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/
  • ARM64. Utilisation aprĂšs libĂ©ration : GĂ©nĂ©rer un objet utilisateur, le libĂ©rer, gĂ©nĂ©rer un objet qui obtient le morceau libĂ©rĂ© et permettre d'Ă©crire dessus, Ă©crasant la position de user->password de l'ancien. RĂ©utiliser l'utilisateur pour contourner la vĂ©rification du mot de passe
  • https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example
  • Le programme permet de crĂ©er des notes. Une note aura les informations de la note dans un malloc(8) (avec un pointeur vers une fonction qui pourrait ĂȘtre appelĂ©e) et un pointeur vers un autre malloc(<size>) avec le contenu de la note.
  • L'attaque consisterait Ă  crĂ©er 2 notes (note0 et note1) avec des contenus malloc plus grands que la taille des informations de la note, puis Ă  les libĂ©rer pour qu'elles entrent dans le fast bin (ou tcache).
  • Ensuite, crĂ©er une autre note (note2) avec une taille de contenu de 8. Le contenu va se trouver dans note1 car le morceau va ĂȘtre rĂ©utilisĂ©, oĂč nous pourrions modifier le pointeur de fonction pour pointer vers la fonction win et ensuite utiliser aprĂšs libĂ©ration note1 pour appeler le nouveau pointeur de fonction.
  • https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html
  • Il est possible d'allouer de la mĂ©moire, d'Ă©crire la valeur dĂ©sirĂ©e, de la libĂ©rer, de la rĂ©allouer et comme les donnĂ©es prĂ©cĂ©dentes sont toujours lĂ , elles seront traitĂ©es selon la nouvelle structure attendue dans le morceau, rendant possible de dĂ©finir la valeur ou d'obtenir le drapeau.
  • https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html
  • Dans ce cas, il est nĂ©cessaire d'Ă©crire 4 Ă  l'intĂ©rieur d'un morceau spĂ©cifique qui est le premier allouĂ© (mĂȘme aprĂšs avoir forcĂ© la libĂ©ration de tous). Pour chaque nouveau morceau allouĂ©, son numĂ©ro dans l'index du tableau est stockĂ©. Ensuite, allouer 4 morceaux (+ le morceau initialement allouĂ©), le dernier contiendra 4 Ă  l'intĂ©rieur, les libĂ©rer et forcer la rĂ©allocation du premier, qui utilisera le dernier morceau libĂ©rĂ©, qui est celui avec 4 Ă  l'intĂ©rieur.