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.

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

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 : expliquations sur la pile et les premiers pas dans le RE avec IDA (avec des exercices que je n'ai pas encore fait)

4. Lire la matrice (l'assembleur)

4.1. X86

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.

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. Scripts
    • ResolveX86orX64LinuxSyscallsScript.java (built-in) : permet de remplacer les appels systèmes faient via syscall par les fonctions.
  3. 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.1.5. Java

  • javap : désassemble des fichiers .class (on reçoit du byte code !)
  • jadx
  • 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

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

5.2. Débuggueurs

  • OllyDbg (plus maintenu)
  • edb (inspiré de OllyDbg)
  • x64dbg (windows), inspiré de ollydbg (tuto)
  • gdb (gef/pwndbg/peda ?)
  • rr : se veut meilleur / rajouter des fonctionnalités à GDB

5.3. Instrumentation binaire

5.3.1. Frida

Site

HandBook (contient des exercices pour apprendre).

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.

7. 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. 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.

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

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.

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.

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

9. Liste challenges

9.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

9.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.

9.2.1. Niveau 1 à 2 (simple)

9.2.2. Niveau 3

9.2.3. Niveau 4

9.2.4. Niveau 5 à 6 (BBT1)

9.2.5. PWN

Footnotes:

1

Boule et Bite Torture

Author: rick

Email: rick@gnous.eu

Created: 2024-10-06 dim. 16:49

Validate