
Ein ML-gestützter graphbasierter Multi-Architektur-Ansatz zur Erkennung von ROP-Gadgets
LCSAJdump ist ein statisches Analyse-Framework zur Erkennung von Return-Oriented-Programming (ROP)- und Jump-Oriented-Programming (JOP)-Gadgets. Im Gegensatz zu herkömmlichen Scannern ist LCSAJdump architekturunabhängig und verwendet einen graphbasierten Ansatz, um Schwachstellen aufzudecken, die für lineare Tools unsichtbar bleiben.
Gängige ROP-Scanner verwenden einen linearen "Sliding-Window"-Ansatz über die ausführbaren Bytes der Binärdatei. Diese Methode übersieht systematisch Schatten-Gadgets: Ausführungsketten, die nicht zusammenhängende Speicherblöcke durchqueren, die durch unbedingte Sprünge oder bedingte Verzweigungen verbunden sind.
LCSAJdump überwindet diese Einschränkung, indem es den Kontrollflussgraphen (CFG) mittels LCSAJ (Linear Code Sequence and Jump)-Analyse rekonstruiert. Durch die Modellierung der Binärdatei als gerichteten Graphen von Basisblöcken identifiziert das Tool:
.text-Abschnitt in LCSAJ-Basisblöcke und rekonstruiert Flussbeziehungen durch einen eigens erstellten Rückwärts-Kontrollflussgraphen (leichtgewichtige Adjazenzdarstellung, keine schwergewichtige Graph-Abhängigkeit).--depth Sprüngen von Gadget-Enden erreichbar sind, was Speicher und Build-Zeit bei großen Binärdateien (z. B. libc) drastisch reduziert, während identische Ergebnisse erzielt werden.(siehe Benchmarks).
LCSAJdump ist als universelles Werkzeug konzipiert. Derzeit unterstützt:
config.py implementiert werden.pip install lcsajdump
git clone [https://github.com/Chris1sFlaggin/LCSAJdump.git](https://github.com/Chris1sFlaggin/LCSAJdump.git)
cd LCSAJdump
pip install -r requirements.txt
LCSAJdump bietet eine leistungsstarke CLI für präzise Binäranalysen:
Standardanalyse (Standard RISC‑V):
python LCSAJdump.py <path_to_binary>
Erweiterte Analyse (Architektur und Ausgabedatei angeben):
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <path_to_binary>
Export als JSON mit Bad-Char-Filter:
lcsajdump -a x86_64 -d 20 -k 5 -b "000a0d" --json -o gadgets.json <path_to_binary>
Hinweis: Verwenden Sie
-onach--json, um JSON in eine Datei zu speichern. Ohne--jsonspeichert-oals Klartext.
Klartextausgabe speichern:
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <path_to_binary>
Alle ausführbaren Abschnitte analysieren:
lcsajdump --all-exec -d 25 -k 10 -l 30 <path_to_binary>
Streng algorithmisches Ranking erzwingen (ML umgehen):
lcsajdump --algo <path_to_binary>
LCSAJdump wird durch eine rigorose, schrittweise validierte Testsuite im Verzeichnis benchmarkTests/ untermauert.
Durch 14 große Iterationen semantischer Feature-Engineering hat das hybride Modell gelernt, Gadgets anhand tatsächlicher Speichernebenwirkungen (extrahiert durch angr-symbolische Ausführung) zu unterscheiden, anstatt rein syntaktischer Heuristiken.
Bewertet mit gruppenbewusster 5‑facher Kreuzvalidierung (Testbinärdateien wurden während des Trainings nie gesehen) erreicht der Ranker NDCG@1 = 0,914 ± 0,047 und NDCG@10 = 0,922 ± 0,052 – das bedeutet, dass die nützlichsten Gadgets durchgängig an der Spitze der Ausgabe platziert werden. Die zweistufige Engine priorisiert erfolgreich saubere Stack-Popping-Sequenzen und ret2csu-ähnliche Aufrufe, während sie stark abstürzende, festoffsetierte Sprünge bestraft, die traditionelle statische Scanner in die Irre führen.
Das Repository ist so strukturiert, dass es sowohl Endbenutzer als auch ML-Forscher unterstützt.
lcsajdump/ml_study/ enthält die vollständige Pipeline, die zum Trainieren der Modelle verwendet wurde:
build_dataset.py: Extrahiert strukturelle und semantische Merkmale aus einem Korpus von CTF-Binärdateien.train_model.py: Trainiert das LightGBM LambdaRank-Modell und gibt die .pkl-Modelle aus.kfold_cv.py: Validiert den Datensatz mittels K‑Fold-Kreuzvalidierung.Das Framework ist offen für neue Implementierungen. So fügen Sie eine neue Architektur hinzu:
lcsajdump/core/config.py.ARCH_PROFILES-Dictionary hinzu, indem Sie Sprung-Mnemonics, Rücksprung-Mnemonics und Register für die gewünschte Architektur (z. B. x86_64) definieren.Dieses Projekt wird unter der MIT-Lizenz veröffentlicht. Weitere Informationen finden Sie in der Datei LICENSE.
Besuchen Sie die Projektwebseite: LCSAJdump-Webseite
| Flag | Typ | Standard | Beschreibung |
|---|
-a, --arch | TEXT | auto | Zielarchitektur (auto, riscv64, x86_64, arm64). Automatisch aus ELF-Header erkannt. |
-d, --depth | INTEGER | 20 | Maximale Suchtiefe in LCSAJ-Blöcken. Steuert die Kettenlänge. |
-k, --darkness | INTEGER | 5 | Pruning-Schwellenwert — max. Besuche pro Knoten. Höher = mehr Gadgets, langsamerer Scan. |
-l, --limit | INTEGER | 10 | Maximale Anzahl der anzuzeigenden Gadgets in der Ausgabe. |
-s, --min-score | INTEGER | 0 | Mindestheuristikwert, den ein Gadget für die Anzeige erreichen muss. |
-i, --instructions | INTEGER | 15 | Maximale Anzahl an Instruktionen in einem einzelnen LCSAJ-Knoten. |
-v, --verbose | FLAG | — | Ausführliche Ausgabe für detaillierte Ergebnisse pro Gadget aktivieren. |
-o, --output | PATH | — | Ausgabe in Datei schreiben. Standardmäßig Klartext; mit --json für JSON-Ausgabe. |
-b, --bad-chars | TEXT | — | Hex-Bytes, die aus Gadget-Adressen herausgefiltert werden sollen (z. B. "000a0d"). |
--json | FLAG | — | Gadgets als strukturiertes JSON ausgeben. Mit -o kombinieren, um in Datei zu speichern. |
--all-exec | FLAG | — | Alle ausführbaren Abschnitte analysieren, nicht nur .text. |
-al, --algo | FLAG | — | Streng algorithmisches Ranking verwenden (ML umgehen). |
--version | FLAG | — | Installierte Version anzeigen und beenden. |
--help | FLAG | — | Hilfemeldung anzeigen und beenden. |