logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» [général] Buffer overflow
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [général] Buffer overflow  (Lu 3921 fois)
the lsd
Administrateur

Profil challenge

Classement : 190/54318

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« le: 20 Décembre 2005 à 11:25:07 »

Je me posais la question l'autre jour jour du comment du pourkoi d'un buffer overflow...
Je savais que c'etait un dépassement de la mémoire tampon, mais a part ca pas grand chose

Du coup je me suis dit : "Mon grand, Google est ton ami:!:" Sauf que google il m'a pas aidé beaucoup, parce que moi avoir pas compris ce qu'il disait...

Alors si quelqu'un pouvait me des donner des liens "compréhensible" sur le buffer overflow, ou meme expliquer comment ca marche, je suis preneur.

Merki
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
comtezero

Profil challenge

Classement : 2120/54318

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1001


Voir le profil WWW
« #1 le: 20 Décembre 2005 à 14:18:08 »

C'est la goutte qui fait deborder le vase.  
Journalisée

·´¯`·­»Comtezero«­·´¯`·

http://www.masstek.org
SeVeN
Relecteur

Profil challenge

Classement : 45/54318

Membre Senior
*
Hors ligne Hors ligne
Messages: 286


Voir le profil
« #2 le: 24 Décembre 2005 à 01:11:20 »

Bah c'est pas compliqué, le programmeur a prévu 15 petites cases pour stoquer les données, et hop pas de chance, on veut en écrire 30. Donc y'en a 15 qui se balade dans la mémoire là où elles ne devraient pas (à la suite des 15 premieres autorisées) Apres, l'exploitation d'un buffer overflow consiste a écrire par dessus des données existantes afin de modifier eip par exemple, pour qu'il pointe vers une bout de code à nous, une fonction qu'on veut executer.
Journalisée

-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d- s+:- a-- C+++ UL++ P++ L++ E W++ N+ o-- K- w++
O-- M V- PS+ PE++ Y+ PGP t 5 X++ R+ tv-- b+ DI D+
G e- h+ r- y+
------END GEEK CODE BLOCK------
neoflo
Profil challenge

Classement : 8124/54318

Membre Complet
***
Hors ligne Hors ligne
Messages: 171


Voir le profil WWW
« #3 le: 06 Janvier 2006 à 22:56:46 »

Code:
#include <stdlib.h>
#include <stdio.h>

int main ()
{
 int numero_client = 1234;
 int argent_client = 12;
 char nom_client[4];
 
 
 printf("Veuillez entrer votre nom :");
 scanf("%s", nom_client);
 
 printf("Vous disposez d'un crédit de %d euros%", argent_client);
 

 return EXIT_SUCCESS;      
}
Pour un 32 bits (PC) la zone mémoire est rangé comme suit:

NOM_CLIENT = 4 octets | ARGENT_CLIENT = 4octers | NUMERO_CLIENT = 4 octers (on est sur un PC en général avec la norme BIG ENDIAN (ou LITTLE en fait, je confond toujours, mais la mémoire est rangé dans l'ordre inverse))

Ainsi, si on écrit la chaine "aaaa", elle est en réalité de 5 octers car elle finit par le caractère \0, ainsi, l'argent client va valoir 0 car on aura écrasé cette zone mémoire et la programme affichera qu'on a un crédit de 0€.
Si on entre "aaaaaaaa", on va se retrouver avec une somme bcp plus interessante...

Pour éviter ce type de faille dans ce cas ci, il faut écrire: scanf("%4s"..... et il n'y aura plus d'écrasement mémoire
Journalisée

noitan

Profil challenge

Classement : 6323/54318

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 657


Voir le profil WWW
« #4 le: 07 Janvier 2006 à 00:35:05 »

cé très clair !  jvais essayer le code rien que pour voir combien d'euros jvais me faire...
Journalisée

---------------------------------------------------------------------------------
>COMPUTERS IN THE FUTURE MAY WEIGH NO MORE THAN 1.5 TONS<
---------------------------------------------------------------------------------
Popular Mechanics, 1949
absolut

Profil challenge

Classement : 226/54318

Membre Junior
**
Hors ligne Hors ligne
Messages: 97


Voir le profil
« #5 le: 08 Janvier 2006 à 21:56:09 »

Pour comprendre, ce qu'est un buffer overflow, je te conseillerais si tu fais un peu de prog, d'apprendre comment ca se passe en memoire.
Notamment, l'appel de fonction, le passage d'arguments a une fonction et la reservation memoire.

disons une fonction comme ceci que l'on appelle d'une autre fonction :

#define X 13092
#define Y 1991

int     foo(char *str)
{
  char  pad[X];
  char  b[Y];

  strcpy(b, str);
  return (0);
}

pour simplifier et en gros :

une valeur sur la pile est stockee lors de l'appel a ta fonction foo (on l'appelle la 'valeur de retour' de ta fonction appelante).
Ensuite, tu as 13092 octets qui sont reserves, puis s'ajoutent 1991 octets soient 15083 octets au total.
Puis va s'effectuer la fonction strcpy avec en arguments les adresses de b et str.
Lors de la copie en memoire (ce que fait strcpy),
si ta chaine str, fais 1991 caracteres pas de buffer overflow,
si elle depasse 1991 mais et inferieure 15083, ton programme ne plantera pas mais tu auras un bufferoverflow,
si elle depasse 15083: bufferOverflow mais pas d'erreur de ton programme et puis si tu depasses tu vas ecraser la valeur de retour
de ta fonction appelante et la, soit tu as de la chance (ou pas) et ton programme ne plante pas mais a un comportement incomprehensible
soit il plante.

Donc le plus amusant est d'ecraser la valeur de retour de ta fonction appelante et d'en mettre une que tu connais et qui par exemple pourrait
t'executer un shell.

Ce qui est amusant apres, par exemple, sous Unix, c'est d'exploiter des bufferOverflow avec et sans shell code.

Voila, un complement d'information. L'expose et l'explication n'est pas juste a 100%, c'est juste pour donner une idee.
Journalisée

--
Lost in my mind...
Pages: [1]
  Imprimer  
 
Aller à: