[Writeup] NDH17 – Matriochka step 1

Cet article présente le write-up du challenge Matriochka Step-1 du CTF de qualification pour la Nuit du Hack 2017.

Il s’agit  de la traduction du write-up que j’avais écris sur le github de la Team Cryptis.

Challenge

Category: Reverse Points: 35 Solves: 330
Description : Can you… Reverse it ? Analyse it ? Calculate it ? Keygen it ? Modify it ? Enjoy yourself 🙂 This challenge is separated in four steps with four separate flags to guide you. Challenge : https://quals.nuitduhack.com/challenges/quals-ndh2k17/matriochka-step-1/.

Write-up

Le challenge consiste en un unique fichier binaire : step1.bin. Commençons donc par l’exécuter.

Comme souvent, le programme attends le flag comme argument et affiche un message en fonction de celui-ci.

N’ayant pas de windows sous la main, j’avais démarré avec radare2. Nous commencons donc par analyser le binaire avec la commande aa (Analyse All) puis on affiche la fonction main (sym.main) :

On peut déjà remarquer un cmp  à l’adresse 0x00400675 qui effectue un branchement après l’appel de printf . Il compare la constante entière 2  avec le premier argument de la fonction main (c’est à dire argc ). Ce bloc est certainement une vérification du nombre d’argument de ligne de commande (celui qui avait précédemment expliqué le mode d’usage du programme).

Ainsi, la partie importante de la fonction main se situe entre les offsets 0x00400696 et 0x004006a4. Ce block prépare la pile (stack) et appelle la fonction mmm . Nous allons donc simplement désassembler cette fonction :

Encore une fois, la fonction ne semble pas faire quoi que ce soit, mit à part appeler une autre fonction. Nous allons donc continuer à explorer le programme en suivant simplement les appels de fonction :

Quatre fonction sont appelée successivement : mmm , you , touch  et my , la dernière étant clairement plus complexe que les précédentes.

En regardant le code assembleur de la fonction my, nous remarquons l’utilisation de la chaîne de caractères “Tr4laLa” à l’offset 0x00400798Nous avons ici un bel exemple du sens de l’humour français 🙂 : “mmm you touch my Tr4laLa”.

Cette fonction semble comparer le flag d’entrée avec la chaîne “Tr4laLa”, mais beaucoup d’opérations sont effectuée sur le flag avant cette comparaison. Le cmp  à 0x00400728 après l’appel à strlen  pourrait être un moyen d’éviter ces opérations ?

Dans tous les cas, la taille de la fonction est supérieure à 10 instructions et c’est clairement trop si on prend en compte notre flemme… Il est temps d’appeler IDA à la rescousse !

1 minute pour lancer la machine virtuelle Windows, une autre pour lancer la version totalement légale d’IDA Pro et nous y sommes. Ce qui suit est le pseudo-code C de la fonction my  donnée par IDA (notez qu’il s’agit d’un binaire 64 bits, vous devez donc utiliser le lanceur idaq64 ) :

La partie du code située avant la condition !strcmp(a1, "Tr4laLa!!!")  correspond aux opération sur le chaîne d’entrée. Nous pourrions lire ce pseudo-code et essayer de comprendre son effet concret sur la chaîne v1 . Cependant, nous allons commencer par réécrire ce code en un programme C valide et l’essayer sur différente chaîne pour tenter de le comprendre plus simplement.

Quelques modifications sont nécessaires pour obtenir un code C compilable. La boucle à l’intérieur de la condition est assez complexe et n’est pas requit pour nos tests, elle peut donc être retirée sans problème. Vous pouvez trouver le code C final à cette adresse.

Pour finir, nous compilons le programme puis nous le testons avec quelques chaînes :

Cette fonction semble simplement inverser les chaînes de caractères. Puisque l’entrée est comparée avec le chaîne “Tr4laLa!!!”, nous allons simplement tenter avec son inverse : “!!!aLal4rT” :

Bien joué, le flag est !!!aLal4rT


Notez que lorsque le bon flag est entré (c’est à dire ./step1.bin \!\!\!aLal4rT), un grand nombre de caractères sont affichés sur la sortie standard. La raison est que le programme affiche le challenge suivant (matriochka-step2) sur stderr quand le bon flag est passé. Cette opération est faite dans la boucle que nous avions précédemment ignorée dans notre programme C :

Pour créer l’exécutable du second challenge, il suffit de rediriger stderr dans un fichier (vous pouvez trouver l’exécutable du second challenge ici) :

Et c’est reparti ! 😉

Autres write-ups et resources

Aucune autre resource pour le moment.

%d bloggers like this: