Logo
Reverse Engineering
Overview

Reverse Engineering

n nalo_
March 7, 2026
1 min read

Les aliens à Gennevilliers

Les aliens à Gennevilliers
Difficulty
medium
Categories
rev pwn
Points
50
Solves
10
Solved in time?
yes
Flag
HACKHER{CBOLAVIE}

Wow mais qu’est-ce que c’est que ce truc là ?

En exécutant le programme, vous tombez sur un gloubiboulga de bidule avec une dose de trucmuche

Il doit pourtant bien y avoir un sens à ce bazar…

Format du flag: HACKHER{LEFLAG}

En exécutant le programme (dans une VM bien sûr, n’exécutez pas des programmes inconnus comme sur votre machine hôte sans réfléchir pitié), on remarque des gloubiboulga de bidule avec une dose de trucmuche, mais rien ne change. En remontant l’historique d’affichage, on peut voir que ce gloubiboulga de… bref, ce truc est affiché plusieurs fois, avant une fois finale avec un message : Etat a t=0

Bon, comme il se passe rien, c’est l’heure de reverse le binaire, parce que c’est la catégorie de l’épreuve quand même.

En ouvrant la fonction main dans Ghidra, on peut y lire (à peu de choses près) ce code :

function main
undefined8 main(void) {
int local_c;
initialize_grid();
display_grid();
sleep(0);
for (local_c = 9; -1 < local_c; local_c = local_c + -1) {
reverse_grid(local_c);
display_grid();
usleep(200000);
}
puts("Etat a t=0 :");
display_grid();
return 0;
}

Donc, la grille est initialisée, affichée, mise à jour et affichée 10 fois, et finalement affichée encore une dernière fois pour son état “final” (ou t=0), soit un total de 12 affichage.
On peut effectivement le confirmer en comptant le nombre de fois que la grille a été affichée en exécutant le programme tout à l’heure, on en retrouve bien 12.

Le seul soucis, c’est que la grille n’est jamais mise à jour. Comme si reverse_grid(i) ne faisait strictement rien.
Allons voir dans Ghidra :

function reverse_grid
void reverse_grid(void) {
return;
}

Ah oui.

En revanche, on peut voir sur le côté dans la liste des fonctions qu’il y en a d’autres de définies et qui ne sont pas utilisées par le main:

Liste des fonctions du programme

Comme de par hasard, on veut mettre à jour notre grille, et une fonction non utilisée update_grid(uint param_1) est disponible ? Ca semble tout tracé… Manque plus qu’à l’utiliser ! Mais comment ?

Dans Ghidra, il est possible de modifier (“patch”) le code assembleur, pour appeller cette bonne fonction update_grid à la place de reverse_grid. Pour faire ça, il nous faut au préalable récupérer l’adresse de update_grid comme ceci (notez bien cette adresse 00101a17):

Adresse de la fonction update_grid

Ensuite, il suffit d’identifier la ligne assembleur à patcher qui correspond à la ligne d’appel de la fonction reverse_grid dans le code C :

Ligne d'appel de reverse_grid

Et enfin, on peut patcher cette ligne (clic droit -> “Patch Instruction” (CTRL+SHIFT+G)) pour appeler update_grid à la place de reverse_grid, en remplaçant l’adresse par celle de update_grid que nous avons récupéré précédement :

Patch de la ligne d'appel de reverse_grid pour appeler update_grid

Il suffit alors d’exporter le nouveau programme patché (File -> Export Program (o) -> ELF format), puis de l’exécuter pour voir le résultat !

Résultat une fois patché

Au final, le challenge relevait plus du pwn que du reverse, puisqu’il fallait patcher le binaire, mais on n’en veut pas aux orga, c’était quand même super !