Codegate CTF 2014 - Clone Technique Writeup

27/02/2014 - 13:37 by poney

Dans cette épreuve de 250 points, l'objectif est de retrouver le flag dans le bon processus parmi 400.

En analysant cet exécutable, on identifie que la fonction .text:0x401170 permet d'assurer un lancement de ces processus avec la fonction KERNEL32.CreateProcessW(). Chaque instance de ce programme lance une autre avec 3 paramètres :

  • paramètres 1 et 2 servent entre autres au déchiffrement du flag
  • 3e paramètre est l'identifiant incrémental de l'instance du programme lancé. Le processus lancé ne lance un autre que si le nombre maximum de 400 (ou 0x190) n'a pas été atteint.
codegate_2014_clone_technique

Dans la section .data, à l'offset .data:0x407030, une suite de caractères, qui a tout l'air d'être une chaîne chiffrée, attire notre attention.

codegate_2014_clone_technique

A l'aide d'un breakpoint matériel, il est possible d'identifier que seule la fonction .text:0x401070 la manipule. Celle-ci ressemble très fortement à une routine de chiffrement/déchiffrement.

codegate_2014_clone_technique

A la fin de cette fonction, le registre EAX pointe vers une zone mémoire contenant la partie déchiffrée de notre chaîne. Plusieurs méthodes permettant l'extraction de cette information de manière automatique, via l'insertion de code en inline, s'offrent à nous :

1- Un message d'alerte affichant le flag (USER32.MessageBoxA())

Le code inséré ici est suffisamment court pour ne pas avoir à rechercher un plus grand espace ailleurs dans le binaire. Il ne faut pas oublier de sauvegarder puis restaurer à l'aide des instructions PUSHAD et POPAD l'état des registres afin de permettre au processus de continuer son exécution sans erreurs :

codegate_2014_clone_technique

Cette petite modification permet d'avoir :

codegate_2014_clone_technique

Ou mieux :)

codegate_2014_clone_technique

2- Création de plusieurs fichiers avec comme nom le flag (KERNEL32.CreateFile())

En écrasant puis restaurant quelques octets du code utile qui nous permettront de sauter à un endroit où nous insérerons notre code. Comme ici avec un saut vers la fin de la section .texte qui nous offre suffisamment d'espace pour insérer notre code :

codegate_2014_clone_technique

Le code utile permettant la création d'un fichier avec comme nom le flag de l'épreuve :

codegate_2014_clone_technique

Très peu de fichiers sont créés à cause de la nature du nom malformé retourné dans la quasi majorité des cas :

codegate_2014_clone_technique

3- Ecriture de tous ces résultats de déchiffrement dans un seul fichier (KERNEL32.CreateFile() puis KERNEL32.WriteFile())

Notre petit saut vers la fin de la section .texte (adresse .text:0x405438) :

codegate_2014_clone_technique

Le code utile :

codegate_2014_clone_technique

Une fois les changements sauvegardés, exécutable lancé et la sortie traitée, le flag apparaît :

codegate_2014_clone_technique

4- Lecture du contenu pointé par EAX à l'aide d'un debugger attaché à la machine virtuelle

Définition du breakpoint et des commandes à exécuter lors de son déclenchement :

codegate_2014_clone_technique

Une fois le programme lancé, il ne suffit plus qu'à suivre l'évolution de la sortie de gdb jusqu'à voir la petite surprise apparaître :)

codegate_2014_clone_technique
Flag : And Now His Watch is Ended
Voila, c'est tout pour ce billet qui me servira de petit mémo, ainsi qu'à certains peut être ^^

Comments

comments powered by Disqus