Un bufferoverrun : le débordement de pile

Soyez le premier à donner votre avis sur cette source.

Vue 6 658 fois - Téléchargée 471 fois

Description

Soit un programme mal écrit, qui ne se protège pas contre les débordements de pile.
On va successivement voir comment ce programme :

I) Peut planter

II) Peut exécuter du code spécifié par l’utilisateur

III) Pourrait être corrigé

IV) Peut encore être « patché »

V) Devrait enfin utiliser l’option /GS du compilateur de VS7 ou équivalent pour d’autres compilateurs

Source / Exemple :


le point de départ est ce petit code :
void MalEcrite(const char* entree)
{
  char buf[10];// ce buffer est limité à 10 caractères, soient 9 utiles !
  //copions tout ce qui se présente sans contrôle ... copieusement quoi !
  strcpy(buf, input);
  printf("voici mon buffer :\n%s\n\n", buf);
}

Conclusion :


Cet article est dans la catégorie Sécurité.
Pour nous simplifier la compréhension, bien respecter les principes suivants :
1) le code sera compilé sans les nouvelles options de sécurité du compilateur Visual Studio .NET
2) nous allons utiliser une version "Release" sans optimisation de code
3) nous allons afficher les adresses utiles pour mieux pouvoir les introduire en entrée.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_h4x0r
Messages postés
3
Date d'inscription
samedi 13 mars 2004
Statut
Membre
Dernière intervention
12 avril 2004
-
bon maintenant il rest juste a faire un exploit ;)
moi g un ti problem avec le mien je fait pointer EIP vers ESP mais je recois toujours une erreure de BO et il execute pas mon shell-code

#include <stdio.h>
#define BUFFSIZE 32

char shellcode[]="\x90\x90";
char ret[]="\x46\x12\x40";

int main(int argc, char *argv[])
{
char buffer[70];
int len,i,size,retlen,SIZE;
size = strlen(shellcode);
len = BUFFSIZE - size;
retlen = strlen(ret);

for(i=0;i<=len;i++){
buffer[i] = '\x90';
}

for(i=0;i<=size;i++){
buffer[i + len] = shellcode[i];
}
for(i=0;i<=4;i++){
buffer[i + len + size] = '\x90' ;
}

for(i=0;i<=4;i++){
buffer[i + len + size + 4] = ret[i];
}

printf("%s",buffer);

getchar();
return 0;
}
bon ok g changer mon shell-code pour des NOPs mais bon ca ne marche pas quand meme ....helpp
cs_h4x0r
Messages postés
3
Date d'inscription
samedi 13 mars 2004
Statut
Membre
Dernière intervention
12 avril 2004
-
ton buf peut contenir 16 caractere car le processeur travail avec des MOTS, enfin... petit detail....a +
cs_h4x0r
Messages postés
3
Date d'inscription
samedi 13 mars 2004
Statut
Membre
Dernière intervention
12 avril 2004
-
g trouver mon erreur.. EIP doit pointer vers EBP au crash time... enfin
cs_algori
Messages postés
870
Date d'inscription
dimanche 26 décembre 2004
Statut
Membre
Dernière intervention
26 février 2008
1 -
excellente source. J'ai appris plein de choses
ironzorg
Messages postés
45
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
27 juin 2008
-
Corrige ta description:
"le point de départ est ce petit code :
void MalEcrite(const char* input)
{
char buf[10];// ce buffer est limité à 10 caractères, soient 9 utiles !
//copions tout ce qui se présente sans contrôle ... copieusement quoi !
strcpy(buf, input);
printf("voici mon buffer :\n%s\n\n", buf);
}"
Commenter la réponse de cs_Xs

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.