Testez ma patience par la Check Point Security Academy

J'ai mentionné le programme Check Point Security Academy à plusieurs reprises sur Habré: son essence est que la société Check Point a annoncé un concours au format Capture the Flag en été, où l'expérience passée du participant n'est pas importante, mais seulement sa capacité à démêler le cyber énigmes. Sur la base des résultats de ce concours, l'entreprise a recruté une vingtaine de participants pour une formation professionnelle de trois mois en cybersécurité, et tous les participants dès le début du cours reçoivent l'intégralité du salaire d'un spécialiste en KB, dans l'obligation de travailler dans l'entreprise deux ans après la fin du cours.


Dans une compétition de la FCE, un drapeau peut même être une image comme celle-ci.

La sélection des participants s'est terminée en août, mais le site Web du concours continuera de fonctionner jusqu'à l'été prochain, et j'invite ceux qui souhaitent s'inscrire et tenter leur chance dans l'intérêt du sport. Le concours se compose de 12 puzzles de complexité variable, évalués de 10 à 150 points.
Ici, je veux analyser le puzzle "Test My Patience" de la catégorie "Surprise". Elle est de difficulté moyenne (50 points), et voici son texte intégral:
Salut
Nous avons trouvé cet exécutable sur l'ordinateur de l'horloger local.
La rumeur dit que l'horloger était en quelque sorte la seule personne à avoir réussi à le casser.
Vous pensez être aussi bon que l'horloger?
Remarque: ce fichier n'est en aucun cas malveillant
Par référence - un binaire 32 bits pour Windows, sur lequel certains antivirus jurent , mais si vous l'exécutez toujours, il ressemble à ceci:



L'intérieur du binaire est crypté; Il refuse de s'exécuter sous le débogueur; si vous essayez de lui connecter un débogueur alors qu'il est en cours d'exécution, il s'arrête immédiatement. Probablement, les spécialistes de Check Point ont enveloppé leur puzzle dans un crypto-packer, emprunté à une sorte de malvari.

Comment deviner le numéro composé par l'horloger?

Il y a deux façons. Le premier peut être appelé conditionnellement "il y a du pouvoir, pas d'esprit": si le programme ne peut pas être débogué en direct, alors nous déboguerons le mort!

Nous lançons le "Gestionnaire des tâches" 32 bits (\ Windows \ SysWOW64 \ taskmgr.exe), cliquez avec le bouton droit sur le processus mystérieux et sélectionnez Créer un fichier de vidage. (Le Gestionnaire des tâches 64 bits pour les processus 32 bits crée un vidage de l'émulateur wow64cpu, qui est plus difficile à utiliser.)

Nous regardons dans le vidage et voyons qu'au moins les lignes qu'il contient sont déjà déchiffrées:



Mais les lignes avec le numéro masqué ou le drapeau ne sont pas encore visibles.

Nous passons à l'arme principale de calibre: WinDbg (X86) -> Open Crash Dump ...



Où en mémoire est la ligne que nous voulons voir imprimée - "Bon travail mon ami!"?
La commande lm vous permet de déterminer que le binaire est chargé de 01140000 à 015b2000 ; puis sa 01140000 015b2000 "Good job my friend!" trouve la chaîne de recherche à 0115a0d0 :



Voyons maintenant où cette ligne est imprimée: peut-être qu'une commande contient des octets d0 a0 15 01 correspondant à l'adresse de la ligne que vous recherchez? ( sb 01140000 015b2000 d0 a0 15 01 )

Bonne chance! - une telle équipe a été trouvée:



Quel est le code autour de cette commande? ( ub 011412f7; u 011412f7 )



Nous voyons qu'en fonction du résultat de la fonction 01141180 soit le message souhaité est imprimé, soit «Mauvais ...»

Le code de fonction 01141180 occupe trois écrans; il est assez facile de voir qu'il s'agit d'une implémentation de strcmp() , à l'intérieur de laquelle un appel à Sleep(700) a été ajouté. On ne sait pas encore pourquoi il y a Sleep() ; mais cela n'affecte toujours pas le résultat de la fonction, nous allons donc mieux comprendre ce que les chaînes sont comparées:



Deux pointeurs égaux à ebp-14h et ebp-24h ebp-14h ; le second d'entre eux a été passé à la fonction 011410b0 comme 011410b0 .
N'est-ce pas la fonction qui demande le numéro caché? Vérifions la pile d'appels ( k ):



Oui, c'est elle!

Le schéma général du puzzle est maintenant clair: l'intuition de l'utilisateur est stockée à ebp-24h , le nombre ebp-14h à ebp-14h , puis ils sont comparés et soit "Bon travail mon ami!" Ou "Mauvais ..." est imprimé.

Il ne reste plus qu'à extraire le numéro caché du cadre de pile. Nous connaissons déjà son ebp de la pile des appels:



Allez, allez ...



Succès! Vous pouvez déboucher quelque chose de savoureux.

Mais trois choses mystérieuses sont restées sans explication:
  1. Pourquoi y a-t-il un appel à Sleep(700) à l'intérieur du strcmp() Sleep(700) ?
  2. Pourquoi, lorsque nous avons entré le numéro caché, le programme s'est-il bloqué pendant dix secondes avant d'imprimer «Bon travail mon ami!»?
  3. Qu'est-ce que l'horloger a à voir avec ce puzzle?

Ainsi, il s'avère qu'il existe une deuxième façon - plus intelligente - de deviner le nombre deviné. Si vous essayez simplement au hasard les nombres 0-9, il est facile de remarquer que sur les neuf le programme "se bloque" un peu. Si vous essayez les nombres 90-99, vous pouvez voir que sur le numéro 98 le programme "se bloque" deux fois plus longtemps. (Après avoir découvert ses tripes, nous comprenons déjà le problème: une comparaison réussie de chaque paire de caractères entraîne un retard de 0,7 s.) Pour résoudre le puzzle sans même démarrer le débogueur, il suffisait de sélectionner chaque chiffre suivant pour que le délai avant la réponse augmente - soit manuellement avec un chronomètre exact ou un simple script. Ainsi, les compilateurs ont laissé entendre une méthode de longue date d'attaquer les algorithmes cryptographiques , lorsque le temps jusqu'à ce qu'un message d'erreur soit mesuré et analysé.

Mais apprendre à récupérer des programmes enveloppés dans des crypto-packers inconnus est, à mon avis, à la fois plus intéressant et plus précieux :-)

Notez que nous n'avions pas besoin de comprendre comment le binaire est crypté, ni comment la chaîne avec le numéro que vous voyez apparaît sur la pile (nous avons vu dans le vidage qu'elle ne faisait pas partie des constantes de chaîne) - nous avons réussi à préparer et à préparer les deux, et pour cela une douzaine de commandes WinDbg suffisaient.

Source: https://habr.com/ru/post/fr430210/


All Articles