Pb en C pour réalisr un overflow sous Ubuntu

Résolu/Fermé
panxhito Messages postés 4 Date d'inscription mardi 29 septembre 2009 Statut Membre Dernière intervention 9 juin 2010 - 29 sept. 2009 à 13:48
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 - 30 sept. 2009 à 09:41
Bonjour,

étant un newbie en C et sous linux j'ai acheté un bouquin de prog en C et j'ai installé Ubuntu. le bouquin est sympa et propose des exercices variées, celui qui me pose prob est censé illustrer les conséquences d'un overflow. exercice basique, j'ai reproduit le code :

int check_authentication(char *password){
int auth_flag = 0;
char password_buffer[16];

strcpy(password_buffer,password);

if (strcmp ( password_buffer,"toto") == 0 )
authflag = 1;

return auth_flag;
}

int main(int argc,char *argv[]){
if (argc <2 ){
mess de pb
}

if (check_authentication(argv[1]) {
mess de succès
} else {
mess de refus
}


bon donc en test avec "toto" comme arg ça marche bien, puis le bouquin propose de faire un test avec " AAAAAAAAAA....AAA" ( soit 30 fois A)
le livre décrit ensuite sous gdb le déroulement du programme : le password_buffer aura été défini à l'adresse 0xbffff7a0 alors que le auth_flag sera à l'adresse 0xbffff7bc. il y a donc une différence de 28 octets entre les 2: la ligne de "AAA..AAA" en argument aura comme conséquence de dépasser le tampon et de modifier la variable de auth_flag, et donc le test d'authentication sera validé alors qu'il n'aurait pas du. voila donc ça c'était pour montrer que j'ai bien compris le fonctionnement, merci vincent, et alors mon pb c qu'en faisant ce test la sous mon environnement linux , distri Ubuntu, ça ne marche pas .

en fait, le bouquin propose en exercice suivant la modification suivante; au lieu de :

int check_authentication(char *password){
int auth_flag = 0;
char password_buffer[16];

on aura

int check_authentication(char *password){
char password_buffer[16];
int auth_flag=0;


dans ce cas la, d'après le bouquin, auth_flag aura une adresse inférieur au password_buffer; donc il n'y aura pas d'écrasement de mémoire (mais d'autres pb qui ne m'intéressent pas ici )




MON pb est donc que dans les 2 cas de figure, 1er exercice puis modification du suivant, le auth_flag a une adresse inférieure au password_buffer, et je ne peux donc pas tester l'overflow.

au nivo de ma config j'ai un proce AMD Thurion 64 bits , et donc une distri Ubuntu. J'ai lu en l'installant que Ubuntu était plutot destiné à des newbies sur Linux, donc je me suis dis que peut être cette distri avait je sais pas des options empechant justemetn ce genre de probleme d'arriver, et donc limitant la liberté du codeur ? ou bien y aurait-il une autre raison ?

d'avance merci
vincent
A voir également:

2 réponses

Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
29 sept. 2009 à 13:57
les conséquences d'un buffer overflow sont souvent aléatoires. ca dépend un peu du compilateur que tu utilises

essayes ceci (ca devrai bien te faire planter un peu tout ca ;)

char test1[20];
char* test2 = test1 + 20


maintenant, tu fais un

strcpy(test1,"coucou je suis la string de la mort de l'overflow");
printf("String 1:%s\r\n",test1);
printf("String 2:%s\r\n",test2);

si tu n'as pas de problèmes, tu devrais obtenir à l'affichage:

String 1: coucou je suis la string de la mort de l'overflow
String 2: ring de la mort de l'overflow

tu vois donc que string2 contient des données qu'elle n'est pas sensé contenir

(il est possible que ca plante à l'execution... du à l'overflow ;)
0
panxhito Messages postés 4 Date d'inscription mardi 29 septembre 2009 Statut Membre Dernière intervention 9 juin 2010
30 sept. 2009 à 09:08
d'accord , merci.
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
30 sept. 2009 à 09:41
je vois que le sujet est en résolu. L'exemple a marché ?
0