
Uma abordagem baseada em gráfico e multiarquitetura impulsionada por ML para detecção de gadgets ROP
LCSAJdump é um framework de análise estática projetado para descobrir gadgets de Return-Oriented Programming (ROP) e Jump-Oriented Programming (JOP). Diferente de scanners tradicionais, o LCSAJdump é independente de arquitetura e emprega uma abordagem baseada em grafos para revelar vulnerabilidades invisíveis para ferramentas lineares comuns.
Scanners ROP comuns usam uma abordagem linear de "janela deslizante" sobre os bytes executáveis do binário. Este método falha sistematicamente em identificar Shadow Gadgets: cadeias de execução que atravessam blocos de memória não contíguos conectados por saltos incondicionais ou ramificações condicionais.
O LCSAJdump supera essa limitação reconstruindo o Grafo de Fluxo de Controle (CFG) através da análise LCSAJ (Sequência Linear de Código e Salto). Ao modelar o binário como um grafo direcionado de blocos básicos, a ferramenta identifica:
.text em blocos básicos LCSAJ e reconstrói relações de fluxo através de um grafo de fluxo de controle reverso construído sob medida (representação de adjacência leve, sem dependência de grafos pesados).--depth saltos, reduzindo drasticamente a memória e o tempo de construção em binários grandes (ex.: libc) enquanto produz resultados idênticos.(veja Benchmarks).
O LCSAJdump foi projetado para ser universal. Atualmente suporta:
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
O LCSAJdump oferece uma CLI poderosa para análise binária precisa:
Análise Padrão (RISC-V Padrão):
python LCSAJdump.py <caminho_para_binario>
Análise Avançada (Especificando Arquitetura e Arquivo de Saída):
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <caminho_para_binario>
Exportar como JSON com filtro de caracteres ruins:
lcsajdump -a x86_64 -d 20 -k 5 -b "000a0d" --json -o gadgets.json <caminho_para_binario>
Nota: Use
-oapós--jsonpara salvar JSON em arquivo. Sem--json,-osalva em texto simples.
Salvar saída em texto simples:
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <caminho_para_binario>
Analisar todas as seções executáveis:
lcsajdump --all-exec -d 25 -k 10 -l 30 <caminho_para_binario>
Forçar ranqueamento estritamente algorítmico (ignorar ML):
lcsajdump --algo <caminho_para_binario>
O LCSAJdump é apoiado por um conjunto de testes rigoroso e validado incrementalmente localizado no diretório benchmarkTests/.
Através de 14 iterações principais de engenharia de características semânticas, o modelo híbrido aprendeu a discriminar gadgets com base em efeitos colaterais reais de memória (extraídos via execução simbólica do angr) em vez de heurísticas puramente sintáticas.
Avaliado com validação cruzada 5-fold ciente de grupos (binários de teste nunca vistos durante o treinamento), o ranqueador alcança NDCG@1 = 0,914 ± 0,047 e NDCG@10 = 0,922 ± 0,052, o que significa que os gadgets mais úteis são consistentemente colocados no topo da saída. O motor de dois estágios prioriza com sucesso sequências limpas de estouro de pilha e chamadas do tipo ret2csu, enquanto penaliza fortemente saltos de offset fixo propensos a falhas que enganam scanners estáticos tradicionais.
O repositório está estruturado para apoiar tanto usuários finais quanto pesquisadores de ML.
lcsajdump/ml_study/ contém o pipeline completo usado para treinar os modelos:
build_dataset.py: Extrai características estruturais e semânticas de um corpus de binários CTF.train_model.py: Treina o modelo LightGBM LambdaRank e gera os modelos .pkl.kfold_cv.py: Valida o conjunto de dados usando Validação Cruzada K-Fold.O framework está aberto a novas implementações. Para adicionar uma nova arquitetura:
lcsajdump/core/config.py.ARCH_PROFILES, definindo mnemônicos de salto, mnemônicos de retorno e registradores para a arquitetura desejada (ex.: x86_64).Este projeto é lançado sob a licença MIT. Veja o arquivo LICENSE para detalhes.
Visite a página web do projeto: Página do LCSAJdump
| Bandeira | Tipo | Padrão | Descrição |
|---|
-a, --arch | TEXTO | auto | Arquitetura alvo (auto, riscv64, x86_64, arm64). Detectada automaticamente do cabeçalho ELF. |
-d, --depth | INTEIRO | 20 | Profundidade máxima de busca em blocos LCSAJ. Controla o comprimento da cadeia. |
-k, --darkness | INTEIRO | 5 | Limiar de poda — máximo de visitas por nó. Maior = mais gadgets, varredura mais lenta. |
-l, --limit | INTEIRO | 10 | Número máximo de gadgets a exibir na saída. |
-s, --min-score | INTEIRO | 0 | Pontuação heurística mínima para um gadget aparecer nos resultados. |
-i, --instructions | INTEIRO | 15 | Número máximo de instruções contidas em um único nó LCSAJ. |
-v, --verbose | BANDEIRA | — | Habilita saída detalhada com resultados por gadget. |
-o, --output | CAMINHO | — | Escreve a saída em arquivo. Texto simples por padrão; use com --json para saída JSON. |
-b, --bad-chars | TEXTO | — | Bytes hexadecimais a filtrar dos endereços dos gadgets (ex.: "000a0d"). |
--json | BANDEIRA | — | Saída dos gadgets como JSON estruturado. Combine com -o para salvar em arquivo. |
--all-exec | BANDEIRA | — | Analisa todas as seções executáveis, não apenas .text. |
-al, --algo | BANDEIRA | — | Usa estritamente o ranqueamento algorítmico (ignora ML). |
--version | BANDEIRA | — | Mostra a versão instalada e sai. |
--help | BANDEIRA | — | Mostra a mensagem de ajuda e sai. |