Outils d'utilisateurs

Outils du Site


ndhquals2015:mass_surveillance_software

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

ndhquals2015:mass_surveillance_software [2015/04/05 16:08]
angel_killah
ndhquals2015:mass_surveillance_software [2017/04/09 15:33] (Version actuelle)
Ligne 1: Ligne 1:
 ===== Mass Surveillance Software ===== ===== Mass Surveillance Software =====
 +
 +lien pour télécharger l'archive : http://repo.zenk-security.com/ctfs/ndh2k15/mass.tar.gz
  
 === Unpack === === Unpack ===
Ligne 9: 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 63: Ligne 111:
 { {
  
- char *alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!"; + char *alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
  char str[7];  char str[7];
  unsigned int out;  unsigned int out;
Ligne 98: 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/ 
ndhquals2015/mass_surveillance_software.1428242905.txt.gz · Dernière modification: 2017/04/09 15:33 (modification externe)