Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
ndhquals2015:mass_surveillance_software [2015/04/05 16:09] angel_killah |
ndhquals2015:mass_surveillance_software [2017/04/09 15:33] (Version actuelle) |
||
---|---|---|---|
Ligne 11: | Ligne 11: | ||
=== Analyse === | === Analyse === | ||
- | TODO : Flyingwolf? | + | == Desobfuscation == |
+ | Une fois unpacké, le binaire a été chargé dans IDA pour une analyse statique. Le code était très légèrement obfusqué avec des instructions inutiles qui permettaient de désaligner le code. IDA est alors perdu et affiche un code qui n'a rien à voir avec celui qui s’exécute réellement. Le premier travail de l'analyste est donc de "proprifier" un peu tout ça : | ||
+ | |||
+ | .text:00401642 mov dword ptr [esp-4], (offset 40164A+1) | ||
+ | .text:0040164A mov esi, 0E6FF465Eh | ||
+ | .text:0040164F call dword ptr [esp-4] | ||
+ | |||
+ | Une adresse qui se situe au milieu de l'instruction "mov esi, 0E6FF465Eh" est placée sur la pile, puis un call est fait sur cette adresse. Le code est donc désaligné, et le vrai code exécuté correspond alors à : | ||
+ | |||
+ | pop esi | ||
+ | inc esi | ||
+ | jmp esi | ||
+ | |||
+ | En bref, le call place l'adresse de retour sur la pile, qui est "popé" dans esi. La suite du code est donc à <adresse retour> + 1 !!! | ||
+ | C'était la seule obfuscation du code, le reste du travail est alors de trouver la routine qui s’exécute lorsque les 14 caractères du flag sont entrés par l'utilisateur. | ||
+ | |||
+ | == Reverse des routines de validation == | ||
+ | |||
+ | Nous avons affaire à une fenêtre windows, donc il faut trouver la callback qui lui est fourni et qui s'occupe de gérer tous les évènements qui s'applique à ladite fenêtre. | ||
+ | Classiquement, la routine fait un switch sur les types d’évènements (ou "message" dans le langage Windows) qui lui arrive. | ||
+ | |||
+ | On remarque que quand le message WM_INIT_DIALOG (autrement dit quand la fenêtre s'ouvre) arrive, une nouvelle routine est affectée à la place de l'ancienne. Qu'à cela ne tienne, on va voir ce que fait la deuxième. | ||
+ | Cette dernière s'occupe des messages WM_CHAR (une touche a été pressée). Ca tombe vachement bien, c'est ce qu'on fait quand on entre le flag à trouver... | ||
+ | |||
+ | La routine attend que 14 caractères aient été entrés, puis appelle une première routine de hashage sur les 7 premiers caractères et une second sur les 7 derniers. | ||
+ | |||
+ | Routine 1 : | ||
+ | .text:004010C5 xor al, PasswordEntered[ecx] | ||
+ | .text:004010CB rol eax, 7 | ||
+ | .text:004010CE imul eax, edx | ||
+ | .text:004010D1 not eax | ||
+ | .text:004010D3 imul eax, edx | ||
+ | .text:004010D6 ror eax, 2 | ||
+ | .text:004010D9 loopne loc_4010C5 | ||
+ | |||
+ | |||
+ | Routine 2 : | ||
+ | .text:00401245 xor al, (PasswordEntered+7)[ecx] | ||
+ | .text:0040124B ror eax, 2 | ||
+ | .text:0040124E imul eax, edx | ||
+ | .text:00401251 not eax | ||
+ | .text:00401253 rol eax, 7 | ||
+ | .text:00401256 loopne loc_401245 | ||
+ | |||
+ | Rien de bien sorcier en l’occurrence. Une fois les hash calculés, il sont comparés avec deux valeurs hardcodées. Une autre indication nous est donné un peu plus loin; le flag devait commencer par 'M' et avoir un 'd' en 8ème position. | ||
+ | |||
+ | L'analyse statique terminée, il ne nous est plus resté qu'à écrire le code pour bruteforcer les combinaisons possibles et trouver le flag. | ||
=== Code de résolution === | === Code de résolution === | ||
Ligne 65: | Ligne 111: | ||
{ | { | ||
- | char *alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!"; | + | char *alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
char str[7]; | char str[7]; | ||
unsigned int out; | unsigned int out; | ||
Ligne 100: | Ligne 146: | ||
En regardant les différents hashes valides, on s'aperçoit qu'on a deux hashes qui ressemblent à des mots allemands : | En regardant les différents hashes valides, on s'aperçoit qu'on a deux hashes qui ressemblent à des mots allemands : | ||
- | MeinHan | + | |
- | dyKaput | + | * MeinHan |
+ | * dyKaput | ||
en les concaténant, on valide enfin l'épreuve \o/ | en les concaténant, on valide enfin l'épreuve \o/ |