Buffer Overflow
description
Transcript of Buffer Overflow
A N AT O M Y O F A N E X P LO I T
BUFFER OVERFLOW
INTRODUCTION
• Le cas du Buffer Overflow
• Connu et documenté depuis 1978
• Fonctionnement de la mémoire
• Corruption de la mémoire
• Création d’un ‘Shell-code’
FONCTIONNEMENT DE LA MÉMOIRE
• Le buffer est une quantité de mémoire réservée pour être rempli par des données
• Le pointer est une adresse qui sert à référencer un endroit de la mémoire.
• La mémoire plate est un espace de mémoire continu (virtuel) qui permet au programme de n’avoir qu’un seul emplacement mémoire
LA PILE
• A chaque appel de fonction, la place est réservée et le pointeur se déplace
FONCTIONNEMENT DE LA MÉMOIRE
• Registres : • nSP (rsp) = Stack Pointer ( haut de la pile )• nIP = Instruction Pointer ( point d’éxécution)
• Big endian Vs Little endian
• NUL Terminated Strings 0x00 • « Texte » = 0x54 0x65 0x78 0x74 0x65 0x00• Le programme écrit jusqu’à arriver au NUL contenu dans
la String
PRISE DE CONTRÔLE
• Test des limites non effectués
• Ecriture sur les données suivantes dont les pointeurs.
• But est de faire pointer sur un endroit sur lequel l’attaquant peut écrire.
EXEMPLE
EXEMPLE
• On veut voir ce qu’il se passe lors du déroulement
• On met un break point avant l’allocation de mémoire et on compare.
EXEMPLE
• Avant
• Continue
• Apres
STACK SMACHING CORRUPTION DE VARIABLES
• La variable loggedin est initialisé avant la string password
• La valeur de loggedin est sous la string password dans la pile.
loggedin
Pointeur retour
STACK SMACHING CORRUPTION DES POINTEURS
• Pointeur de retour sauvé en fin de fonction
• Idée : Repointer vers un endroit ou l’on peut écrire, par exemple l’espace alloué à password
• Sous unix, utiliser les variables d’environnement
• En pratique on ne pointe pas directement sur le code malicieux
NOP SLED
• NOP = No-Operation• Permet de déplacer le pointeur d’instruction vers
le code à exécuter.
• Exemple : On ne sait pas ou l’on commence :1 : continue 6 : continue 2 : continue 7 : continue 3 : continue 8 : continue 4 : continue 9 : continue 5 : Exécuter 10 : Aller en 1
SHELL-CODE
• Shell-code généralement écrit en assembleur pour obtenir des OPCODES
• But : Faire apparaitre un root shell.
• Contraintes : • Caractères non utilisables ( 0x00 )• Taille restreinte ( souvent par le ou les buffers )
D’UN CODE MACHINE À UN SHELL-CODE
• Peut-on encore définir des variables au milieu du code ?
PROBLÈMES
• Ne fonctionne pas dans un buffer overflow
• Enlever les ‘NUL’ un à un
CODE SANS 0X00
AUTRES MAUVAIS CARACTÈRES
• 0x0a retour à la ligne• 0x09 tabulation• Remplaçable par 0x0d ( pas tout le temps )
• Résultat :
CONCLUSION
• Marche a suivre en 4 points :• Identification des vulnérabilités• Découverte des emplacements des objets et stabilisation• Construction du payload• Exploitation
• Faille propre à l’utilisation de la mémoire