
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). |
--version | FLAG | — | Muestra la versión instalada y sale. |
--help | FLAG | — | Muestra el mensaje de ayuda y sale. |
LCSAJdump está respaldado por un conjunto de pruebas riguroso e incrementablemente validado ubicado en el directorio benchmarkTests/.