
Un enfoque basado en grafos y múltiples arquitecturas potenciado por ML para la detección de gadgets ROP
LCSAJdump es un marco de análisis estático diseñado para descubrir gadgets de Return-Oriented Programming (ROP) y Jump-Oriented Programming (JOP). A diferencia de los escáneres tradicionales, LCSAJdump es agnóstico respecto a la arquitectura y emplea un enfoque basado en grafos para descubrir vulnerabilidades invisibles para las herramientas lineales comunes.
Los escáneres ROP comunes utilizan un enfoque lineal de "ventana deslizante" sobre los bytes ejecutables del binario. Este método falla sistemáticamente al identificar Shadow Gadgets: cadenas de ejecución que atraviesan bloques de memoria no contiguos conectados por saltos incondicionales o bifurcaciones condicionales.
LCSAJdump supera esta limitación reconstruyendo el Grafo de Flujo de Control (CFG) mediante el análisis LCSAJ (Secuencia Lineal de Código y Salto). Al modelar el binario como un grafo dirigido de bloques básicos, la herramienta identifica:
.text en bloques básicos LCSAJ y reconstruye las relaciones de flujo mediante un grafo de flujo de control inverso construido a medida (representación ligera de adyacencia, sin dependencia de grafos pesados).--depth saltos, reduciendo drásticamente la memoria y el tiempo de construcción en binarios grandes (ej. libc) mientras produce resultados idénticos.(ver Puntos de referencia).
LCSAJdump está diseñado para ser universal. Actualmente compatibles:
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 ofrece una potente CLI para un análisis preciso de binarios:
Análisis estándar (RISC-V por defecto):
python LCSAJdump.py <ruta_al_binario>
Análisis avanzado (especificando arquitectura y archivo de salida):
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <ruta_al_binario>
Exportar como JSON con filtro de caracteres malos:
lcsajdump -a x86_64 -d 20 -k 5 -b "000a0d" --json -o gadgets.json <ruta_al_binario>
Nota: Use
-odespués de--jsonpara guardar JSON en un archivo. Sin--json,-oguarda texto plano.
Guardar salida en texto plano:
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <ruta_al_binario>
Analizar todas las secciones ejecutables:
lcsajdump --all-exec -d 25 -k 10 -l 30 <ruta_al_binario>
Forzar clasificación estrictamente algorítmica (omitir ML):
lcsajdump --algo <ruta_al_binario>
| Bandera | Tipo | Predeterminado | Descripción |
|---|---|---|---|
-a, --arch | TEXT | auto | Arquitectura objetivo (auto, riscv64, x86_64, arm64). Se detecta automáticamente desde la cabecera ELF. |
-d, --depth | INTEGER | 20 | Profundidad máxima de búsqueda en bloques LCSAJ. Controla la longitud de la cadena. |
-k, --darkness | INTEGER | 5 | Umbral de poda: número máximo de visitas por nodo. Mayor = más gadgets, escaneo más lento. |
-l, --limit | INTEGER | 10 | Número máximo de gadgets a mostrar en la salida. |
-s, --min-score | INTEGER | 0 | Puntuación heurística mínima para que un gadget aparezca en los resultados. |
-i, --instructions | INTEGER | 15 | Número máximo de instrucciones contenidas en un solo nodo LCSAJ. |
-v, --verbose | FLAG | — | Activa la salida detallada para resultados por gadget. |
-o, --output | PATH | — | Escribe la salida en un archivo. Texto plano por defecto; úselo con --json para salida JSON. |
-b, --bad-chars | TEXT | — | Bytes hexadecimales a filtrar de las direcciones de los gadgets (ej. "000a0d"). |
--json | FLAG | — | Salida de gadgets como JSON estructurado. Combínalo con -o para guardar en archivo. |
--all-exec | FLAG | — | Analiza todas las secciones ejecutables, no solo .text. |
-al, --algo | FLAG | — | Usa estrictamente la clasificación algorítmica (omite ML). |
LCSAJdump está respaldado por un conjunto de pruebas riguroso e incrementablemente validado ubicado en el directorio benchmarkTests/.
A través de 14 iteraciones principales de ingeniería de características semánticas, el modelo híbrido ha aprendido a discriminar gadgets basándose en efectos secundarios reales de la memoria (extraídos mediante ejecución simbólica angr) en lugar de heurísticas puramente sintácticas.
Evaluado con validación cruzada de 5 pliegues consciente de grupos (los binarios de prueba nunca se vieron durante el entrenamiento), el clasificador alcanza NDCG@1 = 0.914 ± 0.047 y NDCG@10 = 0.922 ± 0.052, lo que significa que los gadgets más útiles se colocan consistentemente en la parte superior de la salida. El motor de dos etapas prioriza con éxito las secuencias limpias de extracción de pila y las llamadas tipo ret2csu, mientras penaliza fuertemente los saltos de desplazamiento fijo propensos a fallos que engañan a los escáneres estáticos tradicionales.
El repositorio está estructurado para apoyar tanto a usuarios finales como a investigadores de ML.
lcsajdump/ml_study/ contiene el pipeline completo utilizado para entrenar los modelos:
build_dataset.py: Extrae características estructurales y semánticas de un corpus de binarios CTF.train_model.py: Entrena el modelo LightGBM LambdaRank y genera los modelos .pkl.kfold_cv.py: Valida el conjunto de datos mediante validación cruzada K-Fold.El marco está abierto a nuevas implementaciones. Para agregar una nueva arquitectura:
lcsajdump/core/config.py.ARCH_PROFILES, definiendo mnemónicos de salto, mnemónicos de retorno y registros para la arquitectura deseada (ej. x86_64).Este proyecto se publica bajo la licencia MIT. Consulta el archivo LICENSE para más detalles.
Visita la página web del proyecto: Página web de LCSAJdump
--version | FLAG | — | Muestra la versión instalada y sale. |
--help | FLAG | — | Muestra el mensaje de ayuda y sale. |