Ponce
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++.
Porquê?
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.
Instalação
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.
Suporte de SO
O Ponce funciona nativamente no Windows, Linux e OSX!
Casos de uso
- Desenvolvimento de exploits: O Ponce pode ajudá-lo a criar um exploit de forma muito mais eficiente, pois o desenvolvedor de exploits pode ver facilmente que partes da memória e que registos controla, bem como possíveis endereços que podem ser aproveitados como gadgets ROP.
- Análise de malware: Outra utilização do Ponce relaciona-se com código malicioso. Analisar os comandos que uma determinada família de malware suporta é facilmente determinado ao simbolizar um comando simples conhecido e negando todas as condições onde o comando está a ser verificado.
- Reversão de protocolos: Um dos usos mais interessantes do Ponce é a possibilidade de reconhecer números mágicos (magic numbers), cabeçalhos ou mesmo protocolos inteiros necessários para entrada de utilizador controlada. Por exemplo, o Ponce pode ajudá-lo a listar todos os argumentos aceites para um binário de linha de comandos ou extrair o formato de ficheiro necessário para um analisador de ficheiros específico.
- CTF: O Ponce acelera o processo de engenharia reversa de binários durante CTFs. Como o Ponce está totalmente integrado no IDA, não precisa de se preocupar com o tempo de configuração. Está pronto a ser utilizado!
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.
Modos de utilização
- Motor de contaminação (Tainting engine): Este motor é utilizado para determinar, a cada passo da execução do binário, que partes da memória e registos são controláveis pela entrada do utilizador.
- Motor simbólico: Este motor mantém um estado simbólico dos registos e de parte da memória a cada passo no caminho de execução de um binário.
Exemplos
Negar e injetar uma condiçã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:
- Selecionamos o motor simbólico e definimos a opção para simbolizar
argv.
- Identificamos a condição que precisa de ser satisfeita para ganhar o crackMe.
- Negamos e injetamos a solução sempre que um byte da nossa entrada é verificado contra a chave.
- Finalmente, obtemos a chave
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

Usando o motor de contaminação para rastrear entrada controlada pelo utilizador
Neste exemplo podemos ver o uso do motor de contaminação com o cmake. Estamos:
- A passar um ficheiro como argumento para o cmake para que ele o analise.
- Selecionamos que queremos usar o motor de contaminação.
- Contaminamos o buffer que ```fread()```` lê do ficheiro.
- Retomamos a execução sob controlo do debugger para ver onde a entrada contaminada é movida.
- O Ponce renomeará as funções contaminadas. Estas são as funções sobre as quais o utilizador tem influência, não as funções simplesmente executadas.

Usar Negar, Injetar e Restaurar
No próximo exemplo estamos a usar o motor de snapshot:
- A passar um ficheiro como argumento.
- Selecionamos que queremos usar o motor simbólico.
- Contaminamos o buffer que ```fread()```` lê do ficheiro.
- Criamos um snapshot na função que analisa o buffer lido do ficheiro.
- Quando uma condição é avaliada, negamo-la, injetamos a solução na memória e restauramos o snapshot com ela.
- A solução será "válida", satisfazendo assim as condições existentes.
O código fonte do exemplo pode ser encontrado aqui
Utilização
Nesta secção listaremos as diferentes opções do Ponce, bem como os atalhos de teclado:
- Aceder à configuração e às janelas de contaminação/simbólica: Edit > Ponce > Show Config (Ctl+Shift+P e Ctl+Alt+T)

- Ativar/Desativar o rastreio do Ponce (Ctl+Shift+E)

- Simbolizar/contaminar um registo (Ctl+Shift+R)

- Simbolizar/contaminar memória. Pode ser feito a partir da IDA View ou da Hex View (Ctl+Shift+M)

