ebCTF 2013 Teaser | bin100 [Write-Up]

Un exécutable est donné : celui-ci simule des lancers de dés. 5 lancers sont faits : le tirage doit être, dans l’ordre, 3-1-3-3-7. Réussir les 4 premiers lancers étant déjà assez difficile comme ça… en plus, il faut que le dernier dé retourne 7. Ce qui est évidemment impossible 🙂

La solution la plus simple était de patch l’exécutable en changeant des jne/je ; lancer le programme, par la suite, donnait directement le flag de validation. Nous avons utilisé une méthode nettement plus compliquée pour venir à bout de cette épreuve…

L’exécutable utilise deux sécurités anti-debug. La première est un simple IsDebuggerPresent ; nous n’avons pas identifié la deuxième (en fait, nous n’avons pas vraiment cherché).

Voici en gros, ce que faisait le programme :

– Lancer un dé et vérifier si c’est un 3
– Lancer un dé et vérifier si c’est un 1
– Lancer un dé et vérifier si c’est un 3
– Lancer un dé et vérifier si c’est un 3
– Une petite routine, à cet endroit, prenait une chaîne de 20 octets dans la mémoire et la « xorait » avec un octet. Cet octet pouvait avoir deux valeurs : 0x10 en temps normal, ou 0x42 si le IsDebuggerPresent détectait un debugger. Ceci était le premier piège ; cela faussait le résultat du xor et ainsi, la chaîne mal déchiffrée faussait toute la suite de l’épreuve.
– Lancer un dé et vérifier si c’est un 7
– Deuxième petite routine : la chaîne de 20 caractères est à nouveau « xorée », cette fois-ci encore sûrement selon un certain trick anti-debug l’octet peut avoir deux valeurs : 0x64 en temps normal, 0x90 sinon.
– Routine de déchiffrement : 39 octets chiffrés dans la mémoire sont « déxorés » grâce à la clé obtenue précédemment après les différents xor (repétée deux fois car la clé ne fait que 20 caractères).

Nous avons vu le trick du IsDebuggerPresent tout de suite ; ainsi nous avons pris la clé au départ (en hexadécimal ici) :

02 37 0f 35 0f 3c 15 07 3c 30 2a 30 55 12 37 15 1e 35 01 51

Puis xor avec 0x10 :

12 27 1f 25 1f 2c 05 17 2c 20 3a 20 45 02 27 05 0e 25 11 41

Nous n’avons pas vu le deuxième piège de suite… Nous avons donc cru qu’il fallait xor la suite par 0x90. Ensuite, le message chiffré dans la mémoire était celui-ci :

13 21 38 15 3D 33 57 47 2D 27 6A 73 44 05 26 59 5C 79 17 44 45 77 1A 75 49 7D 05 4A 78 74 6A 70 42 02 71 05 0F 22 08

Il fait 39 octets. Les flags sont sous la forme ebCTF{md5} : ce qui fait bien ebCTF{} = 7 octets, + md5 en hexadécimal de 32 octets = 39 octets.

Ainsi, en faisant un xor entre « ebCTF{ » et les six premiers octets du message chiffré : 13 21 38 15 3D 33, on obtenait

76 43 7b 41 7b 48

Ceci est le début de la clé utilisée pour déchiffrer le flag.
Mais ne nous connaissons pas la suite de cette clé. Reprenons notre clé après le xor 0x10 :

12 27 1f 25 1f 2c 05 17 2c 20 3a 20 45 02 27 05 0e 25 11 41

Cette clé devait devenir 76 43 7b 41 7b 48 […].
Si on xor ces six octets avec les six premiers octets de 12 27 […], on devrait obtenir la clé pour passer de 12 27 […] à la clé en entière permettant, après un xor, de retrouver le message du flag.

Ça tombe bien !
0x12 xor 0x76 = 0x64
0x27 xor 0x43 = 0x64
0x1f xor 0x7b = 0x64
...

On xor donc 12 27 […] par 0x64, ce qui nous donne la clé finale ! En clair :

vC{A{HasHD^D!fCajAu%

Il ne reste plus qu’à xor le ciphertext :

13 21 38 15 3D 33 57 47 2D 27 6A 73 44 05 26 59 5C 79 17 44 45 77 1A 75 49 7D 05 4A 78 74 6A 70 42 02 71 05 0F 22 08

avec cette clé, pour obtenir finalement le message du flag en clair !

ebCTF{64ec47ece868ba34a425d90044cd2dec}

Done 🙂

Publicités

Une réflexion au sujet de « ebCTF 2013 Teaser | bin100 [Write-Up] »

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s