L'idée d'utiliser plus d'espace que vous n'en avez reçu, et donc de déborder dans un champ différent, est assez simple à visualiser. Mais il n'est probablement pas clair comment cela peut conduire un méchant à exécuter son propre code.
Ceci est assez simple à expliquer si vous le comprenez assez bien. Assurez-vous simplement de toucher le contexte important. Plus ou moins dans cet ordre:
-
La "pile" est un endroit où vous pouvez stocker des informations temporaires. Le "pointeur de pile" détermine où se trouve la fin de la pile. Lorsqu'une fonction s'exécute, elle déplace le pointeur de pile pour se donner de la mémoire pour travailler, et quand c'est fait, elle ramène le pointeur là où elle l'a trouvé.
-
La pile s'agrandit. en arrière. Donc, pour vous donner 100 octets sur la pile, vous soustrayez 100 du pointeur de pile plutôt que de l'ajouter. Si la pile de la fonction précédente commençait à 1000 et je veux 100 octets, alors ma pile commence à 900.
-
Cela signifie que si vous utilisez plus d'espace que vous ne vous en avez donné, vous avez gagné ne continuez pas à écrire dans un espace vide, vous allez en fait commencer à écraser les valeurs précédentes de la pile.
-
Lorsque ma fonction démarre, la valeur la plus élevée à gauche sur la pile pour moi par la fonction précédente est l ' adresse de retour où je devrais aller quand ma fonction est terminée.
-
Cela signifie que si mon la fonction écrase sa pile, la toute première chose qu’elle va écraser est l’adresse de retour. Si l'attaquant fait attention à ce avec quoi il remplit la pile, il peut spécifier l'adresse de retour qu'il veut.
-
Quand ma fonction existe, quel que soit le code qui se trouve à cette adresse de retour, c'est quoi sera exécuté ensuite.
Exemple simple
Dans Smashing the Stack for Fun and Profit, où cette technique était à l'origine décrit, la technique la plus simple et la plus directe a été introduite. Imaginez que la fonction lit votre nom puis retourne. Donc, votre pile ressemble à ceci:
Pointeur de pile Préc. Stack Ptr + ---------------------------------- + ------------- - + ................ | Votre nom ici | Retour Addr | Ancienne pile ... + ---------------------------------- + --------- ----- + ................
Mais le méchant rend son nom assez long pour déborder d'espace. Et non seulement cela, au lieu de taper un vrai nom, il tape du mauvais code, du remplissage et l'adresse de ce mauvais code.
+ --------- ------------------------- + -------------- + ......... ....... | [Code maléfique] xxxxxxxxxxxxxxxxxxxxxx Adresse maléfique | Ancienne pile ... + ---------------------------------- + --------- ----- + ................ ▲ ──────────────────────────── ───────┘
Maintenant, au lieu de revenir à l'appelant précédent, vous passez directement au [Evil Code]
. Maintenant, vous exécutez son code au lieu de votre programme. À partir de là, la partie est pratiquement terminée.
Atténuation et autres techniques
Deux des techniques utilisées pour réduire l'efficacité du smashing de pile sont le DEP et l'ASLR.
DEP ("Data Execution Prevention") fonctionne en marquant la pile comme non exécutable. Cela signifie que le [Evil Code]
sur la pile ne fonctionnera pas, car l'exécution de code sur la pile n'est plus autorisée. Pour contourner cela, l'attaquant trouve des morceaux de code existant qui feront des morceaux de ce qu'il veut. Et au lieu de simplement écraser sa propre adresse de retour, il crée une chaîne d'adresses de retour dans la pile pour toutes les fonctions qu'il souhaite exécuter à tour de rôle. Ils appellent cela "Programmation orientée retour", ou ROP. La chaîne de retours est appelée «chaîne ROP». C'est vraiment difficile à faire. Mais il existe des outils pour vous aider.
ASLR ("Address Space Layout Randomization") fonctionne en randomisant les emplacements de toutes les fonctions intéressantes. Maintenant, créer une chaîne ROP n'est pas si facile - chaque fois que le programme s'exécute, toutes les adresses se trouvent à des endroits différents. Ainsi, lorsque l'attaquant écrase l'adresse de retour avec sa propre adresse malveillante, il ne saura pas quels numéros utiliser car le code est toujours à des endroits différents.
Ni DEP ni ASLR n'offrent beaucoup à eux seuls protection, mais les deux ensemble rendent l’exploitation réussie très difficile. Bien que certains contournements existent parfois, il n’existe pas de solution de contournement qui fonctionne partout . Si vous pouvez contourner DEP + ASLR, c'est une sorte de succès unique.