O DDISASM é um desmontador rápido , preciso o suficiente para que o código de montagem resultante seja remontado. O DDISASM é implementado usando a linguagem de programação lógica declarativa Datalog (suflê) para compilar regras e heurísticas de desmontagem. O desmontador primeiro analisa as informações do arquivo ELF/PE e decodifica um superconjunto de instruções possíveis para criar um conjunto inicial de fatos do Datalog. Esses fatos são analisados para identificar os limites da localização do código , simbolização e função . Os resultados desta análise, um conjunto refinado de fatos de dados, são então traduzidos para a representação intermediária GTIRB para análise binária e engenharia reversa. A impressora bonita do GTIRB pode ser usada para imprimir o GTIRB para remover o código de montagem remontável.
Formatos binários:
Conjunto de instruções Arquiteturas (ISAs):
Você pode executar uma versão pré -construída do DDISASM usando o Docker:
docker pull grammatech/ddisasm:latestO DDISAM pode ser usado para desmontar um binário na representação do GTIRB. Podemos tentar com um dos exemplos incluídos no repositório.
Primeiro, inicie o contêiner DDISASM Docker:
docker run -v $PWD /examples:/examples -it grammatech/ddisasm:latestDentro do recipiente do Docker, vamos construir um dos exemplos:
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o exAgora podemos prosseguir para desmontar o binário:
ddisasm ex --ir ex.gtirbDepois de ter a representação do GTIRB, você pode fazer alterações programáticas no binário usando GTIRB ou GTIRB-REWRITING.
Em seguida, você pode usar o GTIRB-PPRINTRINT (incluído na imagem do Docker) para produzir uma nova versão do binário:
gtirb-pprinter ex.gtirb -b ex_rewritten
Internamente, gtirb-pprinter gerará um arquivo de montagem e invocará o compilador/assembler (por exemplo, GCC) para produzir um novo binário. gtirb-pprinter cuidará ou gerará todas as opções de linha de comando necessárias para gerar um novo binário, incluindo opções de compilação, dependências da biblioteca ou scripts de versão de versão.
Você também pode usar gtirb-pprinter para gerar uma listagem de montagem para modificação manual:
gtirb-pprinter ex.gtirb --asm ex.sEsta listagem de montagem pode ser recompilada manualmente:
gcc -nostartfiles ex.s -o ex_rewrittenDê uma olhada em nossa documentação para obter informações adicionais.
Consulte Contribuindo.md
@inproceedings {flores-montoya2020,
author = {Antonio Flores-Montoya and Eric Schulte},
title = {Datalog Disassembly},
booktitle = {29th USENIX Security Symposium (USENIX Security 20)},
year = {2020},
isbn = {978-1-939133-17-5},
pages = {1075--1092},
url = {https://www.usenix.org/conference/usenixsecurity20/presentation/flores-montoya},
publisher = {USENIX Association},
month = aug,
}
@misc{schulte2020gtirb,
title={GTIRB: Intermediate Representation for Binaries},
author={Eric Schulte and Jonathan Dorn and Antonio Flores-Montoya and Aaron Ballman and Tom Johnson},
year={2020},
eprint={1907.02859},
archivePrefix={arXiv},
primaryClass={cs.PL}
}