#1 Le 15/10/2008, à 17:42
- SamueLinux
Exploits & Buffer Overflow ! Impossible d'effacer le registre $eip...
Bonjour à tous,
depuis peu je me penche sur les buffers overflows et j'ai quelque souci !
Je vous poste le fichier contenant la faille :
/* Fichier vuln1.c */
#include <stdio.h>
int main (int argc, char *argv[])
{
char buffer[256];
if (argc > 1)
strcpy (buffer, argv[1]);
}
Tout d’abord, j'active la création de fichiers core lors de segfault d’un programme :
ulimit -c 100000
Ensuite je lance mon programme vulnérable de manière à écraser l’adresse de retour par la valeur 0x41414141 (« AAAA » en ASCII) :
./vuln1 `perl -e 'print "B"x260'`AAAA
Segmentation fault (core dumped)
Le fichier core a été dumpé dans le répertoire du programme vulnérable. Je lance maintenant gdb sur le fichier core afin de pouvoir l’analyser :
gdb -c core -q
Core was generated by `./vuln1
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BB'.
Program terminated with signal 11, Segmentation fault.
#0 0x41414141 in ?? ()
(gdb) p $eip
$1 = (void *) 0x41414141
(gdb) p $esp
$2 = (void *) 0xbffff834
Ceci est le résultat d'un exemple que j'ai trouvé, je vous pose maintenant mon problème
Donc, tout marche correctement sauf quand je fais un "gdb -c core -q" et que j'affiche l'adresse du registre $eip... J'ai l'impression qu'il n'arrive pas à me remplacé ce registre!
gdb -c core -q
(no debugging symbols found)
Core was generated by `BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'.
Program terminated with signal 11, Segmentation fault.
[New process 13339]
#0 0xb7e2384f in ?? ()
(gdb) p $eip
$1 = (void (*)()) 0xb7e2384f
(gdb) p $esp
$2 = (void *) 0xbfade320
(gdb)
Voila, normalement le registre $eip devrait avoir comme adresse 0x41414141...!
Merci pour votre aide, car la je bloque !
Hors ligne
#2 Le 16/10/2008, à 12:52
- jofab
Re : Exploits & Buffer Overflow ! Impossible d'effacer le registre $eip...
Bonjour,
avant de commencer change #include <stdio.h> -> #include <string.h>
Pour ton problème :
J'imagine que tu veux ecraser ta pile avec les bonnes valeurs, juste sur la zone correspondant à la valeur de retour de ip ?
Dans ce cas, tu as certainement mal positionné ton motif AAAA dans ta zone de donnée. Pour t'en convaincre :
tappe
./vuln1 `perl -e 'print "A"x260'`AAAA
puis refait
./vuln1 `perl -e 'print "B"x???'`AAAA
en changeant progressivement la taille (les 3 ???)...
Amuse toi bien...
Hors ligne
#3 Le 16/10/2008, à 17:42
- SamueLinux
Re : Exploits & Buffer Overflow ! Impossible d'effacer le registre $eip...
Ok, pour l'include lol !
Oui voila je veux écraser le registre $eip pour ensuite faire pointer la pile sur le shellcode que je compte injecté plus tard... !
J'ai suivit ton explication mais je pense qu'il y a encore un problème... !;)
Lorsque je tappes ceci :
./vuln1 `perl -e 'print "B"x260'`AAAA
Ensuite j'affiche les valeurs du registre $esp, $eip :
(gdb) p $esp
$1 = (void *) 0x4242423e
(gdb) p $eip
$3 = (void (*)()) 0x80483c4
Et donc c'est là que je comprends pas... Pourquoi le registre $esp à été écrasé alors sa devrait être le $eip ? Merci pour votre aide, peut être que cela viens de ma plateforme ?
Hors ligne
#4 Le 16/10/2008, à 19:54
- nicolas.sitbon
Re : Exploits & Buffer Overflow ! Impossible d'effacer le registre $eip...
Rien à voir avec la plateforme, tu ne peux pas écraser le registre EIP. Pour ça tu dois utiliser une autre methode, généralement on écrase l'adresse de retour de la fonction.
Cordialement.
Hors ligne