hacktricks/binary-exploitation/heap/house-of-einherjar.md

56 lines
4.2 KiB
Markdown

# Maison d'Einherjar
<details>
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Expert de l'équipe rouge HackTricks AWS)</strong></a><strong>!</strong></summary>
Autres façons de soutenir HackTricks :
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
</details>
## Informations de base
### Code
* Consultez l'exemple sur [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
* Ou celui sur [https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation](https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation) (vous devrez peut-être remplir le tcache)
### Objectif
* L'objectif est d'allouer de la mémoire à presque n'importe quelle adresse spécifique.
### Exigences
* Créer un faux chunk lorsque nous voulons allouer un chunk :
* Définir des pointeurs pour pointer vers lui-même pour contourner les vérifications de cohérence
* Décalage d'un sur un d'un chunk à un autre pour modifier le prev in use
* Indiquer dans le `prev_size` du chunk abusé par décalage d'un la différence entre lui-même et le faux chunk
* La taille du faux chunk doit également avoir été définie de la même taille pour contourner les vérifications de cohérence
* Pour construire ces chunks, vous aurez besoin d'une fuite de tas.
### Attaque
* Un faux chunk est créé à l'intérieur d'un chunk contrôlé par l'attaquant pointant avec `fd` et `bk` vers le chunk d'origine pour contourner les protections
* 2 autres chunks (`B` et `C`) sont alloués
* En abusant du décalage d'un dans le `B`, le bit `prev in use` est nettoyé et les données `prev_size` sont écrasées avec la différence entre l'endroit où le chunk `C` est alloué et le faux chunk `A` généré précédemment
* Ce `prev_size` et la taille dans le faux chunk `A` doivent être les mêmes pour contourner les vérifications.
* Ensuite, le tcache est rempli
* Ensuite, `C` est libéré pour qu'il se consolide avec le faux chunk `A`
* Ensuite, un nouveau chunk `D` est créé qui commencera dans le faux chunk `A` et couvrira le chunk `B`
* La maison d'Einherjar se termine ici
* Cela peut être poursuivi avec une attaque de fast bin :
* Libérer `B` pour l'ajouter au fast bin
* Le `fd` de `B` est écrasé pour le faire pointer vers l'adresse cible en abusant du chunk `D` (car il contient `B` à l'intérieur)&#x20;
* Ensuite, 2 mallocs sont effectués et le deuxième va **allouer l'adresse cible**
## Références et autres exemples
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad)
* Après la libération des pointeurs, ils ne sont pas annulés, il est donc toujours possible d'accéder à leurs données. Par conséquent, un chunk est placé dans le bac non trié et les pointeurs qu'il contient sont divulgués (fuite libc) puis un nouveau tas est placé dans le bac non trié et une adresse de tas est divulguée à partir du pointeur qu'il reçoit.