0% ont trouvé ce document utile (0 vote)
21 vues10 pages

Buffer Overflow

Le document traite du débordement de tampon, une vulnérabilité critique en cybersécurité, expliquant son fonctionnement, ses causes et ses conséquences. Il présente des exemples de code vulnérable, des outils de détection et des meilleures pratiques pour prévenir de telles attaques. L'importance de l'identification des bad characters et l'utilisation d'outils de sécurité sont également soulignées.

Transféré par

selmiana6
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
21 vues10 pages

Buffer Overflow

Le document traite du débordement de tampon, une vulnérabilité critique en cybersécurité, expliquant son fonctionnement, ses causes et ses conséquences. Il présente des exemples de code vulnérable, des outils de détection et des meilleures pratiques pour prévenir de telles attaques. L'importance de l'identification des bad characters et l'utilisation d'outils de sécurité sont également soulignées.

Transféré par

selmiana6
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

L'attaque par Débordement de Tampon

(Buffer OverFlow ou BOF)

Par : Jawad Errougui


ISGIM
IDOCS M210– Appliquer les méthodologies des tests d’intrusion

1. Introduction

• Définition du débordement de tampon : présentation du concept de base.


• Importance en cybersécurité : comprendre pourquoi le buffer overflow est une vulnérabilité
critique et souvent exploitée dans les attaques.

2. Conception de la Mémoire et Rôles des Registres de Processeur

Par : Jawad Errougui Page 2/10


ISGIM
IDOCS M210– Appliquer les méthodologies des tests d’intrusion

2.1. Organisation de la mémoire

• Segments de mémoire : présentation des principaux segments utilisés par un programme en


exécution, notamment la pile (Stack), le tas (Heap), les données statiques (Data Segment) et le
segment de code (Code Segment).
▪ Stack (Pile) : utilisée pour les appels de fonction et variables locales.
▪ Heap (Tas) : pour la mémoire dynamique allouée au moment de l'exécution.
▪ Data Segment : pour les données statiques et globales.
▪ Code Segment (Text) : pour les instructions de programme.

Par : Jawad Errougui Page 3/10


ISGIM
IDOCS M210– Appliquer les méthodologies des tests d’intrusion

2.2. La pile (Stack) et son rôle

• Description : la pile est une structure LIFO (Last In, First Out) utilisée pour gérer les fonctions
appelées par le programme et stocker les adresses de retour.
• Fonctionnement : la pile s'agrandit avec chaque nouvel appel de fonction et se réduit avec
chaque retour de fonction.
• Illustration : Un schéma illustrant la pile en tant que structure LIFO (Last In, First Out), avec
les valeurs des registres ESP, EBP et EIP représentées visuellement.
o Explication : Le but est de montrer comment le débordement de tampon modifie l'EIP,
redirigeant l'exécution du programme vers du code malveillant.
o Exemple d'Illustration :

2.3. Les registres essentiels

• EIP (Extended Instruction Pointer) : pointe vers la prochaine instruction à exécuter.


• ESP (Extended Stack Pointer) : pointe vers le sommet actuel de la pile.
• EBP (Extended Base Pointer) : sert de référence pour accéder aux variables locales dans la
pile.

Par : Jawad Errougui Page 4/10


ISGIM
IDOCS M210– Appliquer les méthodologies des tests d’intrusion

3. Introduction au Débordement de Tampon (Buffer Overflow)

3.1. Définition

• Qu'est-ce qu'un buffer ? Un espace mémoire utilisé pour stocker temporairement des données.
• Qu'est-ce qu'un débordement ? Lorsque des données écrites dépassent la taille limite du
buffer.

3.2. Comment fonctionne un Buffer Overflow ?

• Processus d'overflow : un débordement de tampon survient lorsqu'un programme tente d'écrire


plus de données que la taille allouée dans le buffer.

L’exemple de débordement de tampon est quand l’adresse de retour (EIP) est écrasée.

4. Comprendre l’attaque par Débordement de Tampon

4.1. Exemples de débordement de tampon

• Exemple simple en C : programme illustrant un débordement de tampon causé par strcpy()


sans vérification de taille.

Exemple de Code en C : Débordement de Tampon

#include <stdio.h>
#include <string.h>

void vulnerable_function(char *input) {


char buffer[64];
strcpy(buffer, input); // Débordement potentiel ici !
}

int main() {
char large_input[128] = "AAAA..."; // Trop long pour le
buffer
vulnerable_function(large_input);
return 0;
}

o Explication : Ce programme présente une fonction vulnérable qui peut entraîner un débordement
de tampon si l'entrée dépasse la taille de buffer. L’illustration de la pile et de l'EIP montre comment
un trop grand nombre de caractères « A » écrase l'adresse de retour

