NSA Flag Checker
La NSA nous partage gentillement un fichier exécutable pour vérifier les flags. Ouvrons-le dans leur outil : Ghidra.
Dans l’arbre d’appel de la fonction main, je vois directement la fonction decrypt_flag
.
Lors de la lecture du main, une condition impossible est faite pour afficher le flag, qui se trouve dans __s1
.
iVar1 = decrypt_flag(__s1);
/* ... */
iVar1 = strncmp(__s1,(char *)param_2[1],0x30);
if (iVar1 != 0) { /* impossible sans connaitre le flag */
puts("WRONG! Get out of here! You are not the NSA!");
exit(1);
}
printf("The flag is indeed %s. Consider this proof of our loyalty.\n",__s1);
Il suffit changer le JZ pour un JMP à l’emplacement du if en ASM pour sauter directement à l’affichage du flag. JZ ne saute que si le résultat du test est égale à 0 alors que JMP saute quoi qu’il arrive.
La grande évasion
Comme pour chaque chall de reverse, j’ouvre le fichier dans Ghidra. En bidouillant les paramètres pour choisir la langue (j’ai oublié / fait n’importe quoi), j’obtiens un gros fichier hexadécimal. En parcourant tout le fichier, on trouve tout en bas le flag.
C’est très sale comme manière, vous pouvez trouver une façon plus « propre » sur le WU de K3RM1T ou encore sur le WU de SoEasy.