
Vencedor do concurso de plugins da IDA 2016! Execução Simbólica a um clique de distância!
Ponce (pronunciado [ 'poN θe ] pon-they ) é um plugin do IDA Pro que fornece aos utilizadores a capacidade de realizar análise de contaminação (taint analysis) e execução simbólica sobre binários de forma fácil e intuitiva. Com o Ponce, está a um clique de obter todo o poder da execução simbólica de ponta. Totalmente escrito em C/C++.
A execução simbólica não é um conceito novo na comunidade de segurança. Existe há muitos anos, mas só por volta de 2015 é que projetos open source como o Triton e o Angr foram criados para responder a esta necessidade. Apesar da disponibilidade destes projetos, os utilizadores finais são muitas vezes deixados a implementar casos de uso específicos por si próprios.
Respondemos a estas necessidades criando o Ponce, um plugin IDA que implementa execução simbólica e análise de contaminação dentro do desassemblador/debugger mais utilizado por engenheiros reversos.
O Ponce funciona com binários x86 e x64 em qualquer versão do IDA >= 7.0. Instalar o plugin é tão simples como copiar os ficheiros apropriados das últimas builds para a pasta plugins\ no seu diretório de instalação do IDA.
Certifique-se de que utiliza o binário do Ponce compilado para a sua versão do IDA para evitar incompatibilidades.
O Ponce funciona nativamente no Windows, Linux e OSX!
O plugin será executado automaticamente, guiando-o pela configuração inicial na primeira vez que for executado. A configuração será guardada num ficheiro de configuração, para que não tenha de se preocupar novamente com a janela de configuração.
No próximo gif podemos ver a utilização da contaminação automática e como podemos negar uma condição e injetá-la na memória durante a depuração:
argv.elite que foi injetada na memória e, portanto, alcançamos o código Win.O código fonte do crackme pode ser encontrado aqui

Neste exemplo podemos ver o uso do motor de contaminação com o cmake. Estamos:

No próximo exemplo estamos a usar o motor de snapshot:
O código fonte do exemplo pode ser encontrado aqui
Nesta secção listaremos as diferentes opções do Ponce, bem como os atalhos de teclado:













O Ponce depende do Triton framework para fornecer semântica, análise de contaminação e execução simbólica. O Triton é um fantástico projeto Open Source patrocinado pela Quarkslab e mantido principalmente por Jonathan Salwan com uma biblioteca rica. Gostaríamos de agradecer e apoiar o trabalho do Jonathan com o Triton. És demais! :)
Desde o Ponce v0.3 que mudámos o processo de compilação para usar CMake. Com isto unificamos a forma como a configuração e construção acontece para Linux, Windows e OSX. Agora suportamos fornecer feedback no pseudocódigo sobre instruções simbólicas ou de contaminação. Para esta funcionalidade funcionar, precisa de adicionar hexrays.hpp à sua pasta include do IDA SDK. O hexrays.hpp pode ser encontrado em plugins/hexrays_sdk/ no seu caminho de instalação do IDA. Se não adquiriu o decompilador hex-rays, pode ainda assim construir o Ponce usando -DBUILD_HEXRAYS_SUPPORT=OFF. Usamos Github actions como nosso ambiente de CI. Consulte os ficheiros de action se quiser perceber como o processo de construção acontece.
Juan Ponce de León (1474 – Julho de 1521) foi um explorador e conquistador espanhol. Descobriu a Florida nos Estados Unidos. O plugin IDA ajudá-lo-á a descobrir, explorar e, esperemos, conquistar os diferentes caminhos num binário.
Sim, pode usar nativamente o Ponce no IDA para Windows ou anexar remotamente a uma máquina Linux ou OS X e usá-lo. Na próxima versão do Ponce suportaremos nativamente o Ponce para as versões do IDA para Linux e OS X.
Nos nossos testes, conseguimos processar 3000 instruções por segundo. Planeamos usar o tracer PIN que o IDA oferece para aumentar a velocidade.
Abra uma issue, resolveremos ASAP ;)
Claro! Por favor, faça pull requests e trabalhe nas issues abertas. Pagaremos com cervejas pela ajuda ;)
A execução concólica e o Ponce têm alguns problemas:
Carregamento/escrita de memória simbólica: Quando o índice usado para ler um valor de memória é simbólico, como em x = array[symbolic_index], surgem alguns problemas que podem levar à perda do rasto da entrada controlada pelo utilizador contaminada/simbolizada.
O Triton não funciona muito bem com instruções de ponto flutuante.
A execução concólica apenas analisa as instruções executadas. Isso significa que o rastreio simbólico é perdido em casos como o seguinte:
int check(char myinput) // Input é simbólico/contaminado
{
int flag = 0;
if (myinput == 'A') // Esta condição é simbólica/contaminada
flag = 1
else
flag =- 1;
return flag; // flag não é simbólico/contaminado!
}