Codegate CTF 2014 - Clone Technique Writeup
27/02/2014 - 13:37 by poneyDans 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.
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.
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.
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 :
Cette petite modification permet d'avoir :
Ou mieux :)
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 :
Le code utile permettant la création d'un fichier avec comme nom le flag de l'épreuve :
Très peu de fichiers sont créés à cause de la nature du nom malformé retourné dans la quasi majorité des cas :
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) :
Le code utile :
Une fois les changements sauvegardés, exécutable lancé et la sortie traitée, le flag apparaît :
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 :
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 :)