Root-Me — Godot 0 protection : reverse d'un binaire de jeu
Reverse engineering d'un challenge Root-Me basé sur le moteur Godot : extraction de chaînes, repérage d'un XOR à clé répétée, reconstruction du message caché, et patch du binaire pour franchir un saut. Flag caviardé.
Mis à jour le 21 sept. 2026
Note. Démarche de résolution, flag masqué (
██████) : Root-Me demande de ne pas publier de solutions.
Reconnaissance
Le fichier est un .exe : au lancement, un mini-jeu où l’on se déplace et
saute, avec une consigne à propos d’une « île lumineuse ». Deux pistes en
parallèle — chercher les variables de saut dans Ghidra, et lancer un
strings au cas où.
Repérer le message caché
L’énoncé parle de panneaux sur l’île. En filtrant les chaînes sur le motif des
panneaux, un format text = "..." apparaît :
strings 0_protection.exe | grep 'text = '
Le contenu du panneau recherché n’est pas en clair : c’est un XOR à clé
répétée. En inspectant les octets de la clé, celle-ci se révèle être une
chaîne ASCII lisible (un petit clin d’œil : wh4t4r3y0ud01ng?) — mais ce
n’est pas le flag.
Reconstruire le clair
On applique le XOR entre le buffer chiffré et la clé répétée :
#include <stdio.h>
#include <string.h>
int main(void) {
char key[] = { /* octets de la clé */ };
char enc[] = { /* buffer chiffré — omis ici */ };
for (int i = 0; i < strlen(enc); i++)
printf("%c", enc[i] ^ key[i % strlen(key)]);
}
La sortie reconstitue le texte du panneau du haut → le flag (██████).
Bonus : patcher le saut
Pour le plaisir, on modifie en mémoire la variable de saut afin de franchir un
obstacle du jeu. Dans un éditeur hexadécimal, recherche du motif jump,
ajustement de la valeur ASCII (sans dépasser l’espace mémoire réservé au
nombre), puis sauvegarde et relance : deux sauts suffisent alors à passer.
À retenir
strings+grepciblé avant de sortir l’artillerie lourde : beaucoup de challenges « 0 protection » se résolvent au niveau des chaînes.- Un XOR à clé répétée se trahit souvent par une clé ASCII lisible.
- Patcher un binaire en hexadécimal : attention à ne jamais dépasser la taille du champ d’origine.