
Une approche multi-architecture basée sur les graphes et alimentée par le ML pour la détection des gadgets ROP
LCSAJdump est un cadre d'analyse statique conçu pour découvrir les gadgets de programmation orientée retour (ROP) et de programmation orientée saut (JOP). Contrairement aux scanners traditionnels, LCSAJdump est indépendant de l'architecture et utilise une approche basée sur les graphes pour révéler des vulnérabilités invisibles aux outils linéaires courants.
Les scanners ROP courants utilisent une approche linéaire de « fenêtre glissante » sur les octets exécutables du binaire. Cette méthode échoue systématiquement à identifier les Shadow Gadgets : des chaînes d'exécution qui traversent des blocs mémoire non contigus reliés par des sauts inconditionnels ou des branches conditionnelles.
LCSAJdump surmonte cette limitation en reconstruisant le graphe de flot de contrôle (CFG) via l'analyse LCSAJ (Linear Code Sequence and Jump) . En modélisant le binaire comme un graphe orienté de blocs de base, l'outil identifie :
.text en blocs de base LCSAJ et reconstruit les relations de flot via un graphe de flot de contrôle inversé maison (représentation d'adjacence légère, aucune dépendance lourde de graphe).--depth sauts, réduisant considérablement la mémoire et le temps de construction sur les gros binaires (par ex. libc) tout en produisant des résultats identiques.(voir Benchmarks).
LCSAJdump est conçu pour être universel. Actuellement supporté :
config.py.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 offre une puissante interface en ligne de commande pour une analyse binaire précise :
Analyse standard (RISC‑V par défaut) :
python LCSAJdump.py <chemin_vers_le_binaire>
Analyse avancée (spécification de l'architecture et du fichier de sortie) :
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <chemin_vers_le_binaire>
Exportation en JSON avec filtre de mauvais caractères :
lcsajdump -a x86_64 -d 20 -k 5 -b "000a0d" --json -o gadgets.json <chemin_vers_le_binaire>
Remarque : Utilisez
-oaprès--jsonpour enregistrer le JSON dans un fichier. Sans--json,-oenregistre en texte brut.
Enregistrer la sortie en texte brut :
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <chemin_vers_le_binaire>
Analyser toutes les sections exécutables :
lcsajdump --all-exec -d 25 -k 10 -l 30 <chemin_vers_le_binaire>
Forcer le classement strictement algorithmique (contourner le ML) :
lcsajdump --algo <chemin_vers_le_binaire>
| Option | Type | Défaut | Description |
|---|---|---|---|
-a, --arch | TEXTE | auto | Architecture cible (auto, riscv64, x86_64, arm64). Détectée automatiquement depuis l'en-tête ELF. |
-d, --depth | ENTIER | 20 | Profondeur de recherche maximale en blocs LCSAJ. Contrôle la longueur des chaînes. |
-k, --darkness | ENTIER | 5 | Seuil d'élagage — nombre maximum de visites par nœud. Plus élevé = plus de gadgets, analyse plus lente. |
-l, --limit | ENTIER | 10 | Nombre maximum de gadgets à afficher dans la sortie. |
-s, --min-score | ENTIER | 0 | Score heuristique minimum pour qu'un gadget apparaisse dans les résultats. |
-i, --instructions | ENTIER | 15 | Nombre maximum d'instructions contenues dans un seul nœud LCSAJ. |
-v, --verbose | DRAPEAU | — | Active la sortie détaillée pour des résultats par gadget. |
-o, --output | CHEMIN | — | Écrit la sortie dans un fichier. Texte brut par défaut ; à utiliser avec --json pour une sortie JSON. |
-b, --bad-chars | TEXTE | — | Octets hexadécimaux à filtrer des adresses de gadgets (par ex. "000a0d"). |
--json | DRAPEAU | — | Produit les gadgets au format JSON structuré. Combiner avec -o pour enregistrer dans un fichier. |
--all-exec | DRAPEAU | — | Analyse toutes les sections exécutables, pas seulement .text. |
-al, --algo | DRAPEAU | — | Utilise strictement le classement algorithmique (contourne le ML). |
--version | DRAPEAU | — | Affiche la version installée et quitte. |
--help | DRAPEAU | — | Affiche le message d'aide et quitte. |