
¡Ganador del concurso de plugins de IDA 2016! ¡Ejecución simbólica a solo un clic!
Ponce (pronunciado [ 'poN θe ] pon-they ) es un plugin de IDA Pro que brinda a los usuarios la capacidad de realizar análisis de contaminación (taint analysis) y ejecución simbólica sobre binarios de forma fácil e intuitiva. Con Ponce estás a un clic de obtener todo el poder de la ejecución simbólica de vanguardia. Escrito completamente en C/C++.
La ejecución simbólica no es un concepto nuevo en la comunidad de seguridad. Ha existido durante muchos años, pero no es hasta alrededor de 2015 que proyectos de código abierto como Triton y Angr se han creado para abordar esta necesidad. A pesar de la disponibilidad de estos proyectos, los usuarios finales a menudo se quedan con la tarea de implementar ellos mismos casos de uso específicos.
Abordamos estas necesidades creando Ponce, un plugin de IDA que implementa ejecución simbólica y análisis de contaminación dentro del desensamblador/depurador más utilizado por los ingenieros inversos.
Ponce funciona con binarios x86 y x64 en cualquier versión de IDA >= 7.0. Instalar el plugin es tan simple como copiar los archivos apropiados desde las últimas compilaciones a la carpeta plugins\ en el directorio de instalación de IDA.
Asegúrate de usar el binario de Ponce compilado para tu versión de IDA para evitar incompatibilidades.
¡Ponce funciona nativamente en Windows, Linux y OSX!
El plugin se ejecutará automáticamente, guiándote a través de la configuración inicial la primera vez que se ejecuta. La configuración se guardará en un archivo de configuración, por lo que no tendrás que preocuparte por la ventana de configuración nuevamente.
En el siguiente gif podemos ver el uso de la contaminación automática y cómo podemos negar una condición e inyectarla en memoria mientras depuramos:
argv.elite que ha sido inyectada en memoria y por lo tanto alcanzamos el código de Win.El código fuente del crackme se puede encontrar aquí

En este ejemplo podemos ver el uso del motor de contaminación con cmake. Estamos:
fread() lee del archivo.
En el siguiente ejemplo estamos usando el motor de instantáneas:
fread() lee del archivo.
El código fuente del ejemplo se puede encontrar aquí
En esta sección listaremos las diferentes opciones de Ponce, así como los atajos de teclado:













Ponce se basa en el framework Triton para proporcionar semántica, análisis de contaminación y ejecución simbólica. Triton es un proyecto Open Source impresionante patrocinado por Quarkslab y mantenido principalmente por Jonathan Salwan con una rica biblioteca. Nos gustaría agradecer y respaldar el trabajo de Jonathan con Triton. ¡Eres genial! :)
Desde Ponce v0.3 hemos cambiado el proceso de compilación para usar CMake. Al hacer esto, unificamos la forma en que ocurre la configuración y compilación para Linux, Windows y OSX. Ahora soportamos proporcionar retroalimentación sobre el pseudocódigo acerca de las instrucciones simbólicas o de contaminación. Para que esta función funcione, necesitas agregar hexrays.hpp a tu carpeta include del SDK de IDA. hexrays.hpp se puede encontrar en plugins/hexrays_sdk/ en tu ruta de instalación de IDA. Si no has comprado el descompilador hex-rays, aún puedes compilar Ponce usando -DBUILD_HEXRAYS_SUPPORT=OFF. Usamos Github actions como nuestro entorno de CI. Consulta los archivos de acción si quieres entender cómo ocurre el proceso de compilación.
Juan Ponce de León (1474 – julio de 1521) fue un explorador y conquistador español. Descubrió Florida en los Estados Unidos. El plugin de IDA te ayudará a descubrir, explorar y, con suerte, conquistar los diferentes caminos en un binario.
Sí, puedes usar Pounce de forma nativa en IDA para Windows o conectarte remotamente a una máquina Linux u OS X y usarlo. En la próxima versión de Ponce, soportaremos Ponce de forma nativa para las versiones de IDA de Linux y OS X.
En nuestras pruebas, llegamos a procesar 3000 instrucciones por segundo. Planeamos usar el trazador PIN que ofrece IDA para aumentar la velocidad.
Abre un issue, lo resolveremos lo antes posible ;)
¡Claro! Por favor, haz pull requests y trabaja en los issues abiertos. Te pagaremos con cervezas por la ayuda ;)
La ejecución concolica y Ponce tienen algunos problemas:
Carga/escritura de memoria simbólica: cuando el índice utilizado para leer un valor de memoria es simbólico, como en x = array[indice_simbolico], surgen algunos problemas que podrían llevar a perder el rastro de la entrada controlada por el usuario contaminada/simbolizada.
Triton no funciona muy bien con instrucciones de punto flotante.
La ejecución concolica solo analiza las instrucciones ejecutadas. Esto significa que el seguimiento simbólico se pierde en casos como el siguiente:
int check(char myinput) // La entrada es simbólica/contaminada
{
int flag = 0;
if (myinput == 'A') // Esta condición es simbólica/contaminada
flag = 1
else
flag =- 1;
return flag; // ¡flag no es simbólico/contaminado!
}