Les aliens à Gennevilliers
- Difficulty
-
medium - Categories
-
rev pwn - Points
- 50
- Solves
- 10
- Solved in time?
-
yes - File
- alien_life
- 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 :
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 :
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:

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):

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

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 :

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 !

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 !