Exemple jouet de piratage par débordement#
Le programme suivant implante un écran de connexion simple
qui demande à l’utilisateur d’entrer un mot de passe et le
compare avec le contenu de la variable motDePasseSecret
,
et répète tant que le bon mot de passe n’a pas été fourni.
Détail technique: il se trouve que, pour minimiser l’exemple, nous
avons recours à des tableaux C
de caractères plutôt que des string
pour stocker le mot de passe et le mot de passe secret. D’où le char motDePasseSecret[]
. Vous en saurez plus au deuxième semestre, mais
vous pouvez ignorer la distinction pour le moment.
Instructions:
Essayez le programme suivant en saisissant successivement les mots de passe «
coucou
» et «s3*iA3
». Que constatez vous?Essayez le programme suivant en saisissant successivement les mots de passe «
ouvre!
», «Sesame,ouvre!
», et «ouvre!
». Que constatez vous?
#include <iostream>
using namespace std;
char motDePasse[] = "XXXXXX";
char motDePasseSecret[] = "s3*iA3";
do {
cout << "Entrez le mot de passe: " << endl;
cin >> motDePasse;
} while ( string(motDePasse) != string(motDePasseSecret) );
cout << "Connexion réussie. Bienvenue chef!" << endl;
Explications#
Indication
Un tour de magie?
Bien sûr, «Sésame» n’est pas une incantation magique. Il y a une explication derrière ce piratage réussi. Pour la comprendre, il vous faudra d’abord avoir lu le début du cours Modèle de mémoire et tableaux.
Les deux tableaux sont de longueurs fixes, et le début du tableau
motDePasseSecret
se trouve être 7 cases après le début du tableau
motDePasse
. On peut retrouver cette information par le calcul
suivant dit d”arithmétique de pointeurs (vous verrez plus tard
pourquoi):
motDePasseSecret - motDePasse
De ce fait, lorsque l’attaquant saisit «Sesame,ouvre!», cela déborde de
motDePasse
: le caractère «,» est écrit juste après motDePasse
, et
«ouvre!» est écrit dans motDePasseSecret
. Cette dernière variable
est donc corrompue: l’attaquant a pu y mettre le mot de passe de son
choix à la place de celui d’origine.
motDePasseSecret
Du coup, à la tentative de connexion suivante, le mot de passe «ouvre!» est accepté.