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 fichierobjdump
: 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
3.1. Go
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
5.1.1. Ghidra
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.
- Astuces
- 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
). - 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.
- 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.
- 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.
- Bytes view
Activable dans le menu Windows (sous le nom de Bytes), cela permet d'avoir un éditeur hexadécimal du programme.
- 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.
- Créer une structure dans une structure
- Sélectionner les champs qui forment cette structure
- Cliquer sur le bouton avant la maison
- Profit
- Mettre à jour des fonctions
- Plugin
- Scripts
ResolveX86orX64LinuxSyscallsScript.java
(built-in) : permet de remplacer les appels systèmes faient viasyscall
par les fonctions.
- 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
5.1.3. Cutter
Interface graphique basée sur le désassembleur Radare2.
5.1.4. .NET
- dnSpy
Dépôt Github - N'est plus maintenu.
- 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 menuFichier > Enregistrer tout
.
- Utilisation de base
5.2. Débuggueurs
5.3. Instrumentation binaire
5.3.1. Frida
- Ressources
- Site
- HandBook (contient des exercices pour apprendre).
- Partage de script
- Injection
- 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. - objection :
- Android
- 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"); });
- 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*
. - Fonctions utiles
Java.enumerateMethods
: permet d'afficher des informations sur des fonctions. Il est possible d'utiliser la même syntaxe que pourfrida-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
.
5.4. Émulateurs
5.4.2. Unicorn
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. Jeux vidéos
- Melting pot de ressources pour commencer
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:
créer un trousseau de clés avec Java
keytool -genkey -v -keystore research.keystore -alias research_key -keyalg RSA -keysize 2048 -validity 10000
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 fichierresources.arsc
- dans du code natif (bibliothèque
.so
), dans le dossierlib
. La JNI1 est utilisée dans ce cas (appel deNativeLib
)
8.3. Obfuscation
Proguard est un obfuscateur libre pour applications Android (Java et Kotlin). Il va renommer toutes les fonctions par une lettre.
8.4. Notes
- DJI - The ART of obfuscation
- Emulateur Android pour jeux
- Patching manuel de Frida sans Objection
- AndroidProjectCreator permet de transformer un APK en projet AndroidStudio. Plus de mise à jour depuis 3 ans.
- Defeating Android Certificate Pinning with Frida
- Frida Detection Bypass Using Frida Codeshare
- Permanent frida hacks
- Dynamic Analysis with Frida
- Pentesting obfuscated Android App
- An introduction to Android Reverse Engineering… Patching apps for fun and profit
- Let's Reverse Engineer an Android App!
- Lief
- Intro to Android Mobile Reverse Engineering
- Advanced Frida Usage Part 10 – Instruction Tracing using Frida Stalker
8.4.1. React Native
- How to Reverse Engineer React Native Android Apps
- Reverse Engineering and Instrumenting React Native Apps
Il existe 2 manières pour savoir si une application utilise React Native:
- présence d'un
index.android.bundle
dans le dossierassets
- présence de la chaine de caractères
com.facebook.react
dans le fichierAndroidManifest.xml
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
- 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)
Ice9 par tripletordo[WU]avr_crackme par xylitol[WU]xyl_crypto_keygenme_1_barbecueme par xylitol: faut pas lire le code source en faitBasis static par m4dd1n[WU]simple overflow par BitFriends[WU]EZ crackme par R3tr0BS[WU]Personal Safe par LubimPiskoty[WU]Keyg3n_M1#1 par Shad3[WU]easyAF par 476f64[WU]EZwan par DirkD[WU]EZwan2 par DirkD[WU]VERY EASY VERY SIMPLE C CODE par mohammadali[WU]unlockme par pranav[WU]- x86 par jeffli6789 [WU]
- beatme par rezk2ll [WU]
- Baby OCaml par Towel
- Teenager OCaml par Towel
- Advanced static analysis par m4dd1n
- Mission: PowerGrid par pranav
- WarGames par YugnatD
- nasm crack par BitFriends
- Small Keygenme par BinaryNewbie
- timotei crackme#1 par tim0tei
- timotei crackme#2 par tim0tei
- timotei crackme#3 par tim0tei
- timotei crackme#4 par tim0tei
- Lucky Numbers par oguzbey
- Quick Crypto, 18k par andrewl
- crackme-not par weissi1994
- racecars par chillywilly
- admin_panel par BitFriends
- Pass generator par TLOD
- 02 CrackMe - Expl0it par Expl0it-
- It's Easy par Harshil55
- Easy Crackme par TLOD
- Look Closer par r0B
- CrackThis par TLOD
- KeygenMe par TLOD
- Guess The Password par zx81
- Find the pass par chrisK
- New years crackme v02 par chrisK
- EscapeTheDunge0n - Expl0it par Expl0it-
- Baby Ransom par Shad3
- White Rabbit par hasherezade
- injectme_1 par xylitol
- injectme_2 par xylitol
- LateBird par stopaskingmedumbquestions
- f1nd_my_k3y5 par rezk2ll
- keygenmenasm par rezk2ll
- crackme_nasm par rezk2ll
- the_xor_algorithm par ksydfius
- crackme_1 par zephyrous
- crackme_2 par zephyrous
- crackme_5 par zephyrous
- frostykids_math_crackme_1 par frostykid
11.2.2. Niveau 3
- crackme3 par zephyrous
- crackmeos par monkey
- frostykidsmathcrackme2 par frostykid
- 3bis par thigo
- keygenme - complex validation par egg
- ZED-Frequency par zed-zahir
- rop-obf par bageyelet
- thirtiethproblem par s4r
- ORiGiN KeygenMe par ToMKoL
- S3cr3t V4ult par x0r19x91
- Find the Flag par x0r19x91
- Bit of Math par x0r19x91
- Armageddon par Towel
- Advanced crackme par pranav
- fl04t par X3eRo0
- SanSuu par r0B
- crackme1.032bithashbyj00ru par j00ru
- xylcryptokeygenme2revers0red par xylitol
- keyme par crudd
- yonkieskeygenme3 par yonkie
- yonkiescrackme2 par yonkie
- prime par
- matrice par s4r
- zouave par s4r
- thirtiethproblem par s4r
- crackme9 by mucki par mucki
- crackme7 par lordphoenix
- crackme6 par lordphoenix
- crackme8 par lordphoenix
- crackme4 par znycuk
- crackme3 par znycuk
- crackme4 par zephyrous
- brainbuster par deroko
11.2.3. Niveau 4
- fuckalight par s4r
- KataVM – Level 1 par Towel
- hell86 par ttlhacker
- prisoners_dilemma par 4aca7f6c
- re_trace par crudd
- ReverseMe3 par jochen_
- Tr1cky Cr4ckm3 par BinaryNewbie
- yonkies_keygenme_4 par yonkie
- https://github.com/jeffli678/writeups/tree/master/x86 par
- feed_the_ghost par hasherezade
- Obfuscation1 par s4r
- ReverseMe3 par jochen_
- phoenix3 par phoenix87
- SuperIncreasing KeyGenMe par thesex
- crackme4 par lord_phoenix
- revenge_official_trial_keygenme2006 par lord_phoenix
- lord_phoenix_crackme_2 par lord_phoenix
- lord_phoenix_crackme_3 par lord_phoenix
- frostykids_math_crackme_3 par frostykid
11.2.4. Niveau 5 à 6 (BBT2)
- re_venge par crudd
- fuckalight2 par s4r
- bitflip par s4r
- crackme_1 par excrek
11.2.5. PWN
- rop par BitFriends
- chall par BitFriends
- nx bypass par BitFriends
- no_format par BitFriends
- auth par BitFriends
11.2.6. Random
Liste récupérée sur le serveur Discord de CrackMe.
- https://crackmes.one/crackme/6620ffbacddae72ae250c9c8 : anti debug
- https://crackmes.one/crackme/64687c3633c5d4393891323a
- https://crackmes.one/crackme/66295a2aa562ef06c3b52e66
- https://crackmes.one/crackme/65446e720f4238b24302b41c
- https://crackmes.one/crackme/64d4f2b1b25df8732eebc6d0
- https://crackmes.one/crackme/63a85e1f33c5d43ab4ecf0f7
- https://github.com/NicoGaming77/CrackMe
- https://crackmes.one/crackme/661edbffcddae72ae250c8ae : c'est du spoil mais keygen basé sur l'adresse de départ