A Tigress é um virtualizador/ofuscador diversificante para o idioma C que suporta muitas novas defesas contra ataques estáticos e dinâmicos de engenharia reversa e ataques de virtualização. Em particular, a Tigress protege contra a desvirtualização estática, gerando conjuntos de instruções virtuais de complexidade e diversidade arbitrárias, produzindo intérpretes com vários tipos de despacho de instrução e inserindo código para análise anti-alias. O Tigress protege contra a desvirtualização dinâmica, mesclando o código real com funções falsas, inserindo fluxo implícito e criando intérpretes reenetrantes com execução lenta. A Tigress implementa sua própria versão do Código de embalagem através do uso da geração de código de tempo de execução. Finalmente, a transformação dinâmica da Tigress fornece uma forma generalizada de modificação de código de tempo de execução contínua.
A Tigress Team forneceu alguns desafios onde podemos encontrar diferentes tipos de proteções
Todos os desafios tomam como entrada um número e retornam um hash. Exemplo:
$ ./obfuscated_binaries/tigress-2-challenge-2 1234 202180712448 $ ./obfuscated_binaries/tigress-2-challenge-2 823748 50564355584 $ ./obfuscated_binaries/tigress-2-challenge-2 2834723 50714072576
A função de computação de hash é ofuscada. Tipos de ataques possíveis:
Nossos objetivos eram:
E tudo isso com apenas um script genérico :). Para fazer isso, fizemos na seguinte ordem:
Se você deseja mais informações, pode verificar nosso script de resolução-v.py.

No entanto, já pressionamos todos os nossos resultados neste repositório, mas se você quiser reproduzir por si mesmo esta análise, você só precisa executar solve-vm.py como este:
$ ./solve-vm.py ./obfuscated_binaries/_binary_
Exemplo:
$ ./solve-vm.py ./tigress-challenges/tigress-0-challenge-0 [+] Carregando 0x400040 - 0x400238 [+] Carregando 0x400238 - 0x400254 [+] Carregando 0x400000 - 0x400f14 [+] Carregando 0x601e28 - 0x602550 [+] Carregando 0x601e50 - 0x601fe0 [+] Carregando 0x400254 - 0x400298 [+] Carregando 0x400dc4 - 0x400E08 [+] Carregando 0x000000 - 0x000000 [+] Carregando 0x601e28 - 0x602000 [+] Hooking printf [+] Vinculando __libc_start_main [+] Vinculando strtoul [+] Emulação inicial. [+] __libc_start_main conectado [+] argv [0] = ./tigress-challenges/tigress-0-challenge-0 [+] argv [1] = 1234 [+] StrToul ficou fisgado [+] Simbolizando o retorno do strtoul [+] PrintF preso 3035321144166078008 [+] FLINING END-PONTE DIURA EXPRESSÃO [-] Instrução não suportada: 0x400539: HLT [+] Instrução executada: 39816 [+] Instruções únicas executadas: 458 [+] PC Len: 0 [+] Emulação feita. [+] Gerando symbolic_expressions/tigress-0-challenge-0.py [+] Converter expressões simbólicas em um módulo LLVM ... [+] Módulo LLVM escreveu em llvm_expressions/tigress-0-Challenge-0.ll [+] Recompilar o binário desbociado ... [+] Deobfuscated binário recompilado: Deobfuscated_binaries/Tigress-0-Challenge-0.deobfuscated
Em seguida, expressões simbólicas podem ser encontradas aqui, as representações de LLVM podem ser encontradas aqui e os binários recompilados podem ser encontrados aqui.
Usando Docker:
$ git clone [email protected]: jonathansalwan/tigress_protection.git $ CD/PATH/TO/Tigress_protection $ Docker Build -t Image_tigress_protection. $ Docker Run -v/Path/to/tigress_protection:/root/tigress_protection -ti - -name = tigress_protection --ulimit = 'Stack = -1: -1' image_tigress_protection
Teste dentro do contêiner Docker
# cd ~/tigress_protection # ./solve-vm.py tigress-challenges/tigress-0-Challenge-0
À medida que simplificamos e recompilamos novos binários, devemos fornecer o mesmo comportamento dos binários originais. Então, para testar nossas versões binárias, usamos esse script.
$ ./scripts/testing_equality.py ./tigress-challenges/tigress-0-challenge-0 ./deobfuscated_binários/tigress-0-challenge-0.deobfuscated [...] [+] Sucesso com 272966812638982633 [+] Sucesso com 2304147855662358786 [+] Sucesso com 15697842028176298504 [+] Sucesso com 15273138908025273913 [+] Sucesso com 17329851347176088980 [+] Sucesso com 12160831137213706322 [+] Sucesso com 3489058267725840982 [+] Sucesso com 6474275930952607745 [+] Sucesso com 7363567981237584398 [+] Sucesso com 3685039181436704621 [+] Sucesso: 100,00
Basicamente, esse script executa os binários ofuscados e desbociados com entradas aleatórias e verifica se eles têm os mesmos resultados de saída.

Em relação à tabela de proporções, após os desafios resolvidos da Tigress, pedimos a Christian Collberg as fontes de seus desafios para comparar o tamanho das fontes originais e nossas versões desviárias. Observe que, a pedido de Christian, não podemos fornecer fontes dos desafios da Tigress, se você quiser essas fontes, pergunte diretamente a ele :).
Também pegamos 20 algoritmos de hash (10 bem conhecidos, 10 do desafio de Tigress) e protegemos cada um desses algoritmos usando 46 proteções diferentes de tigress (consulte a próxima seção). No final, temos um banco de teste de 920 binários protegidos. Cada um desses binários protegidos foi desviário com sucesso usando o script solve-vm.py . Esses algoritmos de hash podem ser encontrados no diretório de amostras e suas versões desviárias no diretório DEOBFUSCATED_BINARIAS. A tabela a seguir é um resumo de nossos resultados em relação às nossas 920 amostras.

Para obter mais informações sobre essas opções, consulte as páginas 1 e 2.