Retrowrite ist ein statischer binärer Rewriter für X64 und AArch64. Es funktioniert ohne Heuristik, führt keinen Overhead ein und verwendet die Symbolisierungstechnik (auch als Wiederaufbaubare Montage bezeichnet), um Instrumente in Binärdateien einzufügen, ohne dass Quellcode erforderlich ist.
Bitte beachten Sie, dass die X64 -Version und die ARM64 -Version verschiedene Umschreibungsalgorithmen verwenden und unterschiedliche Funktionen unterstützen.
Für technische Details können Sie das Papier (in IEEE S & P'20 ) für die X64 -Version und diese These für die ARM64 -Version lesen.
Kretrowrite ist eine Variante der X64 -Version, die das Umschreiben von Linux -Kernelmodulen unterstützt.
Retrowrite ist in Python3 (3.6) implementiert. Es hängt von pyelftools und capstone ab. Um die Abhängigkeiten zu installieren, führen Sie bitte aus:
pip install - r requirements . txtEs wird nicht empfohlen, die Abhängigkeiten aus den Paketmanagern Ihrer Distribose zu installieren, da sie möglicherweise veraltet sind.
| retrowrite-x64 | retrowrite-aarch64 | |
|---|---|---|
| Binärdateien | (WIP) | ✅ |
| Nicht-Pie-Binärdateien | ✅ | |
| Nicht standardmäßige Compiler | ✅ | |
| Null Overhead | ✅ | ✅ |
| Kernelmodule Unterstützung | ✅ | |
| AFL-Coverage-Instrumentierung | ✅ | ✅ |
| Asan -Instrumentierung | ✅ | ✅ |
| C ++ Unterstützung | (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 Wählen Sie den Instrumentenpass aus, den Sie mit retrowrite -m <pass> bewerben möchten. Sie können die verfügbaren Instrumentierungspässe in Ordnern rwtools_x64 und rwtools_arm64 finden.
Verfügbare Instrumentierung erfolgt für x64: - Adresssanitizer - AFL -Coverage -Informationen
Verfügbare Instrumentierung passt für AARG64: - Addressanitizer - AFL -Coverage -Informationen + Forkserver - Grobkutiger Kontrollflussintegrität für Funktionseinträge
retrowrite --asan </path/to/binary/> </path/to/output/binary>
HINWEIS: Wenn Sie auf X64 sind, stellen Sie sicher, dass die Binärdatei positionunabhängig ist und nicht gestreift wird. Dies kann mit dem Befehl file überprüft werden (die Ausgabe sollte mit ELF shared object sagen).
Beispiel Erstellen Sie eine instrumentierte Version von /bin/ls :
retrowrite --asan /bin/ls ls-basan-instrumented.s
Dadurch wird eine Montage -Datei ( .s ) erzeugt. Um die Baugruppe wieder in eine Binäre zu kompilieren, hängt sie von der Architektur ab:
Die erzeugte Baugruppe kann mit einem beliebigen Compiler zusammengebaut und verknüpft werden, wie:
gcc ls-basan-instrumented.s -lasan -o ls-basan-instrumented
DEBUG Für den Fall, dass Sie den Fehler undefined reference to `__asan_init_v4' erhalten, ersetzen Sie "Asan_init_v4" durch "Asan_init" in der Montagedatei. Der folgende Befehl kann Ihnen dabei helfen, dies zu tun: sed -i 's/asan_init_v4/asan_init/g' ls-basan-instrumented.s
Auf AARCH64 verlassen wir uns auch auf Standard -Compiler, um zusammenzubauen und zu verknüpfen, aber die Sammlung von Compiler -Flags ist etwas mehr involviert. Daher stellen wir den -a auf dem retrowrite zur Verfügung, um dies für Sie zu tun:
retrowrite -a ls-basan-instrumented.s -lasan -o ls-basan-instrumented
Erzeugen Sie zum Erzeugen eines AFL-instrumentierten Binären zunächst die symbolisierte Baugruppe, wie oben beschrieben. Kompilieren Sie dann die symbolisierte Baugruppe mit afl-gcc von AFL ++ wie folgt:
$ AFL_AS_FORCE_INSTRUMENT=1 afl-gcc foo.s -o foo
oder afl-clang .
Um ein Binärdaten mit Abdeckungsinformationen zu instrumentieren, verwenden Sie den Abdeckungsinstrumentierungspass mit retrowrite -m coverage <input file> <output asm> . Machen Sie das Binärdatum mit retrowrite -a <output asm> <new binary> neu.
Die Binärdatei kann jetzt mit:
afl-fuzz -i < seed folder > -o < out folder > < new binary > Retrowrite versucht auch, Instrumente hinzuzufügen, um als Forkserver für AFL zu fungieren. Für den Fall, dass dies Probleme verursacht, können Sie dieses Verhalten deaktivieren, indem Sie export AFL_NO_FORKSERVER=1 verwenden
Um symbolisierte Baugruppen zu erzeugen, die durch Hand oder nach vorhandenen Tools post bearbeitet werden können, geben Sie einfach keinen Instrumentierungsausweis an:
retrowrite </path/to/binary> <path/to/output/asm/files>
Die Ausgabe -ASM -Dateien können von Hand oder anderen Tools frei bearbeitet werden. Nach der Nachmodifikation können die ASM-Dateien wie oben beschrieben zu funktionierenden Binärdateien zusammengestellt werden.
Während Retrowrite mit anderen Tools interoperabel ist, ermutigen wir die Forscher nachdrücklich, die Retrowrite -API für ihre binären Instrumentierungs- / Modifikationsanforderungen zu verwenden! Dies spart den zusätzlichen Anstrengungen, um Binärdateien zu laden und zu analysieren.
setup.sh ausführen.sh:
./setup.sh kernelAktivieren Sie das Virtualenv (aus der Wurzel des Repositorys):
source retro/bin/activate(Bonus) Um Virtualenv zu beenden, wenn Sie mit Retrowrite fertig sind:
deactivateretrowrite --asan --kernel </path/to/module.ko> </path/to/output/module_asan.ko>retrowrite </path/to/module.ko> <path/to/output/asm/files> Für die Fuzzing -Kampagne finden Sie Fuzzing/ Ordner.
Im Allgemeinen enthält librw/ den Code zum Laden, Demontage und Symbolisierung von Binärdateien und bildet den Kern aller Transformationen. Die individuelle Transformation besteht, die auf diesem Umschreibungsgerüst aufbauen, wie beispielsweise unser nur binärer Adressdesinfektionsmittel (Basan) als individuelle Werkzeuge in rwtools/ .
Die Dateien und der Ordner beginnen mit k mit der Kernel Retrowrite -Version verknüpft.
Im Demos/Ordner finden Sie Beispiele für UserSpace und Kernel Retrowrite (Demos/User_Demo bzw. Demos/kernel_demo).
Die folgenden Veröffentlichungen decken verschiedene Teile des Retrowrite -Projekts ab:
Retrowrite: Statisch instrumentierende Cots -Binärdateien für Fuzzing- und Desinfektions -Sushant -Dinesh, Nathan Burow, Dongyan Xu und Mathias -Zahler. In Oakland'20: IEEE International Symposium über Sicherheit und Privatsphäre, 2020
Keine Quelle, kein Problem! Hochgeschwindiger binärer Fuzzing Matteo Rizzo und Mathias -Zahler. In 36C3'19: Chaos Communication Congress, 2019
Die MIT -Lizenz
Copyright (C) 2019 Hexhive Group, Sushant Dinesh [email protected], Luca di Bartolomeo [email protected], Antony vennard [email protected], Matteo Rizzo [email protected], mathias payer [email protected]
Die Erlaubnis wird hiermit einer Person, die eine Kopie dieser Software und zugehörigen Dokumentationsdateien (der "Software") erhält, kostenlos erteilt, um die Software ohne Einschränkung zu behandeln, einschließlich ohne Einschränkung der Rechte, zu verwenden, zu kopieren, zu modifizieren, zusammenzufassen, zu veröffentlichen, zu veröffentlichen, zu verteilen, zu verteilt, und/oder Kopien der Software zu ermöglichen, um Personen zu beanstanden, an denen die Software zugänglich ist.
Die oben genannte Copyright -Mitteilung und diese Erlaubnisbekanntmachung müssen in alle Kopien oder wesentlichen Teile der Software enthalten sein.
Die Software wird "wie es ist" ohne Garantie jeglicher Art, ausdrücklich oder stillschweigend bereitgestellt, einschließlich, aber nicht beschränkt auf die Gewährleistung der Handelsfähigkeit, die Eignung für einen bestimmten Zweck und die Nichtverletzung. In keinem Fall sind die Autoren oder Urheberrechtsinhaber für Ansprüche, Schäden oder andere Haftungen haftbar, sei es in einer Vertragsklage, unerbittlich oder auf andere Weise, die sich aus oder im Zusammenhang mit der Software oder anderen Geschäften in der Software ergeben.