🇫🇷 PWNME - Reverser Don't Like Rustacer

Jul 8, 2022

2 mins read

Go back to write-ups list

This write-up is in French because it’s a French CTF, sowwy

Category: Reverse

Creator: Bryton

Description:

Simpler than it seems

Flag format: PWNME{flag}

Attachments:

Introduction

Ce programme est un crack-me ordinaire où l’on doit entrer un mot de passe pour obtenir le flag.

Rustacer usage

Cependant, lorsqu’on l’ouvre dans un désassembleur, on constate qu’en plus d’être écrit en Rust (comme indiqué par le titre du chall), le programme a été compilé sans les symboles : impossible donc de trouver main ou encore le nom d’une fonction qui vérifie notre mot de passe. On va donc devoir ruser 😏

Recherche d’éléments intéressants

J’ai commencé par chercher l’adresse de la chaîne de caractères "Usage: [...]" ainsi que son utilisation dans le binaire :

Rustacer string

Cela nous mène vers une grosse fonction, qui d’ailleurs n’est pas bien analysée par IDA. Mais le plus gros de la vérification est quand même tout à fait compréhensible. On a d’abord une première partie qui vérifie la longueur du mot de passe entré :

Password length

On sait donc que la longueur doit être de 12. Puis une deuxième partie un peu plus longue qui exécute une fonction de vérification et qui en fonction du résultat affiche “Incorrect flag” ou appelle une autre fonction qui calcule puis affiche le flag.

Comparison

Solution

Attendez… calcule puis affiche le flag ? Le plus simple donc, plutôt que de se perdre de le dédale de fonctions sans nom, ce serait de modifier le flux d’exécution du programme pour inverser la comparaison, et ainsi passer à l’affichage du flag lorsque notre mot de passe est faux !

On va donc patcher le binaire pour remplacer l’instruction jnz par son opposée : jz.

Patch

Et ainsi, lorsqu’on lance le programme avec une string de longueur 12 en argument, on obtient le flag !

Flag

Go back to write-ups list

Sharing is caring!