PROFIL / INDEX© Clément Depernet / 2026

← Retour à la liste

19 mars 20242 min de lecture

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é.

intro#root-me#reverse-engineering#ghidra#xor#ctf

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 + grep ciblé 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.
SEC / OPS / CD-01

Astro + Tailwind, conteneurisé, servi derrière Caddy · Inspiration · Thème sonore : Severance (Theodore Shapiro) · Trop mignon le favicon, non ?

PRÊT / CD-01