Démarche de rétro ingenierie

Point d’entrée.

Nous devons dans un premier temps trouver un point d’entrée.
Une idée pourrait être de regarder les différentes fonctions pour si nous trouvions des fonctions qui puissent nous laisser penser qu’elle soit importante.

DM1

Nous nous retrouvons face à beaucoup de fonctions différentes avec des noms incompréhensibles.

DM1

S’en suit alors une phase de réflexion. Nous avons donc chercher un moyen de trouver un élément caractéristique de wannacry que nous pourrions reconnaître.
Après quelques recherches, nous voyons que wannacry possède ce que les appel un killswitch (expliqué dans la partie analyse du binaire). Nous nous attendons donc à trouver quelque part une URL, servant à une requête DNS.
Nous cherchons dans “Defined Strings” une string ressemblant à une adresse.

DM1

Nous trouvons alors “zoglu.de”.

DM1

Dans le code assembleur, nous voyons l’adresse de la fonction qui appelle cette string.
On double clique dessus.

DM1

Nous arrivons sur une fonction dans la fenêtre “Decompile:”

DM1

Nous voyons que cette string est appelé dans une requête DNS, ce qui semble cohérent avec notre killswitch, nous avons trouvé notre point d’entrée.
Après manipulation de l’outil ghidra et de ces fonctionnalités nous nous sommes rendu compte que nous aurions pu aller directement à la fonction “entry” et remonter les appels des fonctions, ce qui aurait plus judicieux.

DM1

Désobfuscation.

Afin de rendre notre programme compréhensible, nous n’avons pas d’autre choix que de le lire du début à la fin en essayant de le comprendre.
Pour faciliter cela, certaines bonnes pratiques sont nécessaires.
Dans un premier temps, nous cherchons sur internet l’utilisation de chaque fonction windows avec un nom explicite. Pour cela, nous utilisons la documentation windows.
Lorsque nous arrivons à trouver du sens dans des bouts de code, nous pouvons écrire dans un fichier texte ce que nous avons compris, mais aussi renommer les variables afin de rendre le code plus clair.
Cliquer droit sur la variable à renommer puis sélectionner “Rename variable”.

DM1

Mettre le nom désiré puis cliquer sur “OK”.

DM1

Une autre bonne pratique consiste à ajouter des commentaires au fur et à mesure pour expliquer chaque chose comprise.
Cela augmentera grandement la fluidité de la lecture et donc la rapidité de la compréhension.
Cliquer droit sur la ligne comprise (1).
Cliquer sur “Comments” (2).
Cliquer sur “Set pre comments…” (3).

DM1

Ajouter le commentaire (1).
Cliquer sur “OK”. (2).

DM1

Une dernière bonne pratique consiste à renommer les fonctions dont on a compris le fonctionnement. Cela renommera dans tout le projet et permettra une lecture globale plus fluide. Cliquer droit sur la fonction à renommer (1). Cliquer sur “Rename function” (2).

DM1

Choisir le nom (1).
Cliquer sur “OK” (2).

DM1

Pour naviguer dans le projet, nous pouvons suivre les appels de fonction en cliquant simplement dessus.
Au fur à mesure que nous avançons dans le projet en désobfuscant le projet s’éclaircit et nous en tirons du sens.

DM1

Un autre moyen pour avoir une vision globale du projet et d’afficher l’arborescence des appels de fonctions.
Pour cela, cliquer sur “window”.

DM1

Cliquer sur “Function Call Graph”.

DM1

Une fenêtre s’affiche, nous pouvons voir à la racine de l’arbre la fonction sur laquelle nous nous trouvions au moment de l’ouverture de la fenêtre.
Chaque fils et une fonction appelée dans la fonction courante.
En cliquant sur un nœud, la fonction s’ouvre.

DM1