Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Ponce — ¡Ganador del concurso de plugins de IDA 2016! ¡Ejecución simbólica a solo un clic! | Kitploit
Herramientas/GitHubGitHub/illera88/ponce
Ingeniería InversaDepuradoresAnálisis de MalwareCTFAnálisis de Binarios
GitHubillera88/ponce

Ponce

¡Ganador del concurso de plugins de IDA 2016! ¡Ejecución simbólica a solo un clic!

Ver Repositorio
1.6k8554hace 1 añoRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Sitio web

Build for Windows Build for OSX Build for Linux

Ponce

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++.

¿Por qué?

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.

Instalación

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.

Soporte de SO

¡Ponce funciona nativamente en Windows, Linux y OSX!

Casos de uso

  • Desarrollo de exploits: Ponce puede ayudarte a crear un exploit de manera mucho más eficiente, ya que el desarrollador del exploit puede ver fácilmente qué partes de la memoria y qué registros controlas, así como posibles direcciones que pueden aprovecharse como gadgets ROP.
  • Análisis de malware: Otro uso de Ponce está relacionado con el código de malware. Analizar los comandos que soporta una familia particular de malware se determina fácilmente simbolizando un comando conocido simple y negando todas las condiciones donde se verifica el comando.
  • Reversing de protocolos: Uno de los usos más interesantes de Ponce es la posibilidad de reconocer números mágicos requeridos, cabeceras o incluso protocolos completos para una entrada de usuario controlada. Por ejemplo, Ponce puede ayudarte a listar todos los argumentos aceptados para un binario de línea de comandos o extraer el formato de archivo requerido para un analizador de archivos específico.
  • CTF: Ponce acelera el proceso de ingeniería inversa de binarios durante CTFs. Como Ponce está totalmente integrado en IDA, no tienes que preocuparte por el tiempo de configuración. ¡Está listo para usarse!

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.

Modos de uso

  • Motor de contaminación (Taint engine): Este motor se utiliza para determinar en cada paso de la ejecución del binario qué partes de la memoria y los registros son controlables por la entrada del usuario.
  • Motor simbólico: Este motor mantiene un estado simbólico de los registros y parte de la memoria en cada paso del camino de ejecución de un binario.

Ejemplos

Negar e inyectar una condición

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:

  • Seleccionamos el motor simbólico y configuramos la opción para simbolizar argv.
  • Identificamos la condición que debe cumplirse para ganar el crackMe.
  • Negamos e inyectamos la solución cada vez que se verifica un byte de nuestra entrada contra la clave.
  • Finalmente obtenemos la clave 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í

crackmexor_negate_and_inject

Usando el motor de contaminación para rastrear la entrada controlada por el usuario

En este ejemplo podemos ver el uso del motor de contaminación con cmake. Estamos:

  • Pasando un archivo como argumento a cmake para que lo analice.
  • Seleccionamos que queremos usar el motor de contaminación.
  • Contaminamos el búfer que fread() lee del archivo.
  • Reanudamos la ejecución bajo el control del depurador para ver dónde se mueve la entrada contaminada.
  • Ponce renombrará las funciones contaminadas. Estas son las funciones sobre las que el usuario tiene influencia, no simplemente las funciones ejecutadas.

cmake_tainting_fread

Usar Negar, Inyectar y Restaurar

En el siguiente ejemplo estamos usando el motor de instantáneas:

  • Pasando un archivo como argumento.
  • Seleccionamos que queremos usar el motor simbólico.
  • Contaminamos el búfer que fread() lee del archivo.
  • Creamos una instantánea en la función que analiza el búfer leído del archivo.
  • Cuando se evalúa una condición, la negamos, inyectamos la solución en memoria y restauramos la instantánea con ella.
  • La solución será "válida", por lo que satisfaremos las condiciones existentes.

fread_test_negate_restore_inject El código fuente del ejemplo se puede encontrar aquí

Uso

En esta sección listaremos las diferentes opciones de Ponce, así como los atajos de teclado:

  • Acceder a la ventana de configuración y de contaminación/simbólica: Editar > Ponce > Mostrar Config (Ctl+Shift+P y Ctl+Alt+T)

2016-09-15 11_39_08-configuracion

  • Habilitar/Deshabilitar el rastreo de Ponce (Ctl+Shift+E)

2016-09-15 11_31_34-

  • Simbolizar/contaminar un registro (Ctl+Shift+R)

2016-09-15 11_32_32-

  • Simbolizar/contaminar memoria. Se puede hacer desde la Vista IDA o la Vista Hex (Ctl+Shift+M)

2016-09-15 11_32_52-ida - testproject idb testproject exe c__users_default default-pc_documents_vi2016-09-15 11_33_10-taint _ symbolize memory range

2016-09-15 12_09_11-inicio

  • Resolver fórmula (Ctl+Shift+S)

2016-09-15 11_35_11-

  • Negar e Inyectar (Ctl+Shift+N)

2016-09-15 11_34_44-

  • Negar, Inyectar y Restaurar Instantánea (Ctl+Shift+I)

2016-09-15 11_47_19-

  • Crear Instantánea de Ejecución (Ctl+Shift+C)

2016-09-15 11_37_40-

  • Restaurar Instantánea de Ejecución (Ctl+Shift+S)

2016-09-15 11_38_10-

  • Eliminar Instantánea de Ejecución (Ctl+Shift+D)

2016-09-15 11_38_23-

  • Ejecutar Nativo (Ctl+Shift+F9)

2016-09-15 12_07_10-

Triton

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! :)

Compilación

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.

FAQ

¿Por qué el nombre de Ponce?

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.

¿Se puede usar Ponce para analizar binarios de Windows, OS X y Linux?

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.

¿Cuántas instrucciones por segundo puede manejar Ponce?

En nuestras pruebas, llegamos a procesar 3000 instrucciones por segundo. Planeamos usar el trazador PIN que ofrece IDA para aumentar la velocidad.

¡Algo no funciona!

Abre un issue, lo resolveremos lo antes posible ;)

¡Me encanta tu proyecto! ¿Puedo colaborar?

¡Claro! Por favor, haz pull requests y trabaja en los issues abiertos. Te pagaremos con cervezas por la ayuda ;)

Limitaciones

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:

    root@kitploit:~
    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!
    }
    

Autores

  • Alberto Garcia Illera (@algillera) [email protected]
  • Francisco Oca (@francisco_oca) [email protected]
Descargar herramienta