
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>
LCSAJdump est soutenu par une suite de tests rigoureuse, validée de manière incrémentielle, située dans le répertoire benchmarkTests/.
À travers 14 itérations majeures d'ingénierie des caractéristiques sémantiques, le modèle hybride a appris à discriminer les gadgets en fonction des effets secondaires réels en mémoire (extraits via l'exécution symbolique angr) plutôt que de simples heuristiques syntaxiques.
Évalué par validation croisée 5‑fold avec regroupement (les binaires de test n'ont jamais été vus pendant l'entraînement), le classeur atteint NDCG@1 = 0,914 ± 0,047 et NDCG@10 = 0,922 ± 0,052, ce qui signifie que les gadgets les plus utiles sont systématiquement placés en haut de la sortie. Le moteur en deux étapes priorise avec succès les séquences propres de dépilage de la pile et les appels de type ret2csu, tout en pénalisant lourdement les sauts à décalage fixe sujets aux plantages qui trompent les scanners statiques traditionnels.
Le dépôt est structuré pour prendre en charge à la fois les utilisateurs finaux et les chercheurs en ML.
lcsajdump/ml_study/ contient le pipeline complet utilisé pour entraîner les modèles :
build_dataset.py : Extrait les caractéristiques structurelles et sémantiques d'un corpus de binaires CTF.train_model.py : Entraîne le modèle LightGBM LambdaRank et produit les modèles .pkl.kfold_cv.py : Valide le jeu de données à l'aide d'une validation croisée K‑Fold.Le cadre est ouvert à de nouvelles implémentations. Pour ajouter une nouvelle architecture :
lcsajdump/core/config.py.ARCH_PROFILES, en définissant les mnémoniques de saut, les mnémoniques de retour et les registres pour l'architecture souhaitée (par ex. x86_64).Ce projet est publié sous licence MIT. Voir le fichier LICENSE pour plus de détails.
Visitez la page web du projet : Page web LCSAJdump
| 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. |