A retrawrite é um reescrito binário estático para x64 e aarch64. Funciona sem heurísticas, não introduz a sobrecarga e usa a técnica de simbolização (também conhecida como montagem remontável ) para inserir instrumentação em binários sem a necessidade de código -fonte.
Observe que a versão x64 e a versão ARM64 usam diferentes algoritmos de reescrita e suportam um conjunto diferente de recursos.
Para detalhes técnicos, você pode ler o artigo (no IEEE S&P'20 ) para a versão x64 e esta tese para a versão ARM64.
O Kretowrite é uma variante da versão X64 que suporta a reescrita dos módulos do kernel Linux.
A retrawrite é implementada no Python3 (3.6). Depende de pyelftools e capstone . Para instalar as dependências, execute:
pip install - r requirements . txtNão é recomendável instalar as dependências dos gerentes de pacotes da sua distro, pois eles podem estar desatualizados.
| Retrowrite-x64 | retrowrite-aarch64 | |
|---|---|---|
| binários despojados | (WIP) | ✅ |
| Binários que não são de torta | ✅ | |
| Compiladores não padrão | ✅ | |
| Zero no alto | ✅ | ✅ |
| Suporte dos módulos do kernel | ✅ | |
| Instrumentação de cobertura AFL | ✅ | ✅ |
| Instrumentação asan | ✅ | ✅ |
| Suporte C ++ | (WIP) | (WIP) |
(retro) $ retrowrite --help
usage: retrowrite [-h] [-a] [-A] [-m MODULE] [-k] [--kcov] [-c] [--ignore-no-pie] [--ignore-stripped] [-v] bin outfile
positional arguments:
bin Input binary to load
outfile Symbolized ASM output
optional arguments:
-h, --help show this help message and exit
-a, --assemble Assemble instrumented assembly file into instrumented binary
-A, --asan Add binary address sanitizer instrumentation
-m MODULE, --module MODULE
Use specified instrumentation pass/module in rwtools directory
-k, --kernel Instrument a kernel module
--kcov Instrument the kernel module with kcov
-c, --cache Save/load register analysis cache (only used with --asan)
--ignore-no-pie Ignore position-independent-executable check (use with caution)
--ignore-stripped Ignore stripped executable check (use with caution)
-v, --verbose Verbose output Selecione o passe de instrumentação que você gostaria de aplicar com retrowrite -m <pass> Você pode encontrar os passes de instrumentação disponíveis nas pastas rwtools_x64 e rwtools_arm64 .
A instrumentação disponível passa para x64: - endereço de endereço - informações de cobertura AFL
A instrumentação disponível passa para aarch64: - EndereçoSanitizer - Informações de cobertura AFL + ForkServer - Integridade de fluxo de controle grave grosso nas entradas de função
retrowrite --asan </path/to/binary/> </path/to/output/binary>
Nota: Se no x64, verifique se o binário é independente da posição e não for removido. Isso pode ser verificado usando o comando file (a saída deve dizer ELF shared object ).
Exemplo, crie uma versão instrumentada de /bin/ls :
retrowrite --asan /bin/ls ls-basan-instrumented.s
Isso gerará um arquivo de montagem ( .s ). Para recompilar a montagem de volta a um binário, depende da arquitetura:
A montagem gerada pode ser montada e vinculada usando qualquer compilador, como:
gcc ls-basan-instrumented.s -lasan -o ls-basan-instrumented
Debug Caso você receba a undefined reference to `__asan_init_v4' , substitua" asan_init_v4 "por" asan_init "no arquivo de montagem, o seguinte comando pode ajudá-lo a fazer isso: sed -i 's/asan_init_v4/asan_init/g' ls-basan-instrumented.s
No AARCH64, também contamos com compiladores padrão para montar e vincular, mas a coleta de sinalizadores do compilador está um pouco mais envolvida e, portanto, fornecemos o interruptor -a uma troca no executável principal retrowrite para fazer isso para você:
retrowrite -a ls-basan-instrumented.s -lasan -o ls-basan-instrumented
Para gerar um binário instrumentado pela AFL, primeiro gere o conjunto simbolizado, conforme descrito acima. Em seguida, recompile o conjunto simbolizado com afl-gcc de AFL ++ como este:
$ AFL_AS_FORCE_INSTRUMENT=1 afl-gcc foo.s -o foo
ou afl-clang .
Para instrumentar um binário com informações de cobertura, use o passe de instrumentação de cobertura com retrowrite -m coverage <input file> <output asm> . Remopa o binário com retrowrite -a <output asm> <new binary> .
O binário agora pode ser confuso com:
afl-fuzz -i < seed folder > -o < out folder > < new binary > A retrowrite também tenta adicionar instrumentação para atuar como um bifurário da AFL; Caso isso cause problemas, você pode desativar esse comportamento usando export AFL_NO_FORKSERVER=1
Para gerar montagem simbolizada que pode ser modificada à mão ou pós-processamento pelas ferramentas existentes, basta especificar nenhum passe de instrumentação:
retrowrite </path/to/binary> <path/to/output/asm/files>
Os arquivos ASM de saída podem ser editados gratuitamente à mão ou por outras ferramentas. Após a modificação, os arquivos ASM podem ser montados para os binários de trabalho, conforme descrito acima.
Embora a retrawrite seja interoperável com outras ferramentas, incentivamos fortemente os pesquisadores a usar a API de retrowrite para suas necessidades binárias de instrumentação / modificação! Isso salva o esforço adicional de ter que carregar e analisar binários ou arquivos de montagem.
Executar setup.sh :
./setup.sh kernelAtive o virtualenv (da raiz do repositório):
source retro/bin/activate(Bônus) para sair do VirtualEnv quando terminar com a retrowrite:
deactivateretrowrite --asan --kernel </path/to/module.ko> </path/to/output/module_asan.ko>retrowrite </path/to/module.ko> <path/to/output/asm/files> Para a campanha de fuzzing, consulte Fuzzing/ Pasta.
Em geral, librw/ contém o código para carregar, desmontagem e simbolização de binários e forma o núcleo de todas as transformações. A transformação individual passa que se baseia no topo desta estrutura de reescrita, como o nosso desinfetante para endereço apenas binário (Basan) está contido como ferramentas individuais no rwtools/ .
Os arquivos e a pasta que começam com k estão vinculados à versão de retrowrite do kernel.
Na demos/pasta, você encontrará exemplos para o Usuários Space e o Kernel Retrwrite (DEMOS/USER_DEMO e DEMOS/KERNEL_DEMO, respectivamente).
As seguintes publicações cobrem diferentes partes do projeto de retrowrite:
Retrowrite: binários estaticamente instrumentados de berços para fuzzing e higienização Sushant Dinesh, Nathan Burow, Dongyan Xu e Mathias Payer. Em Oakland'20: Simpósio Internacional IEEE sobre Segurança e Privacidade, 2020
Sem fonte, sem problemas! Fuzzing binário de alta velocidade Matteo Rizzo e Mathias Payer. Em 36c3'19: Congresso de Comunicação do Chaos, 2019
A licença do MIT
Copyright (c) 2019 HexHive Group, Sushant Dinesh [email protected], Luca Di Bartolomeo [email protected], Antony Vennard [email protected], Matteo Rizzo [email protected], Mathias Payer [email protected]
A permissão é concedida, gratuita, a qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o "software"), para lidar com o software sem restrição, inclusive sem limitação os direitos de usar, copiar, modificar, mesclar, publicar, distribuir, mobilizar o software e/ou vender cópias do software e permitir que as pessoas a quem
O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou em partes substanciais do software.
O software é fornecido "como está", sem garantia de qualquer tipo, expresso ou implícito, incluindo, entre outros, as garantias de comercialização, aptidão para uma finalidade específica e não innoculação. Em nenhum caso os autores ou detentores de direitos autorais serão responsáveis por qualquer reclamação, danos ou outro passivo, seja em uma ação de contrato, delito ou não, decorrente de, fora ou em conexão com o software ou o uso ou outras negociações no software.