Reversing Tools & Basic Methods
Last updated
Last updated
Groupe de sécurité Try Hard
Logiciel :
ReverseKit : https://github.com/zer0condition/ReverseKit
En ligne :
Utilisez https://webassembly.github.io/wabt/demo/wasm2wat/index.html pour décompiler du wasm (binaire) en wat (texte clair)
Utilisez https://webassembly.github.io/wabt/demo/wat2wasm/ pour compiler du wat en wasm
Vous pouvez également essayer d'utiliser https://wwwg.github.io/web-wasmdec/ pour décompiler
Logiciel :
dotPeek est un décompilateur qui décompile et examine plusieurs formats, y compris les bibliothèques (.dll), les fichiers de métadonnées Windows (.winmd) et les exécutables (.exe). Une fois décompilée, une assemblée peut être enregistrée en tant que projet Visual Studio (.csproj).
Le mérite ici est que si un code source perdu nécessite une restauration à partir d'une assemblée héritée, cette action peut faire gagner du temps. De plus, dotPeek offre une navigation pratique dans le code décompilé, ce qui en fait l'un des outils parfaits pour l'analyse d'algorithmes Xamarin.
Avec un modèle d'extension complet et une API qui étend l'outil pour répondre à vos besoins exacts, .NET Reflector fait gagner du temps et simplifie le développement. Jetons un coup d'œil à la pléthore de services d'ingénierie inverse que cet outil fournit :
Fournit un aperçu de la façon dont les données circulent à travers une bibliothèque ou un composant
Fournit un aperçu de la mise en œuvre et de l'utilisation des langages et des frameworks .NET
Trouve des fonctionnalités non documentées et non exposées pour tirer davantage parti des API et des technologies utilisées.
Trouve les dépendances et les différentes assemblées
Repère l'emplacement exact des erreurs dans votre code, les composants tiers et les bibliothèques.
Débogue dans la source de tout le code .NET avec lequel vous travaillez.
Plugin ILSpy pour Visual Studio Code : Vous pouvez l'avoir dans n'importe quel OS (vous pouvez l'installer directement depuis VSCode, pas besoin de télécharger le git. Cliquez sur Extensions et recherchez ILSpy). Si vous avez besoin de décompiler, modifier et recompiler à nouveau, vous pouvez utiliser dnSpy ou une version maintenue activement de celui-ci, dnSpyEx. (Clic droit -> Modifier la méthode pour changer quelque chose à l'intérieur d'une fonction).
Pour faire en sorte que DNSpy enregistre certaines informations dans un fichier, vous pouvez utiliser ce snippet :
Pour déboguer du code en utilisant DNSpy, vous devez :
Tout d'abord, modifier les attributs de l'Assembly liés au débogage :
À :
Et cliquez sur compiler :
Ensuite, enregistrez le nouveau fichier via Fichier >> Enregistrer le module... :
Ceci est nécessaire car si vous ne le faites pas, à l'exécution plusieurs optimisations seront appliquées au code et il pourrait être possible qu'en déboguant un point d'arrêt ne soit jamais atteint ou que certaines variables n'existent pas.
Ensuite, si votre application .NET est exécutée par IIS, vous pouvez la redémarrer avec :
Ensuite, pour commencer le débogage, vous devez fermer tous les fichiers ouverts et dans l'onglet Débogage, sélectionnez Joindre au processus... :
Ensuite, sélectionnez w3wp.exe pour vous attacher au serveur IIS et cliquez sur Joindre :
Maintenant que nous déboguons le processus, il est temps de l'arrêter et de charger tous les modules. Cliquez d'abord sur Déboguer >> Interrompre tout puis cliquez sur Déboguer >> Fenêtres >> Modules :
Cliquez sur n'importe quel module dans Modules et sélectionnez Ouvrir tous les modules :
Cliquez avec le bouton droit sur n'importe quel module dans Explorateur d'assemblage et cliquez sur Trier les assemblages :
https://github.com/skylot/jadx https://github.com/java-decompiler/jd-gui/releases
Charger rundll32 (64 bits dans C:\Windows\System32\rundll32.exe et 32 bits dans C:\Windows\SysWOW64\rundll32.exe)
Sélectionnez le débogueur Windbg
Sélectionnez "Suspendre lors du chargement/déchargement de la bibliothèque"
Configurez les paramètres de l'exécution en mettant le chemin d'accès à la DLL et la fonction que vous souhaitez appeler :
Ensuite, lorsque vous commencez le débogage, l'exécution s'arrêtera à chaque chargement de DLL, puis, lorsque rundll32 charge votre DLL, l'exécution s'arrêtera.
Mais, comment accéder au code de la DLL qui a été chargée ? En utilisant cette méthode, je ne sais pas comment.
Charger rundll32 (64 bits dans C:\Windows\System32\rundll32.exe et 32 bits dans C:\Windows\SysWOW64\rundll32.exe)
Changer la ligne de commande ( Fichier --> Changer la ligne de commande ) et définir le chemin de la DLL et la fonction que vous souhaitez appeler, par exemple : "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\14.ridii_2.dll",DLLMain
Changer Options --> Paramètres et sélectionner "Entrée DLL".
Ensuite, démarrer l'exécution, le débogueur s'arrêtera à chaque point d'entrée de la DLL, à un moment donné vous vous arrêterez dans l'entrée de la DLL. À partir de là, recherchez simplement les points où vous souhaitez mettre un point d'arrêt.
Notez que lorsque l'exécution est arrêtée pour une raison quelconque dans win64dbg, vous pouvez voir dans quel code vous êtes en regardant en haut de la fenêtre win64dbg :
Ensuite, en regardant cela, vous pouvez voir quand l'exécution a été arrêtée dans la DLL que vous souhaitez déboguer.
Cheat Engine est un programme utile pour trouver où les valeurs importantes sont enregistrées dans la mémoire d'un jeu en cours d'exécution et les modifier. Plus d'informations dans :
Cheat EngineBlobrunner va allouer le shellcode dans un espace mémoire, vous indiquer l'adresse mémoire où le shellcode a été alloué et arrêter l'exécution. Ensuite, vous devez attacher un débogueur (Ida ou x64dbg) au processus et mettre un point d'arrêt à l'adresse mémoire indiquée et reprendre l'exécution. De cette manière, vous déboguerez le shellcode.
La page des versions github contient des zips contenant les versions compilées : https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5 Vous pouvez trouver une version légèrement modifiée de Blobrunner dans le lien suivant. Pour la compiler, il suffit de créer un projet C/C++ dans Visual Studio Code, copier et coller le code et le compiler.
Blobrunnerjmp2it est très similaire à blobrunner. Il va allouer le shellcode dans un espace mémoire et démarrer une boucle éternelle. Vous devez ensuite attacher le débogueur au processus, démarrer, attendre 2-5 secondes et appuyer sur stop et vous vous retrouverez dans la boucle éternelle. Sautez vers l'instruction suivante de la boucle éternelle car ce sera un appel au shellcode, et enfin vous vous retrouverez à exécuter le shellcode.
Vous pouvez télécharger une version compilée de jmp2it sur la page des versions.
Cutter est l'interface graphique de radare. En utilisant Cutter, vous pouvez émuler le shellcode et l'inspecter dynamiquement.
Notez que Cutter vous permet d'"Ouvrir un fichier" et "Ouvrir un shellcode". Dans mon cas, lorsque j'ai ouvert le shellcode en tant que fichier, il l'a décompilé correctement, mais lorsque je l'ai ouvert en tant que shellcode, il ne l'a pas fait :
Pour démarrer l'émulation à l'endroit souhaité, définissez un point d'arrêt là-bas et apparemment Cutter démarrera automatiquement l'émulation à partir de là :
Vous pouvez voir la pile par exemple dans un dump hexadécimal :
Vous devriez essayer scdbg. Il vous indiquera quelles fonctions le shellcode utilise et si le shellcode se décrypte en mémoire.
scDbg dispose également d'un lanceur graphique où vous pouvez sélectionner les options que vous souhaitez et exécuter le shellcode
L'option Créer un dump va générer le shellcode final si des modifications sont apportées dynamiquement au shellcode en mémoire (utile pour télécharger le shellcode décodé). L'offset de démarrage peut être utile pour démarrer le shellcode à un offset spécifique. L'option Déboguer le shell est utile pour déboguer le shellcode en utilisant le terminal scDbg (cependant, je trouve que l'une des options expliquées précédemment est meilleure pour cette tâche car vous pourrez utiliser Ida ou x64dbg).
Téléchargez votre fichier de shellcode en tant qu'entrée et utilisez la recette suivante pour le décompiler: https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)
Cet obfuscateur modifie toutes les instructions pour mov
(oui, vraiment cool). Il utilise également des interruptions pour changer les flux d'exécution. Pour plus d'informations sur son fonctionnement :
Si vous avez de la chance, demovfuscator déobfuscera le binaire. Il a plusieurs dépendances
Et installez keystone (apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install
)
Si vous participez à un CTF, cette astuce pour trouver le drapeau pourrait être très utile: https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html
Pour trouver le point d'entrée, recherchez les fonctions par ::main
comme dans :
Dans ce cas, le binaire s'appelait authenticator, il est donc assez évident que c'est la fonction main intéressante. Ayant le nom des fonctions appelées, recherchez-les sur Internet pour en apprendre davantage sur leurs entrées et sorties.
Pour les binaires compilés en Delphi, vous pouvez utiliser https://github.com/crypto2011/IDR
Si vous devez inverser un binaire Delphi, je vous suggère d'utiliser le plugin IDA https://github.com/Coldzer0/IDA-For-Delphi
Appuyez simplement sur ATL+f7 (importez le plugin python dans IDA) et sélectionnez le plugin python.
Ce plugin exécutera le binaire et résoudra dynamiquement les noms de fonction au début du débogage. Après le démarrage du débogage, appuyez à nouveau sur le bouton Démarrer (le bouton vert ou f9) et un point d'arrêt sera atteint au début du code réel.
C'est également très intéressant car si vous appuyez sur un bouton dans l'application graphique, le débogueur s'arrêtera dans la fonction exécutée par ce bouton.
Si vous devez inverser un binaire Golang, je vous suggère d'utiliser le plugin IDA https://github.com/sibears/IDAGolangHelper
Appuyez simplement sur ATL+f7 (importez le plugin python dans IDA) et sélectionnez le plugin python.
Cela résoudra les noms des fonctions.
Sur cette page, vous pouvez trouver comment obtenir le code python à partir d'un binaire compilé ELF/EXE python :
Decompile compiled python binaries (exe, elf) - Retreive from .pycSi vous obtenez le binaire d'un jeu GBA, vous pouvez utiliser différents outils pour émuler et déboguer :
no$gba (Téléchargez la version de débogage) - Contient un débogueur avec interface
mgba - Contient un débogueur CLI
gba-ghidra-loader - Plugin Ghidra
GhidraGBA - Plugin Ghidra
Dans no$gba, dans Options --> Configuration de l'émulation --> Contrôles** ** vous pouvez voir comment appuyer sur les boutons de la Game Boy Advance
Lorsqu'ils sont pressés, chaque touche a une valeur pour l'identifier:
Donc, dans ce type de programme, la partie intéressante sera comment le programme traite l'entrée de l'utilisateur. À l'adresse 0x4000130, vous trouverez la fonction couramment trouvée : KEYINPUT.
Dans l'image précédente, vous pouvez voir que la fonction est appelée depuis FUN_080015a8 (adresses : 0x080015fa et 0x080017ac).
Dans cette fonction, après quelques opérations d'initialisation (sans aucune importance) :
On a trouvé ce code :
Le dernier if vérifie si uVar4
se trouve dans les dernières clés et n'est pas la clé actuelle, également appelée relâchement d'un bouton (la clé actuelle est stockée dans uVar1
).
Dans le code précédent, vous pouvez voir que nous comparons uVar1 (l'endroit où se trouve la valeur du bouton pressé) avec certaines valeurs :
Tout d'abord, il est comparé avec la valeur 4 (bouton SELECT) : Dans le défi, ce bouton efface l'écran.
Ensuite, il est comparé avec la valeur 8 (bouton START) : Dans le défi, cela vérifie si le code est valide pour obtenir le drapeau.
Dans ce cas, la variable DAT_030000d8
est comparée avec 0xf3 et si la valeur est la même, un certain code est exécuté.
Dans tous les autres cas, un cont (DAT_030000d4
) est vérifié. C'est un cont car il ajoute 1 juste après avoir entré le code.
Si c'est inférieur à 8, quelque chose qui implique d'ajouter des valeurs à DAT_030000d8
est fait (essentiellement, il ajoute les valeurs des touches pressées dans cette variable tant que le cont est inférieur à 8).
Ainsi, dans ce défi, en connaissant les valeurs des boutons, vous deviez appuyer sur une combinaison d'une longueur inférieure à 8 pour que l'addition résultante soit 0xf3.
Référence pour ce tutoriel : https://exp.codes/Nostalgia/
https://github.com/malrev/ABD (Déobfuscation binaire)
Groupe de sécurité Try Hard