
Un approccio multi-architettura basato su grafi potenziato da ML per il rilevamento di gadget ROP
LCSAJdump è un framework di analisi statica progettato per scoprire gadget di Return-Oriented Programming (ROP) e Jump-Oriented Programming (JOP). A differenza degli scanner tradizionali, LCSAJdump è agnostico rispetto all'architettura e utilizza un approccio basato su grafi per scoprire vulnerabilità invisibili ai comuni strumenti lineari.
I comuni scanner ROP utilizzano un approccio lineare a "finestra scorrevole" sui byte eseguibili del binario. Questo metodo fallisce sistematicamente nell'identificare i Shadow Gadget: catene di esecuzione che attraversano blocchi di memoria non contigui collegati da salti incondizionati o rami condizionali.
LCSAJdump supera questo limite ricostruendo il Control-Flow Graph (CFG) attraverso l'analisi LCSAJ (Linear Code Sequence and Jump). Modellando il binario come un grafo diretto di blocchi base, lo strumento identifica:
.text in blocchi base LCSAJ e ricostruisce le relazioni di flusso attraverso un grafo di controllo inverso costruito su misura (rappresentazione di adiacenza leggera, nessuna dipendenza da grafi pesanti).--depth salti, riducendo drasticamente la memoria e i tempi di costruzione su binari di grandi dimensioni (es. libc) producendo risultati identici.(vedi Benchmarks).
LCSAJdump è progettato per essere universale. Attualmente supportate:
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 una potente CLI per l'analisi precisa dei binari:
Analisi standard (RISC-V predefinito):
python LCSAJdump.py <percorso_del_binario>
Analisi avanzata (specificando architettura e file di output):
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <percorso_del_binario>
Esportazione come JSON con filtro bad-char:
lcsajdump -a x86_64 -d 20 -k 5 -b "000a0d" --json -o gadgets.json <percorso_del_binario>
Nota: Usa
-odopo--jsonper salvare il JSON su file. Senza--json,-osalva testo normale.
Salva output in testo normale:
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <percorso_del_binario>
Analizza tutte le sezioni eseguibili:
lcsajdump --all-exec -d 25 -k 10 -l 30 <percorso_del_binario>
Forza ranking strettamente algoritmico (bypassa ML):
lcsajdump --algo <percorso_del_binario>
LCSAJdump è supportato da una suite di test rigorosa e convalidata incrementalmente situata nella directory benchmarkTests/.
Attraverso 14 iterazioni principali di ingegneria delle caratteristiche semantiche, il modello ibrido ha imparato a discriminare i gadget in base agli effetti collaterali effettivi sulla memoria (estratti tramite esecuzione simbolica angr) piuttosto che a euristiche puramente sintattiche.
Valutato con cross-validazione a 5 fold con raggruppamento (binari di test mai visti durante l'addestramento), il ranker raggiunge NDCG@1 = 0,914 ± 0,047 e NDCG@10 = 0,922 ± 0,052, il che significa che i gadget più utili vengono costantemente posizionati all'inizio dell'output. Il motore a due stadi riesce a dare priorità a sequenze pulite di pop-stack e chiamate ret2csu, penalizzando pesantemente i salti a offset fisso soggetti a crash che ingannano gli scanner statici tradizionali.
Il repository è strutturato per supportare sia utenti finali che ricercatori ML.
lcsajdump/ml_study/ contiene la pipeline completa utilizzata per addestrare i modelli:
build_dataset.py: Estrae caratteristiche strutturali e semantiche da un corpus di binari CTF.train_model.py: Addestra il modello LightGBM LambdaRank e produce i modelli .pkl.kfold_cv.py: Convalida il dataset utilizzando la convalida incrociata K-Fold.Il framework è aperto a nuove implementazioni. Per aggiungere una nuova architettura:
lcsajdump/core/config.py.ARCH_PROFILES, definendo i mnemonici di salto, i mnemonici di ritorno e i registri per l'architettura desiderata (es. x86_64).Questo progetto è rilasciato sotto la licenza MIT. Vedi il file LICENSE per i dettagli.
Visita la pagina web del progetto: Pagina web LCSAJdump
| Flag | Tipo | Predefinito | Descrizione |
|---|
-a, --arch | TESTO | auto | Architettura target (auto, riscv64, x86_64, arm64). Rilevata automaticamente dall'header ELF. |
-d, --depth | INTERO | 20 | Profondità massima di ricerca nei blocchi LCSAJ. Controlla la lunghezza della catena. |
-k, --darkness | INTERO | 5 | Soglia di potatura — numero massimo di visite per nodo. Più alto = più gadget, scansione più lenta. |
-l, --limit | INTERO | 10 | Numero massimo di gadget da visualizzare nell'output. |
-s, --min-score | INTERO | 0 | Punteggio euristico minimo per un gadget per apparire nei risultati. |
-i, --instructions | INTERO | 15 | Numero massimo di istruzioni contenute in un singolo nodo LCSAJ. |
-v, --verbose | FLAG | — | Abilita output verbose per risultati dettagliati per gadget. |
-o, --output | PERCORSO | — | Scrive l'output su file. Testo normale per impostazione predefinita; usare con --json per output JSON. |
-b, --bad-chars | TESTO | — | Byte esadecimali da filtrare dagli indirizzi dei gadget (es. "000a0d"). |
--json | FLAG | — | Output dei gadget come JSON strutturato. Combina con -o per salvare su file. |
--all-exec | FLAG | — | Analizza tutte le sezioni eseguibili, non solo .text. |
-al, --algo | FLAG | — | Usa strettamente il ranking algoritmico (bypassa ML). |
--version | FLAG | — | Mostra la versione installata ed esce. |
--help | FLAG | — | Mostra il messaggio di aiuto ed esce. |