# DĂ©bordement de tas
{% hint style="success" %}
Apprenez et pratiquez le piratage AWS :
[**Formation HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)
\
Apprenez et pratiquez le piratage GCP :
[**Formation HackTricks GCP Red Team Expert (GRTE)**
](https://training.hacktricks.xyz/courses/grte)
Soutenez HackTricks
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop)!
* **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 des 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.
{% endhint %}
## Informations de base
Un débordement de tas est similaire à 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 fragment 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, dans **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, la mĂ©moire utilisĂ©e n'est pas linĂ©aire mais **les fragments 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 fragments. 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Ă©.
L'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 fragments de mĂ©moire, elle l'agrandit d'une page de noyau, et cette page est divisĂ©e en fragments des tailles attendues qui seraient utilisĂ©es dans l'ordre (jusqu'Ă la version iOS 9.2, puis ces fragments 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, pour 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 fragments 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 écrivant le bit prev in use du fragment suivant et la position de la taille prev, il est possible de **consolider un fragment utilisé** (en le faisant croire qu'il est inutilisé) et **ensuite le réallouer** 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 d'**Ă©craser dans un fragment proche une adresse** oĂč **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 fragment suivant Ă partir du fragment 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
```
### Autres exemples
* [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
* Nous utilisons une vulnérabilité de débordement d'entier pour obtenir un débordement de tas.
* Nous corrompons les pointeurs vers une fonction à l'intérieur d'une `struct` du bloc débordé pour définir une fonction telle que `system` et obtenir l'exécution de code.
{% hint style="success" %}
Apprenez et pratiquez le piratage AWS :
[**Formation HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)
\
Apprenez et pratiquez le piratage GCP :
[**Formation HackTricks GCP Red Team Expert (GRTE)**
](https://training.hacktricks.xyz/courses/grte)
Soutenez HackTricks
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop)!
* **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 des 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.
{% endhint %}