Par : Jawad Errougui Page 5/10


ISGIM
IDOCS M210– Appliquer les méthodologies des tests d’intrusion

Ce schéma montre comment la mémoire est segmentée et où les débordements de tampon peuvent
potentiellement interférer avec d'autres segments.

Outils de Debug (Exemple avec GDB et Immunity Debugger)

o Fournir des captures d'écran de l’utilisation de GDB ou Immunity Debugger pour


afficher l'EIP et visualiser les effets du débordement de tampon en direct.

4.2. Exploitation du débordement

• Écrasement de l'EIP : l'attaquant peut rediriger l'exécution vers du code malveillant (shellcode).
• shellcode : petits programmes exécutés pour donner à l'attaquant un accès ou des privilèges non
autorisés.
• Démonstration : test simple d'exécution d'un code malveillant en écrasant l'EIP.

4.3. Exemples pratiques de détection avec Immunity Debugger

• Comment utiliser Immunity Debugger ou GDB pour détecter et suivre l'exécution en mémoire.

5. Causes Fréquentes des Attaques par Débordement de Tampon

5.1. Absence de vérification des tailles de tampon

• Fonctions de C dangereuses comme strcpy, strcat sans vérification de la longueur.

5.2. Erreurs de codage et gestion inappropriée de la mémoire

• Variables mal dimensionnées, absence de validations des données d’entrée, etc.

5.3. Utilisation de fonctions non sécurisées

• Fonctions vulnérables : strcpy, printf, gets, scanf, etc.

Par : Jawad Errougui Page 6/10


ISGIM
IDOCS M210– Appliquer les méthodologies des tests d’intrusion

• Solutions : utiliser des alternatives plus sûres (strncpy, snprintf, etc.).

6. Les mauvais caractères (Bad Characters) dans un Buffer Overflow

Les bad characters (caractères indésirables) dans le contexte des attaques par débordement de tampon
sont des caractères qui peuvent perturber l'exécution correcte de la charge utile (payload) ou altérer les
données injectées, empêchant ainsi l'exploitation réussie de la vulnérabilité.

Ces caractères posent problème parce qu'ils :

1. Peuvent être interprétés de manière spéciale par le programme vulnérable ou par le protocole
utilisé.
2. Peuvent interrompre une chaîne de données ou tronquer la charge utile.
3. Peuvent être filtrés ou modifiés par le programme cible.

6.1 Exemples de Bad Characters

Voici des exemples courants de bad characters dans le contexte d’un débordement de tampon :

1. Caractère Null (\x00) :


o Il marque la fin d'une chaîne en C (terminateur nul). Si une charge utile contient \x00,
elle pourrait être coupée prématurément.
o Exemple :

c
Copier le code
char buffer[10];
strcpy(buffer, "AAAA\x00BBBB"); // La chaîne sera interprétée comme
"AAAA".

2. Retour chariot (\x0a) et saut de ligne (\x0d) :


o Souvent utilisés pour indiquer la fin d'une ligne ou d'une commande dans les protocoles
(par exemple, HTTP ou SMTP). Leur présence peut tronquer ou modifier le
comportement de la charge utile.
3. Caractères de contrôle (\x1a) :
o Certains programmes les interprètent comme des fins de fichier ou des signaux spéciaux.
4. Caractères spéciaux spécifiques aux protocoles :
o Exemple : Dans une URL, % ou / peut être interprété comme un délimiteur, modifiant
ainsi la charge utile.
5. Caractères échappés ou codés (\x5c, \x3b) :
o Exemple : Dans une commande shell, ; (\x3b) peut indiquer une fin de commande.

6.2 Étapes pour Identifier les Bad Characters

Lors d’une exploitation réelle, les étapes pour identifier les bad characters incluent :

1. Générer une chaîne de test contenant tous les caractères possibles (de \x01 à \xff).
Exemple en Python :

badchars = b"".join([bytes([i]) for i in range(1, 256)])

Par : Jawad Errougui Page 7/10


ISGIM
IDOCS M210– Appliquer les méthodologies des tests d’intrusion

(On exclut \x00 au départ car il est souvent évident qu’il est problématique.)

2. Envoyer cette chaîne à l’application vulnérable et analyser la réponse (par exemple, via un
débogueur comme Immunity Debugger ou GDB).
3. Comparer la chaîne reçue avec celle envoyée. Les caractères qui sont modifiés, filtrés ou
interrompent l'exécution sont identifiés comme des bad characters.

6.3 Exemple Concret : Détection de Bad Characters

Imaginons un scénario où nous exploitons un programme vulnérable et testons les caractères dans une
charge utile. Nous détectons que \x00, \x0a, et \x0d provoquent des problèmes.

• Charge utile de test envoyée : A...AAAA\x00\x01\x02...\x0d\x0e...\xff


