hacktricks/binary-exploitation/heap/heap-overflow.md

67 lines
8.1 KiB
Markdown

# Débordement de tas
<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 en équipe rouge AWS de HackTricks)</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
Un débordement de tas est comme un [**débordement de pile**](../stack-overflow/) mais dans le tas. Fondamentalement, cela signifie qu'un espace a été réservé dans le tas pour stocker des données et que **les données stockées étaient plus grandes que l'espace réservé**.
Dans les débordements de pile, nous savons que certains registres comme le pointeur d'instruction ou le cadre de pile vont être restaurés à partir de la pile et il pourrait être possible d'en abuser. En cas de débordement de tas, il **n'y a aucune information sensible stockée par défaut** dans le morceau de tas qui peut être débordé. Cependant, il pourrait s'agir d'informations sensibles ou de pointeurs, donc la **criticité** de cette vulnérabilité **dépend** de **quelles données pourraient être écrasées** et comment un attaquant pourrait en abuser.
{% hint style="success" %}
Pour trouver les décalages de débordement, vous pouvez utiliser les mêmes motifs que dans les [**débordements de pile**](../stack-overflow/#finding-stack-overflows-offsets).
{% endhint %}
### Débordements de pile vs débordements de tas
Dans les débordements de pile, l'agencement et les données qui seront présentes dans la pile au moment où la vulnérabilité peut être déclenchée sont assez fiables. Cela est dû au fait que la pile est linéaire, augmentant toujours dans la mémoire en collision, à **des endroits spécifiques de l'exécution du programme, la mémoire de pile stocke généralement un type de données similaire** et elle a une structure spécifique avec certains pointeurs à la fin de la partie de pile utilisée par chaque fonction.
Cependant, dans le cas d'un débordement de tas, parce que la mémoire utilisée n'est pas linéaire mais **les morceaux alloués sont généralement à des positions séparées de la mémoire** (pas les uns à côté des autres) en raison des **bacs et des zones** séparant les allocations par taille et parce que **la mémoire précédemment libérée est utilisée** avant d'allouer de nouveaux morceaux. Il est **compliqué de savoir quel objet va entrer en collision avec celui vulnérable** à un débordement de tas. Ainsi, lorsqu'un débordement de tas est trouvé, il est nécessaire de trouver un **moyen fiable de faire en sorte que l'objet désiré soit le suivant en mémoire** à partir de celui qui peut être débordé.
Une des techniques utilisées pour cela est le **démêlage de tas** qui est utilisé par exemple [**dans ce post**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). Dans le post, il est expliqué comment dans le noyau iOS, lorsqu'une zone manque de mémoire pour stocker des morceaux de mémoire, elle l'agrandit d'une page de noyau, et cette page est divisée en morceaux des tailles attendues qui seraient utilisés dans l'ordre (jusqu'à la version iOS 9.2, puis ces morceaux sont utilisés de manière aléatoire pour compliquer l'exploitation de ces attaques).
Par conséquent, dans le post précédent où un débordement de tas se produit, afin de forcer l'objet débordé à entrer en collision avec un ordre victime, plusieurs **`kallocs` sont forcés par plusieurs threads pour essayer de s'assurer que tous les morceaux libres sont remplis et qu'une nouvelle page est créée**.
Pour forcer ce remplissage avec des objets d'une taille spécifique, l'**allocation hors ligne associée à un port mach iOS** est un candidat idéal. En ajustant la taille du message, il est possible de spécifier exactement la taille de l'allocation `kalloc` et lorsque le port mach correspondant est détruit, l'allocation correspondante sera immédiatement libérée à `kfree`.
Ensuite, certains de ces espaces réservés peuvent être **libérés**. La liste de libération **`kalloc.4096` libère les éléments dans un ordre dernier entré, premier sorti**, ce qui signifie essentiellement que si certains espaces réservés sont libérés et que l'exploit essaie d'allouer plusieurs objets victimes tout en essayant d'allouer l'objet vulnérable au débordement, il est probable que cet objet sera suivi d'un objet victime.
### Exemple libc
[**Sur cette page**](https://guyinatuxedo.github.io/27-edit\_free\_chunk/heap\_consolidation\_explanation/index.html), il est possible de trouver une émulation de débordement de tas de base qui montre comment en écrasant le bit prev in use du morceau suivant et la position de la taille prev, il est possible de **consolider un morceau utilisé** (en le faisant croire qu'il est inutilisé) et **ensuite de l'allouer à nouveau** en pouvant écraser des données qui sont utilisées dans un autre pointeur également.
Un autre exemple de [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap0/index.html) montre un exemple très basique d'un CTF où un **débordement de tas** peut être exploité pour appeler la fonction gagnante et **obtenir le drapeau**.
Dans l'exemple [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap1/index.html), il est possible de voir comment en abusant d'un dépassement de tampon, il est possible de **écraser dans un morceau proche une adresse****des données arbitraires de l'utilisateur** vont être écrites.
### Exemple ARM64
Sur la page [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/), vous pouvez trouver un exemple de débordement de tas où une commande qui va être exécutée est stockée dans le morceau suivant à partir du morceau débordé. Ainsi, il est possible de modifier la commande exécutée en l'écrasant avec une exploitation facile telle que :
```bash
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
```
<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 AWS de HackTricks)</strong></a><strong>!</strong></summary>
D'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>