Write-up du Citiny-CTF section cryptanalyse.
Salut à tous, aujourd'hui je vous présente mon WU du CitinyCTF présenté dans un prog CLI, c'est un CTF de cryptanalyse et un peu de RE au début.
La première étape consistait à bypass le GetDlgItemText() importé par user32.dll où il nous demande d'insérer un mot de passe pour accéder au CTF.
J'ai donc essayé de voir en quoi le prog était packé, pour ce faire je l'ai d'abord glissé dans PEID ce qui m'a donné ce résultat.
On constate que l'OEP a été modifié par un packer, dorénavant la section de l'EP a été assigné par UPX1. Ce qui veut dire que le programme a été packé en UPX. Désassemblons le programme, pour ma part j'ai utilisé Odbg110, mais rien ne vous empêche d'utiliser un autre désassembleur. Voici ce que nous obtenons.
Je vais vous expliquer ce que fait UPX, histoire que vous sachiez de quoi on parle. UPX marche avec un loader qui va chiffrer le code dans l'EP. Quand le programme sera exécuté il sera déchiffré. L'EP du loader se trouve dans le PUSHAD et la routine du déchiffrage se termine au POPAD. J'ai donc désassemblé le programme et je me suis rendu au POPAD. Logiquement, derrière il y aura un JMP vers l'adresse de l'EOP, je mets un breakpoint dans le JMP vers l'adresse de l'EOP, puis je n'avais plus qu'à faire F7 et le tour était joué, je me retrouve dans l'EOP du programme qui là ne sera plus packé. Quelques images pour vous aider à comprendre.
Dans l'image au dessus, je me suis rendu au POPAD et j'ai défilé l'instruction MOV qui a affecté le registre ESP (registre qui va délimiter la stack).
Je sélectionne ESP, je fais un clique droit et je clique sur suivre l'interaction du Dump. Ensuite je sélectionne les 4 premiers octets null de ESP, clique droit -> Hardware on access et WORD car ça ne dépasse pas les 4 octets. Ensuite on dump le debugged process
On positionne l'exécutable et on a plus qu'à la refixer et exécuter le prog.
Plus qu'à lancer le programme et hop, plus de Popup.
Voici le premier challenge, lisons et analysons.
La solution se trouvait dans l'indice, si on lit bien on constate qu'il a tenté d'accentuer le mot FairPlay on y ajoutant deux majuscules.
Mais pourquoi ? Eh bien, j'ai tout simplement inversé les mots Fair et Play ce qui donne "Playfair", ensuite j'ai fait une simple recherche google avec les mots clés "Playfair Cipher" et voici le résultat.
Il s'agit donc du cipher PlayFair, passons au déchiffrage. Pour ce faire, j'ai deux méthodes, soit vous le faites avec un automatisateur de tâche (par ex.: https://www.dcode.fr/chiffre-playfair), soit à la main. Personnellement j'ai opté pour la solution de le faire à la main, c'est bien plus fun. Voici comment j'ai procédé (Lisez biens les règles du Cipher PlayFair).
YN devient NO
JT devient PQ
AF devient RS
HP devient TU
EK devient VX
DB devient YZ
LY devient AB
IB devient CD
IP devient EF
UG devient GH
CF devient IJ
XA devient KL
QD devient MB
Après avoir assemblé tous les résultats, on obtient le résultat final ci-dessus, c'est donc le FLAG.
Nous voici au second challenge, on a donc bien réussi le premier. Lisons et analysons.
A priori on voit dans l'indice qu'il s'agit de l'alphabet, si on regarde le Cipher du challenge précédent on constate que c'est l'alphabet mais décalé. Connaissant le chiffrement Caesar je me suis directement mis à compter le nombre de décalage qu'il y avait entre celui ci et le vrai alphabet. La réponse est 13, on parle donc du chiffrement ROT13. La méthode de déchiffrage consiste à comparer chaque lettre du message chiffré entre le Cipher et l'alphabet. J'ai donc fait un petit script en python pour automatiser la tâche.
On obtient comme résultat "FTCynitic", on insère le flag et hop on se retrouve au prochain challenge. Deuxième étape réussie.
Nous voisi au troisième challenge, vous connaissez la chanson, lisons et analysons.
Comme indice on nous dit d'utiliser notre cerveau, je suppose donc qu'on devra trouver le moyen de déchiffrer la key sans sources externes.
Pour résoudre ce challenge j'ai tout simplement comparé chaque lettre par colonnes, la key du challenge précédent était "FTCynitic" et la passphase est "dnourorju".
Je compare donc "F" avec "d" à travers les colonnes et j'obtiens la lettre "s".
J'ai donc continué sur cette voie.
J'ai donc fait la même chose pour chaque lettre jusqu'à obtenir le résultat "Seailking". C'est donc le flag final.
Je vous remercie d'avoir lu cette WriteUP, il y aura d'autres WriteUPs dans le futur.




