• Résultat dans le débogueur : Les données sont tronquées après AAAA, indiquant que \x00 est un
bad character.

6.4 Tableau Résumant les Bad Characters

Représentation
Caractère Problème causé Contexte d'utilisation
hexadécimale
\x00
Termine une chaîne
Null Chaînes en C
prématurément
Retour \x0a
Protocoles réseau (HTTP,
Termine une commande
chariot SMTP)
\x0d
Termine une ligne ou
Saut de ligne Protocoles réseau
commande
\x1a
Interprété comme fin de
EOF Entrées standard et fichiers
fichier
Slash \x2f Délimite des chemins URL ou chemins UNIX
Point-virgule \x3b Sépare les commandes Shells
Antislash \x5c Échappe les caractères Chemins Windows et scripts

7. Comment Prévenir les Attaques par Débordement de Tampon ?

Dans les systèmes d'exploitation plus anciens ou dans des environnements n’assurant pas la gestion de
mémoire de manière sécurisée, les programmes étaient souvent chargés à des adresses mémoire fixes.
Cela signifie que chaque fois qu'un programme était exécuté, il était chargé à la même adresse dans la
mémoire. Par exemple :

• Le code exécutable d'un programme pourrait être chargé à l'adresse 0x00400000.


• Les bibliothèques partagées pourraient être chargées à des adresses spécifiques,
comme 0x7ffff000 pour [Link].
• La pile pourrait commencer à une adresse fixe, par exemple 0x7fffe000.

L'utilisation d'adresses fixes présente plusieurs inconvénients, notamment :

Par : Jawad Errougui Page 8/10


ISGIM
IDOCS M210– Appliquer les méthodologies des tests d’intrusion

• Prévisibilité : Les adresses mémoire étant fixes, un attaquant pouvait prédire où se trouvaient les
différentes parties d'un programme. Cela facilitait l'exploitation des vulnérabilités, comme les
débordements de tampon, car l'attaquant savait exactement où il devait diriger l'exécution du
programme.
• Exploitation des vulnérabilités : Par exemple, si un programme avait une vulnérabilité de
débordement de tampon, un attaquant pouvait injecter du code malveillant dans la mémoire et
écraser le pointeur de retour d'une fonction avec une adresse connue. Lorsque la fonction se
terminait, le programme retournerait à l'adresse corrompue, exécutant ainsi le code malveillant.
• Conflits d'adresses : Si plusieurs programmes étaient exécutés simultanément, il pouvait y avoir
des conflits d'adresses si deux programmes essayaient de charger des bibliothèques ou des
segments à la même adresse. Cela nécessitait des mécanismes de gestion de la mémoire plus
complexes

7.1. Meilleures pratiques en développement

• Valider les entrées : toujours vérifier la taille des entrées avant de les stocker dans un tampon.
• Utiliser des fonctions sécurisées : utiliser des fonctions limitées par taille (strncpy au lieu de
strcpy).

7.2. Mécanismes de sécurité supplémentaires

• Canaries de pile : ajout d'une valeur de contrôle qui signale toute corruption de pile.
• ASLR (Address Space Layout Randomization) : randomise les adresses mémoire pour rendre
l'attaque plus difficile.
• Non-executable stack (NX) : rend certaines parties de la mémoire non exécutables, empêchant
l'exécution de shellcode.

8. Outils de Détection des Débordements de Tampon

8.1. Outils de debug et d'analyse dynamique

• Immunity Debugger : pour les environnements Windows.


• GDB (GNU Debugger) : pour les environnements Linux.
• Valgrind : pour détecter les erreurs de mémoire sous Linux.

8.2. Outils de scan et de sécurité

• Fortify et Coverity : outils d’analyse statique pour détecter les vulnérabilités de débordement de
tampon dans le code.
• Metasploit Framework : permet de tester des débordements de tampon connus.

Par : Jawad Errougui Page 9/10


ISGIM
IDOCS M210– Appliquer les méthodologies des tests d’intrusion

9. Conclusion

• Récapitulatif : le débordement de tampon est une vulnérabilité critique en cybersécurité, qui


peut donner aux attaquants un contrôle total sur un programme.
• Importance des pratiques sécurisées : mettre en place des contrôles de taille de tampon,
utiliser des fonctions sécurisées, et exploiter les protections intégrées (comme ASLR et NX).
• Identification des bad characters : est primordiale lors de l’exploitation d’un débordement de
tampon. Leur identification permet de créer une charge utile robuste et fiable pour réussir une
exploitation.
• Utilisation des outils : importance de connaître les outils de debug et de sécurité pour analyser
et corriger les failles de buffer overflow.

Par : Jawad Errougui Page 10/10

Vous aimerez peut-être aussi