Retrowrite est un réécrit binaire statique pour X64 et AARCH64. Il fonctionne sans heuristique, n'introduit pas les frais généraux et utilise la technique de symbolisation (également connue sous le nom d' assemblage de reasmemblable ) pour insérer l'instrumentation en binaires sans avoir besoin de code source.
Veuillez noter que la version X64 et la version ARM64 utilisent différents algorithmes de réécriture et prennent en charge un ensemble différent de fonctionnalités.
Pour les détails techniques, vous pouvez lire le document (dans IEEE S&P'20 ) pour la version x64 et cette thèse pour la version ARM64.
Kretrowrite est une variante de la version x64 qui prend en charge la réécriture des modules de noyau Linux.
Retrowrite est implémenté dans Python3 (3.6). Cela dépend de pyelftools et capstone . Pour installer les dépendances, veuillez exécuter:
pip install - r requirements . txtIl n'est pas recommandé d'installer les dépendances des gestionnaires de packages de votre distribution, car ils pourraient être obsolètes.
| rétrowrite-x64 | rétrowrite-aarch64 | |
|---|---|---|
| Binaires dépouillés | (WIP) | ✅ |
| Binaires non-tartes | ✅ | |
| Compilateurs non standard | ✅ | |
| Zero Overhead | ✅ | ✅ |
| Support des modules de noyau | ✅ | |
| Instrumentation de couverture AFL | ✅ | ✅ |
| Instrumentation asan | ✅ | ✅ |
| Prise en charge C ++ | (WIP) | (WIP) |
(retro) $ retrowrite --help
usage: retrowrite [-h] [-a] [-A] [-m MODULE] [-k] [--kcov] [-c] [--ignore-no-pie] [--ignore-stripped] [-v] bin outfile
positional arguments:
bin Input binary to load
outfile Symbolized ASM output
optional arguments:
-h, --help show this help message and exit
-a, --assemble Assemble instrumented assembly file into instrumented binary
-A, --asan Add binary address sanitizer instrumentation
-m MODULE, --module MODULE
Use specified instrumentation pass/module in rwtools directory
-k, --kernel Instrument a kernel module
--kcov Instrument the kernel module with kcov
-c, --cache Save/load register analysis cache (only used with --asan)
--ignore-no-pie Ignore position-independent-executable check (use with caution)
--ignore-stripped Ignore stripped executable check (use with caution)
-v, --verbose Verbose output Sélectionnez le pass d'instrumentation que vous souhaitez appliquer avec retrowrite -m <pass> Vous pouvez trouver les passes d'instrumentation disponibles dans les dossiers rwtools_x64 et rwtools_arm64 .
Les passes d'instrumentation disponibles pour x64: - Adressesanitizer - Informations sur la couverture AFL
Les passes d'instrumentation disponibles pour AARCH64: - AdresseSanitizer - Informations sur la couverture AFL + Forkserver - Contrôle grossier Intégrité du flux de contrôle sur les entrées de fonction
retrowrite --asan </path/to/binary/> </path/to/output/binary>
Remarque: Si sur x64, assurez-vous que le binaire est indépendant de la position et n'est pas dépouillé. Cela peut être coché à l'aide de la commande file (la sortie doit dire ELF shared object ).
Exemple, créez une version instrumentée de /bin/ls :
retrowrite --asan /bin/ls ls-basan-instrumented.s
Cela générera un fichier d'assemblage ( .s ). Pour recompiler l'assemblage dans un binaire, cela dépend de l'architecture:
L'assemblage généré peut être assemblé et lié à l'aide de n'importe quel compilateur, comme:
gcc ls-basan-instrumented.s -lasan -o ls-basan-instrumented
Debug dans le cas où vous obtenez l'erreur undefined reference to `__asan_init_v4' , remplacez" asan_init_v4 "par" asan_init "dans le fichier d'assemblage, la commande suivante peut vous aider à le faire: sed -i 's/asan_init_v4/asan_init/g' ls-basan-instrumented.s
Sur AARCH64, nous comptons également sur des compilateurs standard pour assembler et lier, mais la collection des drapeaux du compilateur est légèrement plus impliquée et nous fournissons donc le commutateur -a sur l'exécutable retrowrite principal pour le faire pour vous:
retrowrite -a ls-basan-instrumented.s -lasan -o ls-basan-instrumented
Pour générer un binaire afl-instrumenté, générez d'abord l'assemblage symbolisé comme décrit ci-dessus. Ensuite, recompilez l'assemblage symbolisé avec afl-gcc de AFL ++ comme ceci:
$ AFL_AS_FORCE_INSTRUMENT=1 afl-gcc foo.s -o foo
ou afl-clang .
Pour instrument un binaire avec des informations de couverture, utilisez le pass d'instrumentation de couverture avec retrowrite -m coverage <input file> <output asm> . Re-assemblez le binaire avec retrowrite -a <output asm> <new binary> .
Le binaire peut désormais être flou avec:
afl-fuzz -i < seed folder > -o < out folder > < new binary > Retrowrite essaie également d'ajouter de l'instrumentation pour agir comme un désert pour l'AFL; Dans le cas où cela cause des problèmes, vous pouvez désactiver ce comportement en utilisant export AFL_NO_FORKSERVER=1
Pour générer un assemblage symbolisé qui peut être modifié à la main ou post-traité par des outils existants, ne spécifiez tout simplement aucune réussite d'instrumentation:
retrowrite </path/to/binary> <path/to/output/asm/files>
Les fichiers ASM de sortie peuvent être librement modifiés à la main ou par d'autres outils. Après la modification, les fichiers ASM peuvent être assemblés aux binaires fonctionnels comme décrit ci-dessus.
Bien que Retrowrite soit interopérable avec d'autres outils, nous encourageons fortement les chercheurs à utiliser l'API Retrowrite pour leurs besoins d'instrumentation / modification binaires! Cela économise l'effort supplémentaire pour charger et analyser les binaires ou les fichiers d'assemblage.
Exécutez setup.sh :
./setup.sh kernelActiver le virtualenv (à partir de la racine du référentiel):
source retro/bin/activate(Bonus) pour quitter VirtualEnv lorsque vous avez terminé avec Retrowrite:
deactivateretrowrite --asan --kernel </path/to/module.ko> </path/to/output/module_asan.ko>retrowrite </path/to/module.ko> <path/to/output/asm/files> Pour la campagne Fuzzing, veuillez consulter Fuzzing / Folder.
En général, librw/ contient le code de chargement, de démontage et de symbolisation des binaires et forme le noyau de toutes les transformations. Les passes de transformation individuelles qui construisent en haut de ce cadre de réécriture, telles que notre désinfectant d'adresse binaire uniquement (Basan) est contenu comme des outils individuels dans rwtools/ .
Les fichiers et les dossiers commençant par k sont liés à la version du noyau Retrowrite.
Dans les démos / dossiers, vous trouverez des exemples pour Userspace et Kernel Retrowrite (Demos / User_demo et Demos / Kernel_demo respectivement).
Les publications suivantes couvrent différentes parties du projet Retrowrite:
Retrowrite: Instruments statiquement binaires de lits pour fuzzing et désinfection Sushant Dinesh, Nathan Burow, Dongyan Xu et Mathias Payer. Dans Oakland'20: IEEE International Symposium on Security and Privacy, 2020
Pas de source, pas de problème! Matteo Rizzo à haute vitesse à grande vitesse et payeur de Mathias. En 36c3'19: Congrès de communication du chaos, 2019
La licence MIT
Copyright (C) Group Hexhive 2019, Sushant Dinesh [email protected], Luca di Bartolomeo [email protected], Antony Vennard [email protected], Matteo Rizzo [email protected], Mathias Payer [email protected].
L'autorisation est accordée gratuitement à toute personne qui obtient une copie de ce logiciel et des fichiers de documentation associés (le "logiciel"), pour traiter le logiciel sans restriction, y compris sans limiter les droits d'utilisation, de copie, de modification, de fusion, de publication, de distribution, de sublince et / ou de vendre des copies des conditions suivantes.
L'avis de droit d'auteur ci-dessus et le présent avis d'autorisation sont inclus dans toutes les copies ou des parties substantielles du logiciel.
Le logiciel est fourni "tel quel", sans garantie d'aucune sorte, express ou implicite, y compris, mais sans s'y limiter, les garanties de qualité marchande, d'adéquation à un usage particulier et de non-contrefaçon. En aucun cas, les auteurs ou les détenteurs de droits d'auteur ne seront pas responsables de toute réclamation, dommage ou autre responsabilité, que ce soit dans une action de contrat, de délit ou autre, découlant de, hors du logiciel ou de l'utilisation ou d'autres relations dans le logiciel.