Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 hmm!

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 big_smile !

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> big_smile
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 hmm!
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