Comprendre le Heap Spraying avec Pwndbg
Pwndbg est une extension pour GDB conçue pour simplifier le développement d'exploits et l'ingénierie inverse. L'une de ses fonctionnalités avancées est la commande spray, qui permet d'effectuer du heap spraying. Cette technique consiste à allouer massivement des objets dans le tas mémoire contenant des données spécifiques, augmentant ainsi la probabilité qu'une adresse cible soit écrasée. Elle est couramment utilisée dans l'exploitation de vulnérabilités telles que les dépassements de tampon ou les Use-After-Free.
Utilisation de la commande spray
La commande est accessible directement dans GDB après le chargement de Pwndbg. Sa syntaxe générale est la suivante :
spray [options] <adresse_debut> [taille]
<h3>Paramètres clés :</h3>
<adresse_debut>: L'adresse de départ pour l'écriture en mémoire.[taille]: Longueur optionnelle des données à écrire. Si omise, l'écriture se poursuit jusqu'à la fin de la page mémoire courante.--value <valeur>: Définit une valeur spécifique à écrire. Peut être une chaîne de caractères (ex: "A") ou une valeur hexadécimale préfixée par0x.-x: Restreint l'écriture aux adresses pointant vers des fonctions dans des pages exécutables (fonctionnalité spécifique).
Mise en pratique : Étapes et Exemples
1. Préparation de l'environnement
Pour utiliser Pwndbg, clonez le dépôt et exécutez le script d'installation :
git clone https://gitcode.com/GitHub_Trending/pw/pwndbg cd pwndbg ./setup.sh
<p>Chargez ensuite votre binaire cible dans GDB : <code>gdb ./programme_cible</code>.</p>
<h3>2. Exécution d'un spray basique</h3>
<p>L'exemple le plus simple initialise le remplissage depuis une adresse donnée avec un motif récurrent :</p>
<code># Démarre le spray depuis 0x7ff7e1a00000 jusqu'à la fin de la page.
spray 0x7ff7e1a00000</code>
<p>Pour contrôler la taille et la valeur :</p>
<code># Écrit 0xcafebabe sur 4096 octets à partir de l'adresse spécifiée.
spray 0x7ff7e1a00000 4096 --value 0xcafebabe</code>
<h3>3. Visualisation de l'état du tas</h3>
<p>Il est essentiel de visualiser la mémoire avant et après le spray pour comprendre les changements. Utilisez des commandes comme <code>vis_heap_chunks</code> pour inspecter les blocs alloués et <code>vmmap</code> pour observer les régions mémoire globales.</p>
<code># Affiche une carte des régions mémoire du processus.
vmmap</code>
<h3>4. Technique avancée : Ciblage des pointeurs de fonction</h3>
<p>L'option <code>-x</code> (alias <code>--only-funcptrs</code>) est particulièrement utile lors de l'exploitation de certaines vulnérabilités. Elle modifie uniquement les pointeurs qui désignent des adresses dans des segments exécutables.</p>
<code># Remplit 8192 octets à l'adresse donnée avec la valeur 0x404000, en ciblant les pointeurs de fonction.
spray 0x7ff7e1a00000 8192 --value 0x404000 -x</code>
<h2>Résolution de problèmes courants</h2>
<h3>Permissions mémoire</h3>
<p>Une erreur d'écriture survient généralement si la région mémoire ciblée n'est pas accessible en écriture. Vérifiez ses permissions avec <code>vmmap</code> avant d'exécuter <code>spray</code>.</p>
<code>vmmap 0x7ff7e1a00000
# Vérifier que la colonne 'Perm' contient 'w' (écriture).</code>
<h3>Calcul et formats de la valeur</h3>
<p>La taille, si non spécifiée, est calculée automatiquement. La valeur peut être passée sous forme de texte ou d'hexadécimal :</p>
<code># Spray avec la valeur ASCII 'A' (0x41)
spray 0x7ff7e1a00000 1024 --value "A"
# Spray avec une valeur sur 32 bits
spray 0x7ff7e1a00000 1024 --value 0x41414141</code>
<h2>Application : Exploitation d'un UAF</h2>
<p>Considérons un scénario typique d'exploitation Use-After-Free :</p>
<ol>
<li>Exécutez le programme jusqu'au point où la vulnérabilité libère un bloc mémoire crucial.</li>
<li>Utilisez <code>spray</code> pour écraser ce bloc fraîchement libéré (et réutilisé) avec l'adresse d'un shellcode ou d'une fonction dangereuse.</li>
<li>Provoquez à nouveau l'accès au pointeur dangling, qui pointera désormais vers les données contrôlées par le spray.</li>
</ol>
<code># Étape 1 : Visualiser l'état initial.
vis_heap_chunks
# Étape 2 : Remplacer le contenu du tas avec une adresse arbitraire (ex: shellcode)
spray 0x556b12340000 2048 --value 0x7ffff7e12345
# Étape 3 : Vérifier la modification.
vis_heap_chunks
# Étape 4 : Poursuivre l'exécution pour déclencher l'exploitation.
continue</code>