UP | HOME

Reverse

Table of Contents

1. Mon setup

Gentoo avec Ghidra pour pouvoir désassembler et décompiler. GDB pour pouvoir exécuter et faire de l'exécution pas à pas. LXD ou Qemu pour avoir une VM Windows 10.

Je fais quelques tests avec Radare2.

2. Premiers check à faire

  • strings : affiche le binaire avec les chaînes de caractères trouvables dedans. Peut contenir un flag.
  • file : pour vérifier si le binaire a été striped et comment il est link.
    • striped : les symboles ont été enlevés, les fonctions ont un nom basé sur leur adresse dans le décompilateur.
    • link : il peut l'être de 2 manières différentes
      • dynamique : on a les noms de fonctions
      • statique : les bibliothèques se trouvent dans le binaire. Un travail supplémentaire peut être nécessaire pour pouvoir identifier les fonctions de la libc par exemple
  • nm : affiche les symboles d'un fichier
  • objdump : affiche les sections (-s) ou avec le code assembleur (-d)
  • readelf : affiche les informations sur un fichier ELF comme l'en-tête, les sections et les adresses

Vidéo de LiveOverflow sur les différences entre un binaire striped et les différentes manières de lier les bibliothèques.

3. Ressources

  • begin.re : explications sur la pile et les premiers pas dans le RE avec IDA (avec des exercices que je n'ai pas encore fait)
  • ninja in training : ressources de Binary Ninja

4. Lire la matrice (l'assembleur)

Pour lire le code désassemblé, c'est utile de connaître un petit peu les bases ainsi qu'une feuille de référence des instructions. Je lis le code désassemblé depuis Ghidra ou Radare2 avec Cutter. Liste de ressources sur l'assembleur.

5. Liste logiciels

Je n'ai pas testé tous les logiciels listés ici. Je les rajouterai au fur et à mesure dans ma configuration ou via des sections dédiées avec plus d'informations si je me penche dessus sérieusement.

5.1. Décompilateurs et désassembleurs

Plutôt orienté C.

Propriétaires, avec une version gratuite restreinte:

5.1.1. Ghidra

Site - CheatSheet

Si l'on voit des zones mémoires qui ressemblent à des strings, il est possible de changer leur type en faisant un clic droit puis dans le menu Data. Cela les affichera comme des chaînes de caractères dans le décompilateur.

Il peut charger des fichiers pdb, contenant des informations de déboguages.

  1. Astuces
    1. Mettre à jour des fonctions

      Après avoir modifié les paramètres d'une fonction, elle ne sera pas forcément mise à jour dans le reste du code. Dans ce cas là, il faut faire un clic droit sur la fonction modifiée et cliquer sur Commit Param/Return (ou taper P).

    2. Mettre en évidence une variable (décompilateur)

      Clic molette sur la variable.

      Pour le mettre par défaut: dans les options, Listing fields, sous-menu Cursor Text Highlight puis changer le bouton de souris.

    3. Voir la stack (désassembleur)

      Il faut se trouver dans la fenêtre du désassembleur et faire un clic droit sur la fonction, et sélection Edit Stack Frame dans le menu Function.

    4. Marque-page

      Il est possible de voir la liste des marques-pages (ou Bookmarks) en cliquant sur le check violet dans la barre de menu. Pour en rajouter, cela se fait dans la vu désassembleur, avec un clic droit.

    5. Bytes view

      Activable dans le menu Windows (sous le nom de Bytes), cela permet d'avoir un éditeur hexadécimal du programme.

    6. Créer une structure

      Clic droit sur la variable : Auto-create Structure. Il est possible de l'éditer en cliquant sur Edit Data Type dans le menu du clic droit.

    7. Créer une structure dans une structure
      1. Sélectionner les champs qui forment cette structure
      2. Cliquer sur le bouton avant la maison
      3. Profit
  2. Plugin
    1. Dragondance

      Plugin permettant de visualiser la couverture de code binaire. Une première version plus maintenu est disponible. Il est préférable d'utiliser son fork.

  3. Scripts
    • ResolveX86orX64LinuxSyscallsScript.java (built-in) : permet de remplacer les appels systèmes faient via syscall par les fonctions.
  4. Débuggeur

    Permet de poser des points d'arrêts avec le raccourcis k sur la ligne où l'on souhaite s'arrêter. Il y a différentes vues pour pouvoir voir l'état des registres, de la stack… Il n'est pas possible de taper dans l'entrée standard par défaut.

5.1.2. Radare2

  1. Conférences

    Très peu de replays disponibles. Certaines slides sont disponible sur Github.

5.1.3. Cutter

Interface graphique basée sur le désassembleur Radare2.

  1. Installation de plugins

    Sur Gentoo

    cmake -DBUILD_CUTTER_PLUGIN=ON -DCMAKE_INSTALL_PREFIX=~/.local -DCUTTER_INSTALL_PLUGDIR=~/.local/share/rizin/cutter/plugins/native/ ..
    

5.1.4. .NET

  1. dnSpy

    Dépôt Github - N'est plus maintenu.

    1. Utilisation de base
      Editer > Rechercher un assemly
      permet de chercher dans tout les fichiers
      Champs de recherche
      double clic ouvre le fichier contenant le code
      Sur un élément > Clic droit > Analyser
      permet de voir où la variable est lue ou ce qu'elle lit
      Clic droit > Éditer la méthode
      permet de modifier une fonction directement dans le DLL
      Clic droit > Modifier la classe
      permet de modifier la classe, peut être plus pratique selon le contexte

      Après des modifications dans le code, il faut cliquer sur Compiler pour enregistrer les modifications. Pour pouvoir les enregistrer dans le DLL, il faut se rendre dans le menu Fichier > Enregistrer tout.

5.2. Débuggueurs

  • OllyDbg (plus maintenu)
  • edb (inspiré de OllyDbg)
  • gdb (gef/pwndbg/peda ?)
  • rr : se veut meilleur / rajouter des fonctionnalités à GDB
  • jdb : pour java

5.2.1. x64dbg

Site - Documentation

Débuggueur pour Windows, fortement inspiré de Ollydbg.

(tuto)

Site fait avec un thème WindowsXP (créé avec l'aide d'une IA).

5.3. Instrumentation binaire

5.3.1. Frida

  1. Ressources
  2. Injection
    1. Android

      Pour se connecter sur une application Android, il faut la patcher avec Frida. Il est possible de le faire de plusieurs manière :

      • objection : objection patchapk -s app.apk
      • apkpatcher : avec son image Docker : docker run --rm -v .:/pwd -it madsquirrels/apkpatcher -a base.apk --download_frida_version 16.3.3

      Il faut ensuite s'y attacher avec frida -U FridaTarget en ayant branché au préalable le téléphone au PC en USB.

  3. Scripting

    Il est possible de communiquer avec Frida en JS via sa console ou écrire des scripts. Un auto reload peut-être utilisé pour recharger et réexécuter le script après sauvegarde du fichier. Les commandes %reload et %autoreload on peuvent être utilisées dans la console pour gérer le script. On peut appeler les fonctions du script à la main dans la console.

    Avec l'API Typescript, il faut installer et importer frida-java-bridge.

    L'instrumentation des classes Java natives se fait facilement. Il est possible d'appeler la fonction originale avec this.Function() :

    import Java from 'frida-java-bridge';
    var string_class = Java.use("java.lang.String");
    var instance = string_class.$new("Toto");
    string_class.charAt.implementation = (c) => {
        console.log("Dans charAt");
        return 'u';
    };
    

    Pour l'instrumentation d'un classe Android de l'application, il faut passer par Java.perform(). Cette fonction va s'assurer que le thread est exécuté dans la MV de l'application.

    import Java from 'frida-java-bridge';
    Java.perform(() => {
        var test_class = Java.use("fr.custom.Classe");
    });
    
  4. Tracer des fonctions

    Par défaut, Frida va instrumenter toutes les fonctions. Il vaut mieux en viser une en particulier pour ne pas avoir une application très lente.

    Il faut utiliser frida-trace. Il peut ne pas tracer certaines fonctions si les éléments n'étaient pas chargés (tel que les boutons sur un menu Android).

    La syntaxe est class_name!function_name. Il est possible d'ajouter l'atome regex *.

  5. Fonctions utiles
    • Java.enumerateMethods : permet d'afficher des informations sur des fonctions. Il est possible d'utiliser la même syntaxe que pour frida-trace (class!function, avec l'opérateur *)

5.3.2. Objection

Orienté pour Android, il permet de faire beaucoup de choses tel que désactiver le check SSL. On se connecte sur un téléphone branché avec objection explore. Exemple pour désactiver SSL: android sslpinning disable.

6. Python compilé

pyinstxtractor pour extraire les fichiers Python du .exe.

decompyle3 pour générer le fichier Python à partir du fichier .pyc. Ne crash pas en cas d'erreur, contrairement à uncompyle6.

https://github.com/zrax/pycdc

7. Jeux vidéos

7.1. Jeu Unity

Les jeux réalisés sous Unity n'ont pas leur code obfusqué de base. Comme ils sont écrit en C#, il est très simple de les reverse avec dnSpy ou ILSpy.

Les fichiers DLL se trouvent dans le dossier X_Data/Managed (où X est le nom du jeu). Il faut ouvrir tous les DLL dans dnSpy afin de pouvoir les lire. Il faut ouvrir le fichier Assembly-CSharp.dll.

7.1.1. reverse c# unity

ressort toutes les classes du jeu (dans le -)

exemple raft est pas obfuscé

iltocpp : transforme les .dll en un seul compilé en cpp avec les options d'obfuscation (il2cpp_data, pas de managed)

dans metadata on a des metadonnées, avec les noms des fonctions, les paramètres

https://github.com/Perfare/Il2CppDumper il2cppdumper : généère des .dll avec les infos mais pas le code. possiblité de faire un plugin ghidra

  • dur d'injecter du code (injection de dll dynamique mais + détectable par les anticheats)

8. Android

Les applications Android sont majoritairement développées en Java ou en Kotlin. Les codes compilés en .class sont ensuite recompilés par d8 en .dex. Sur les anciennes versions d'Android, la machine virtuelle Dalvik les exécutait; maintenant c'est ART qui le fait.

Un APK est une archive qui contient les fichiers compilés en dex, le manifest de l'application, ses ressources et sa signature. Un XAPK est un ensemble d'APKs.

Pour dézipper les fichiers APK, il faut utiliser apktool. Il permet d'extraire, de re-packager et désassembler les fichiers. Pour les fichiers XAPK, la commande unzip suffit.

Les fichiers extraits avec la commande d sont:

  • le manifeste
  • un fichier contenant les informations pour repacker l'application
  • méta-données
  • ressources
  • bibliothèques
  • fichiers assembleurs smali

Le smali est l'assembleur pour la MV Dalvik. baksmali est un désassembleur pour smali qui est inclu nativement. Quarkslab a fait un article de blog expliquant rapidement comment l'écrire et patcher un Android.

Il est possible de voir les activités dans le manifeste ainsi que de les lancer avec la commande adb shell am start le.package.application/.Activite.

8.1. Repacking d'une application

Cela consiste à recompiler l'application en un fichier APK après avoir fait des modifications dedans. Cela peut consister à injecter un logiciel tel que Frida ou modifier le code.

8.1.1. Avec apktool

Pour repacker une application : c'est la commande b. Il faut aussi la signer. Cela se fait en 2 étapes:

  1. créer un trousseau de clés avec Java

    keytool -genkey -v -keystore research.keystore -alias research_key -keyalg RSA -keysize 2048 -validity 10000

  2. signer avec ce trousseau

    jarsigner -verbose -keystore research.keystore app.apk research_key

En cas d'erreur INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, il faut les activer dans le manifeste.

En cas d'erreur: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary], il faut installer le SDK afin d'avoir les build tools. Il faut ensuite taper les commandes suivantes:

zipalign -p -f -v 4 my_app.apk aligned.apk
apksigner sign --ks research.keystore aligned.apk

8.1.2. Avec apkpatcher

Notes en partie basées sur le workshop du Hack 2025.

Apkpatcher est un outil qui permet de repacker rapidement et simplement des APK. Il est possible d'injecter des outils tel que Frida.

# avec docker pour injecter Frida
docker run --rm -v .:/pwd -it madsquirrels/apkpatcher -a base.apk --download_frida_version 16.3.3

# pour repacker une application XAPK qui est découpé en plusieurs APK
apkpatcher -a apk -m split split
# pour activer le debug
apkpatcher -a apk --enable-debug

# ... et bien plus

Asthook a été mentionné pour permettre de mettre en place une MV. A creuser.

8.2. Chaines de caractères

Il existe plusieurs manières de trouver des chaines de caractères :

  • en dur (string dans le code)
  • dans les ressources (repérable avec getString(R.)), dans le fichier resources.arsc
  • dans du code natif (bibliothèque .so), dans le dossier lib. La JNI1 est utilisée dans ce cas (appel de NativeLib)

8.3. Obfuscation

Proguard est un obfuscateur libre pour applications Android (Java et Kotlin). Il va renommer toutes les fonctions par une lettre.

9. JS

Pour faire du reverse de JS, il suffit de lire le code dans le navigateur. Il peut cependant être obfusqué avec des outils tel que obfuscator.

10. Java

La commande jar xf permet d'extraire la classe du fichier jar.

Liste de logiciels :

  • javap : désassemble des fichiers .class (on reçoit du byte code !)
  • jadx : décompilateur (apk). Permet d'extraire des snippets de code pour Frida
  • VineFlower (anciennement QuiltFlower)
  • Nester : utile pour l'obfuscation
  • Enigma : idem
  • ASM OW2 : permet de patcher des classes
  • JD Project : permet de RE des classes et des jars
  • JavaDecompilers : site web regroupant des outils en ligne

11. Liste challenges

11.1. Reversing.kr

Site web

  • Easy Crack (Windows) [WU]
  • Easy Keygen (Windows)
  • Easy Unpack (Windows)
  • Music Player (Windows)
  • Replace (Windows)
  • ImagePrc (Windows)
  • Position (Windows)
  • Direct3D FPS (Windows)
  • Ransomware (Windows)
  • Twist1 (Windows)
  • Easy ELF (Linux)
  • WindowsKernel (Windows)
  • AutoHotKey1 (Windows)
  • CSHOP (Windows)
  • PEPassword (Windows)
  • HateIntel (Apple)
  • SimpleVM (Linux)
  • AutoHotKey2 (Windows)
  • x64 Lotto (Windows)
  • CSHARP (Windows)
  • Flash Encrypt (Flash)
  • MetroApp (Windows)
  • CRC1 (Windows)
  • Multiplicative (Java)
  • CRC2 (Windows)
  • Adventure (Windows)
  • CustomShell

11.2. Crackmes.one

Site regroupant pleins de challenges de reverse. La communauté propose des challenges, en respectant quelques règles. Ces challenges sont ensuite résolus par la communauté qui peut soumettre des solutions. Elles sont listées dans l'onglet "Solutions". Les challenges et les solutions se trouvent dans des dossiers ZIP chiffrés, le mot de passe est crackmes.one, sauf indication contraire dans la description.

Il reprend le fonctionnement et le design de crackmes.de qui n'est plus en ligne. Certains challenges viennent de ce site aussi.

11.2.1. Niveau 1 à 2 (simple)

11.2.2. Niveau 3

11.2.3. Niveau 4

11.2.4. Niveau 5 à 6 (BBT2)

11.2.5. PWN

Footnotes:

1

Java Native Interface

2

Boule et Bite Torture

Author: rick

Email: rick@gnous.eu

Created: 2025-08-07 jeu. 01:37

Validate