hacktricks/binary-exploitation/libc-heap/house-of-force.md

7.1 KiB

Maison de la Force

{% hint style="success" %} Apprenez et pratiquez le piratage AWS :Formation HackTricks AWS Red Team Expert (ARTE)
Apprenez et pratiquez le piratage GCP : Formation HackTricks GCP Red Team Expert (GRTE)

Soutenez HackTricks
{% endhint %}

Informations de base

Code

  • Cette technique a été corrigée (ici) et produit cette erreur : malloc(): corrupted top size
  • Vous pouvez essayer le code d'ici pour le tester si vous le souhaitez.

Objectif

  • L'objectif de cette attaque est de pouvoir allouer un morceau dans une adresse spécifique.

Exigences

  • Un débordement qui permet de remplacer la taille de l'en-tête du morceau supérieur (par exemple, -1).
  • Pouvoir contrôler la taille de l'allocation du tas

Attaque

Si un attaquant souhaite allouer un morceau à l'adresse P pour remplacer une valeur ici. Il commence par remplacer la taille du morceau supérieur par -1 (peut-être avec un débordement). Cela garantit que malloc n'utilisera pas mmap pour toute allocation car le morceau supérieur aura toujours suffisamment d'espace.

Ensuite, calculez la distance entre l'adresse du morceau supérieur et l'espace cible à allouer. Cela est nécessaire car un malloc de cette taille sera effectué pour déplacer le morceau supérieur à cette position. C'est ainsi que la différence/taille peut être facilement calculée:

// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/

Par conséquent, allouer une taille de cible - old_top - 4*sizeof(long) (les 4 longs sont dus aux métadonnées du chunk supérieur et du nouveau chunk lors de l'allocation) déplacera le chunk supérieur à l'adresse que nous voulons écraser. Ensuite, effectuez un autre malloc pour obtenir un chunk à l'adresse cible.

Références et Autres Exemples