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)
3.1. Go
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
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
- 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.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
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. 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:
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
9. Liste challenges
9.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
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)
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]- Baby OCaml par Towel
- Teenager OCaml par Towel
- Advanced static analysis par m4dd1n
- Mission: PowerGrid par pranav
- WarGames par YugnatD
- x86 par jeffli6789 [WU]
- 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
- unlockme par pranav
- 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
- beatme par rezk2ll [WU]
- 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
9.2.2. Niveau 3
- https://crackmes.one/crackme/5ab77f6633c5d40ad448cc18
- https://crackmes.one/crackme/5ab77f6633c5d40ad448cc50
- https://crackmes.one/crackme/5ab77f6633c5d40ad448cc01
- https://crackmes.one/crackme/5ab77f6533c5d40ad448cb8e
- https://crackmes.one/crackme/5e2c557933c5d419aa013658
- https://crackmes.one/crackme/5ed17e1633c5d449d91ae68e
- https://crackmes.one/crackme/5cfb961a33c5d41c6d56e069
- https://crackmes.one/crackme/5c90eb8633c5d46ecd37c8ea
- https://crackmes.one/crackme/5ff59e6733c5d42c3d0165c0
- https://crackmes.one/crackme/5e37c8bc33c5d43b8718c65a
- https://crackmes.one/crackme/5ebb7c6c33c5d47611746650
- https://crackmes.one/crackme/5ce6e06c33c5d450df314036
- https://crackmes.one/crackme/5edb0b8533c5d449d91ae73b
- https://crackmes.one/crackme/5ffd8ead33c5d42c3d016671
- https://crackmes.one/crackme/6079170e33c5d45ca94895fa
- https://crackmes.one/crackme/606b1faf33c5d418e8c4009e
- https://crackmes.one/crackme/5ab77f6633c5d40ad448cc63
- https://crackmes.one/crackme/5ab77f6233c5d40ad448c9ef
- https://crackmes.one/crackme/5ab77f5d33c5d40ad448c6a5
- https://crackmes.one/crackme/5ab77f6233c5d40ad448c9e6
- https://crackmes.one/crackme/5ab77f6233c5d40ad448c9e5
- https://crackmes.one/crackme/5aa9b4a633c5d40a63746b20
- https://crackmes.one/crackme/5aa9b47f33c5d40a63746b1f
- https://crackmes.one/crackme/5aa9b4e233c5d40a63746b21
- https://crackmes.one/crackme/5c90eb8633c5d46ecd37c8ea
- https://crackmes.one/crackme/5cfb961a33c5d41c6d56e069
- https://crackmes.one/crackme/5ccc421a33c5d4419da5598d
- https://crackmes.one/crackme/5ab77f6033c5d40ad448c880
- https://crackmes.one/crackme/5ab77f6033c5d40ad448c889
- https://crackmes.one/crackme/5ab77f6033c5d40ad448c888
- https://crackmes.one/crackme/5ab77f6633c5d40ad448cbd3
- https://crackmes.one/crackme/5ab77f6633c5d40ad448cbd1
- https://crackmes.one/crackme/5ab77f6633c5d40ad448cc15
- https://crackmes.one/crackme/5ab77f5833c5d40ad448c408
9.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
9.2.4. Niveau 5 à 6 (BBT1)
- re_venge par crudd
- fuckalight2 par s4r
- bitflip par s4r
- crackme_1 par excrek
9.2.5. PWN
- rop par BitFriends
- chall par BitFriends
- nx bypass par BitFriends
- no_format par BitFriends
- auth par BitFriends
9.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
Footnotes:
Boule et Bite Torture