Dans cet article, nous allons comprendre comment décompiler des fichiers ELF dans Cutter en utilisant l'exemple des tâches légères. Introduction passée aux
parties inversées: Partie 1: Décompilation C, C ++ et DotNet - Bases de la marche arrière
Partie 2: MIPS Reverse et Golang - Bases de la marche arrière
Informations organisationnelles
Surtout pour ceux qui veulent apprendre quelque chose de nouveau et se développer dans l'un des domaines de l'information et de la sécurité informatique, j'écrirai et parlerai des catégories suivantes:
, , , .
, , Telegram . , , .
. , - , .
- PWN;
- cryptographie (Crypto);
- technologies de réseau (réseau);
- (Reverse Engineering);
- (Stegano);
- WEB-.
, , , .
, , Telegram . , , .
. , - , .
De fausses instructions
Il s'agit de la huitième mission de cette catégorie, et nous sommes informés de la présence de fausses instructions. Commençons par regarder les informations du fichier.
J'ouvre le programme dans Cutter - une interface graphique pour radare2 avec un décompilateur ghidra intégré qui a la capacité d'émuler et plus récemment de déboguer. Et immédiatement, nous obtenons une liste intéressante de fonctions.
Passons à la fonction principale et décompilons-la.
Au tout début, le canary est initialisé et le nombre d'arguments est vérifié. Après cela, les octets 0x1f sont alloués, où la chaîne constante spécifiée est copiée, l'adresse est stockée dans la variable iVar3, puis les octets individuels de cette chaîne sont modifiés. Ensuite, les transformations ont lieu avec la chaîne s1, ce qui ne nous intéresse pas. La fonction WPA est également initialisée, et le mot de passe que nous avons entré est écrit à l'adresse auStack50 et transmis avec la chaîne iVar3 convertie à la fonction WPA, après quoi la valeur Canary est vérifiée et le programme se termine.
Passons à la fonctionnalité WPA.
La ligne précédemment insérée dans le programme est à nouveau modifiée, après quoi les deux lignes sont comparées. S'ils sont égaux, la fonction blowfish () sera appelée, ce qui nous affichera le mot de passe correct pour le changement, sinon la fonction RS4 () sera appelée.
Puisque le décryptage des valeurs précédemment saisies se produit, nous pouvons déboguer le programme et modifier le résultat de la comparaison. Allons à l'endroit où les chaînes sont comparées et définissons un point d'arrêt.
Maintenant, commençons le débogage - F9, et entrez les arguments du programme.
Cliquez sur le bouton plus loin dans la barre de navigation jusqu'à ce que nous atteignions notre point d'arrêt. Le résultat de la comparaison de chaînes à l'aide de la fonction strcmp () sera écrit dans le registre EAX, qui sera ensuite vérifié. Puisque les chaînes ne sont pas égales, ce registre contient la valeur 1.
Modifions-le à 0 pour changer la branche du comportement du programme et continuer à s'exécuter. Après avoir terminé dans la console Cutter, nous verrons la bonne réponse, qui doit être soumise sur le site.
Ptrace
Téléchargez le programme et vérifiez-le.
Rien d'extraordinaire, il faut trouver un mot de passe. Mais il y a une petite protection contre le débogage (ptrace) et les transitions qui doivent être éditées manuellement. C'est ainsi que le graphique apparaît dans IDA Pro.
Nous ferons également cette tâche dans Cutter, il corrigera automatiquement toutes les transitions.
Passons à la décompilation de la fonction principale.
Et le mot de passe correct est les 4 lettres correspondantes de la chaîne spécifiée au tout début.
BRAS ELF
C'est un binaire pour l'architecture ARM, nous le jetons dans Cutter et sélectionnons la fonction principale. À partir du graphe de fonctions, nous voyons à quoi nous avons affaire, et il s'agit très probablement d'une comparaison symbole par symbole.
Nous ouvrons le décompilateur et analysons le programme.
Tout d'abord, la présence de l'argument programme et sa longueur sont vérifiées, elle doit être égale à 6.
Ainsi la variable var_14h agit comme un index et prend la valeur 0. Et puis un certain nombre de comparaisons ont lieu, que nous considérerons comme conditions:
str [0] == str [5]
str [0] + 1 == chaîne [1]
chaîne [3] + 1 == chaîne [0]
chaîne [2] + 4 == chaîne [5]
chaîne [4] + 2 == chaîne [2]
0 == str [3] ^ 0x72 Implémentons
l'algorithme et récupérons le mot de passe.
Et nous obtenons le mot de passe requis. C'est tout pour le moment.
Vous pouvez nous rejoindre àTélégramme . Vous pouvez y trouver des documents intéressants, des cours et des logiciels qui ont fui. Rassemblons une communauté dans laquelle il y aura des gens qui connaissent de nombreux domaines de l'informatique, alors nous pourrons toujours nous entraider sur tous les problèmes informatiques et de sécurité de l'information.