
Windows x86 PoC : Débordement de tampon basé sur la pile avec shellcode personnalisé sur Windows 32 bits legacy.
Ceci est un tutoriel simple et autonome sur les exploits de débordement de tampon basé sur la pile pour Windows 32 bits. Aucun guide externe requis — tout ce dont vous avez besoin est ici.
vulnerable.c : Un programme simple avec une fonction gets() non sécurisée.messageBox.asm : Une petite charge utile en assembleur qui s'exécuterait après le débordement.exploit.c : Un exemple de la manière dont le débordement pourrait être déclenché.Ce projet enseigne une idée centrale : la lecture non sécurisée des entrées peut permettre à un attaquant d'écraser l'adresse de retour et de rediriger l'exécution.
gets()Dans vulnerable.c, le programme fait ceci :
char buffer[32];
gets(buffer);
Le programme réserve 32 octets pour buffer, puis appelle gets() pour lire l'entrée.
Le problème : gets() ne vérifie pas la taille du tampon.
Il continue à lire des caractères jusqu'à rencontrer un saut de ligne.
Si l'utilisateur tape 40 ou 50 caractères, les caractères supplémentaires débordent au-delà du tampon de 32 octets.
Lorsqu'une fonction C s'exécute, la pile (une région mémoire) stocke :
buffer)EBP sauvegardé (pointeur de base de la fonction appelante)Représentez-le ainsi :
Lower addresses (top of stack as drawn)
[ buffer (32 bytes) ]
[ saved EBP (4 bytes) ]
[ return address (4 bytes) ]
Higher addresses (bottom)
Lorsque gets() fait déborder buffer avec trop d'entrées, les octets supplémentaires écrasent le EBP sauvegardé puis l'adresse de retour.
Si nous concevons soigneusement le débordement pour placer une adresse spécifique dans le champ de l'adresse de retour, le CPU sautera vers cette adresse lorsque la fonction tentera de retourner.
buffer[32] sur la pile.gets(buffer) pour lire une ligne d'entrée utilisateur.gets() n'a pas de vérification de taille, donc il écrit les 50 octets dans le tampon.buffer et écrasent le EBP sauvegardé et l'adresse de retour.C'est la forme la plus simple d'exécution de code via un débordement de tampon.
messageBox.asm est un petit morceau de code conçu pour s'exécuter après le débordement.
Il fait ce qui suit :
LoadLibraryA avec la chaîne "USER32.DLL" pour s'assurer que la bibliothèque est en mémoire.ExitProcess pour terminer le programme en toute sécurité.Le point clé : il s'agit de code exécutable qui s'exécute après que le débordement a redirigé l'exécution vers lui. Lorsque la boîte de message apparaît à l'écran, cela prouve trois choses :
Dans une attaque réelle, cette charge utile pourrait faire n'importe quoi : voler des données, créer un utilisateur, télécharger un logiciel malveillant, etc. La boîte de message n'est qu'un moyen visible et sûr de démontrer qu'une exécution de code arbitraire a eu lieu.
Cette charge utile spécifique utilise des adresses mémoire codées en dur pour MessageBoxA (0x751D8830) et ExitProcess (0x7437ADB0).
Ces adresses sont spécifiques à un système. La charge utile devrait être ajustée pour une version ou un système Windows différent.

Windows moderne dispose de multiples fonctionnalités de sécurité qui empêchent cet exploit :
Pour cet exercice d'apprentissage, nous désactivons toutes ces protections.
Utilisez MSVC (Microsoft Visual C++) avec des indicateurs spécifiques :
cl /c /GS- /W3 /Zl vulnerable.c
link /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /NXCOMPAT:NO vulnerable.obj /OUT:vulnerable.exe
Signification des indicateurs :
/GS- désactive la protection contre les dépassements de tampon de pile./DYNAMICBASE:NO désactive la randomisation de la disposition de l'espace d'adressage (ASLR)./NXCOMPAT:NO désactive DEP, permettant au code sur la pile de s'exécuter.Si vous avez déjà l'exécutable, vous pouvez désactiver les protections avec editbin :
editbin /NXCOMPAT:NO /DYNAMICBASE:NO vulnerable.exe
vulnerable.exe.Ce README explique :
gets() et pourquoi il est dangereux (pas de limite de taille).Vous comprenez maintenant l'ensemble du flux d'exploitation par débordement de tampon. Lisez les fichiers de code et comparez-les à cette explication pour consolider votre compréhension.
Cet exemple est uniquement destiné à l'apprentissage. N'utilisez pas cette technique contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas l'autorisation explicite de tester. L'accès non autorisé à des systèmes informatiques est illégal.