Je profite de la "remontée" du sujet pour offrir une sorte de correction sur les différents exercices (car j'étais occupé pendant un certain temps, puis j'ai totalement oublié de le faire).
Exercice 1
Pas de solution à proprement parler pour cet exercice, et si vous souhaitez voir un exemple de code je vous redirige vers celui de fromvega : 78 caractères.
Exercice 2
Le premier "piège" relativement facile à trouver est le ;
après le else
, ce qui signifie que ce bloc de condition sera interprété comme un bloc vide, et donc que le printf
sera exécuté quel que soit le résultat du deuxième if
(car même si l'indentation induit en erreur, le printf
n'appartient en réalité à aucun bloc de condition, et il sera donc toujours exécuté).
Le deuxième piège, plus sournois cette fois, concerne le deuxième if
. En effet, on fait appel à une macro pour réaliser la multiplication, mais il y a un effet de bord à cause du + 1
et du + 2
. Si on remplace la macro par son contenu, on obtient en réalité a + 1 * b + 2
, ce qui n'est pas le résultat attendu puisque l'opérateur *
a une priorité supérieure à l'opérateur +
. Le résultat est alors 2 + 1 * 2 + 2
soit 6
. Pour éviter toutes erreurs de ce type, il faut mettre des parenthèses autour des variables utilisées dans la macro, et aussi autour de l'expression comme ceci : #define multiplication(a, b) ((a) * (b))
.
Le troisième piège est le plus difficile à trouver. La principale raison pour laquelle j'ai posté une photo au lieu du code directement n'est pas pour éviter tout copier/coller de votre part, mais surtout pour ne pas laisser la coloration syntaxique révéler l'astuce. Si on utilise un bloc de code coloré dans le bon langage, on obtient sur le premier if
:
| // Attention si probleme d'allocation ou de multiplication /!\
if(!s)
printf("Probleme d'allocation memoire !\n");
|
Comme on peut le voir, le if
est en réalité commenté à cause du dernier caractère sur le commentaire : \
. Le backslash permet de créer un commentaire multiligne, tout comme il est possible de déclarer des macros sur plusieurs lignes à l'aide de la même méthode :
| #define NOMBRE 1, \
2, \
3
|
Notre bloc de condition if
est alors commenté, et le printf
est donc forcément exécuté.
Au final, le programme affiche les trois sorties proposées, soit :
| Probleme d'allocation memoire !
Probleme de multiplication !
Tout va bien !
|
Exercice 3
Il y a plusieurs façons d'exploiter le code proposé, et je vais vous indiquer celles que j'avais en tête lors de l'écriture de l'exercice :
- buffer overflow sur notre variable
buffer
, ce qui permet de réécrire sur la partie mémoire de la variable top_secret
vérifiant alors la condition et nous donnant donc l'accès à la partie secrète du programme. Plus d'informations dans la liste d'articles proposés (surtout celui concernant les buffer overflow), ou encore sur la réponse de fromvega à cet exercice.
- exécution de code shell : il y a deux possibilités principalement pour exécuter du code malveillant dans ce programme. La première vient du buffer overflow vu dans le dernier point, et il est tout à fait possible d'injecter du code pour par exemple prendre le contrôle de la machine (exemple en vidéo : Buffer Overflow Attack - Computerphile ). La deuxième possibilité vient de la ligne
printf(buffer);
que l'on peut exploiter en utilisant les paramètres de format de printf
afin d'injecter du code (exemple : How can a Format-String vulnerability be exploited?). Encore une fois, n'hésitez pas à lire l'article proposé dans l'exercice à propos des shellcode pour en apprendre davantage.
- enfin il y avait aussi la possibilité d'exploiter un débordement de base dans le tas à cause du
strcpy(buffer, argv[1]);
(exemple d'utilisation : Débordement de tampon - dans le tas). L'article proposé à la fin de l'exercice sur le stack-based overflow est assez proche dans l'idée de l'exploitation (mais agit sur la pile), et il peut être intéressant de le consulter aussi.
Exercice 4
fromvega a déjà donné un code en clair, ainsi que plusieurs explications. Cependant, j'avais rapidement rédigé quelques étapes sur la conception du programme depuis zéro. Je vous laisse lire la partie concernée, n'hésitez pas à me poser des questions si les quelques explications ne sont pas claires, mais je vous invite tout de même à lire les messages de fromvega sur l'exercice.
J'espère que l'atelier vous aura plu !