190 likes | 326 Views
Buffer Overflow. Anatomy of an exploit. 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.
E N D
Buffer Overflow Anatomy of an exploit
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) • Bigendian Vs Littleendian • 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 • 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
StackSmachingCorruption 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
StackSmachingCorruption 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 rootshell. • 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
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