===== Superman (Reverse500) =====
lien pour télécharger l'archive : [[http://repo.zenk-security.com/ctfs/ndh2k15/superman.tar.gz]]
Cette épreuve est construite de la même façon que Clark Kent, on a aussi le header elf à corriger, un ptrace, un calcul de checksum sur le code et une vérification si on est root ou pas.
Je ne vais donc pas réexpliquer comment arriver au payload final, vous pouvez lire le writeup sur clark kent : http://wiki.zenk-security.com/doku.php?id=ndhquals2015:clark_kent c'est exactement la même procédure.
On va donc commencer ce writeup directement avec le dump du payload (que l'on aura trouvé en breakant sur le call [ebp+addr]) donc à 0x8077008
Et ici, pareil qu'avec Clark Kent, pas besoin de faire beaucoup de reverse pour trouver le flag !
La fonction à 0x8077259 déchiffre une chaine, la décode en brainfuck (le décodeur est en 0x807730A) et affiche la chaîne décodé.
Cette fonction est appelé à plusieurs endroits :
* en 0x807705d pour afficher la chaine qui dit qu'on est pas root
* en 0x807707b pour afficher la chaine qui dit qu'on est bien root
* et aussi en 0x8077191 et 0x8077161 pour l'affichage du goodboy/badboy
On peut déterminer rapidement le prototype de cette fonction, elle prend en premier argument l'adresse de la chaine chiffrée (à [esi+x], en 2ème argument la taille et en 3ème argument un buffer de sortie (on remarque d'ailleurs que c'est toujours le même buffer qui est utilisé)
En argument de la fonction de chiffrement (80775F6), on voit un argument intéressant : [esi+1633] et 0x3B6, ça doit surement être une chaîne chiffrée intéressante !
Du coup, on va tricher un peu, dans notre premier call à la fonction de "déchiffrement/décodage du brainfuck/ affichage d'une chaine" qui nous affichait le message si on était root ou pas, on va modifier les arguments dans gdb pour faire pointer le 1er argument par [esi+1633] et le deuxieme argument par 0x3B6
voici la call stack au moment du premier appel à la fonction de déchiffrement/affichage :
gdb-peda$ x/2xw $esp
0xffffcdf8: 0x080779c5 0x0000027a
on doit modifier le premier argument par $esi+0x1633 soit 0x807863B
gdb-peda$ x/xw $esi+0x1633
0x807863b: 0xe34f99e7
on modifie les deux premiers arguments :
gdb-peda$ set *0xffffcdf8=0x807863b
gdb-peda$ set *0xffffcdfc=0x3B6
gdb-peda$ x/2xw $esp
0xffffcdf8: 0x0807863b 0x000003b6
parfait !
on relance l'éxécution et là :
gdb-peda$ c
Continuing.
OMGTh4tW4s4H0rr1bl3Ch4ll3ng3!