¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!
Triton — Triton es una biblioteca de análisis dinámico de binarios. Construye tus propias herramientas de análisis de programas, automatiza tu ingeniería inversa, realiza verificación de software o simplemente emula código. | Kitploit
Triton es una biblioteca de análisis dinámico de binarios. Construye tus propias herramientas de análisis de programas, automatiza tu ingeniería inversa, realiza verificación de software o simplemente emula código.
Triton es una librería de análisis binario dinámico. Proporciona componentes internos que permiten construir herramientas de análisis de programas,
automatizar la ingeniería inversa, realizar verificación de software o simplemente emular código.
Ejecución simbólica dinámica
Análisis dinámico de manchas
Representación AST de la semántica ISA de x86, x86-64, ARM32, AArch64 y RISC-V 32/64
Síntesis de expresiones
Pases de simplificación SMT
Elevación a LLVM, así como a Z3 y viceversa
Interfaz de solucionador SMT para Z3 y Bitwuzla
API en C++ y Python
Como Triton es una especie de proyecto a tiempo parcial, por favor, no nos culpen si no es completamente fiable. Abrir issues o
pull requests siempre es mejor que trolear =). Sin embargo, puedes seguir el desarrollo en Twitter
@qb_triton.
### Linux y MacOS```console
$ git clone https://github.com/JonathanSalwan/Triton
$ cd Triton
$ mkdir build ; cd build
$ cmake ..
$ make -j3
$ sudo make install
Por defecto, LLVM y Bitwuzla no se compilan. Si quieres disfrutar de todo el poder de Triton, la compilación de cmake es:```console
$ cmake -DLLVM_INTERFACE=ON -DCMAKE_PREFIX_PATH=$(llvm-config --prefix) -DBITWUZLA_INTERFACE=ON ..
root@kitploit:~
#### Nota para MacOS M1:
En caso de que obtengas errores de compilación como:```
Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
Intente especificar PYTHON_EXECUTABLE, PYTHON_LIBRARIES y PYTHON_INCLUDE_DIRS para su versión específica de Python:```console
cmake -DCMAKE_INSTALL_PREFIX=/opt/homebrew/
-DPYTHON_EXECUTABLE=/opt/homebrew/bin/python3
-DPYTHON_LIBRARIES=/opt/homebrew/Cellar/[email protected]/3.10.8/Frameworks/Python.framework/Versions/3.10/lib/libpython3.10.dylib
-DPYTHON_INCLUDE_DIRS=/opt/homebrew/opt/[email protected]/Frameworks/Python.framework/Versions/3.10/include/python3.10/
..
root@kitploit:~
Esta información la puedes obtener de este fragmento:```python
from sysconfig import get_paths
info = get_paths()
print(info)
Autocompletado de Python
Si el autocompletado de Python no funciona, sigue estos pasos:
Coloca el archivo triton.pyi generado en el mismo directorio que el objeto compartido de Triton al que deseas proporcionar sugerencias (por ejemplo, /usr/lib/python3.13/).
Tu IDE debe ser compatible con el análisis de archivos .pyi.
Windows
Puedes usar cmake para generar el archivo .sln de libTriton.```console
git clone https://github.com/JonathanSalwan/Triton.git
cd Triton
mkdir build
cd build
cmake -G "Visual Studio 14 2015 Win64"
-DBOOST_ROOT="C:/Users/jonathan/Works/Tools/boost_1_61_0"
-DPYTHON_INCLUDE_DIRS="C:/Python36/include"
-DPYTHON_LIBRARIES="C:/Python36/libs/python36.lib"
-DZ3_INCLUDE_DIRS="C:/Users/jonathan/Works/Tools/z3-4.6.0-x64-win/include"
-DZ3_LIBRARIES="C:/Users/jonathan/Works/Tools/z3-4.6.0-x64-win/bin/libz3.lib"
-DCAPSTONE_INCLUDE_DIRS="C:/Users/jonathan/Works/Tools/capstone-5.0.1-win64/include"
-DCAPSTONE_LIBRARIES="C:/Users/jonathan/Works/Tools/capstone-5.0.1-win64/capstone.lib" ..
root@kitploit:~
Puedes usar setup.py para generar la versión de depuración de triton.pyd en Windows.```console
> git clone https://github.com/JonathanSalwan/Triton.git
> cd Triton
> $env:COMPILER_DIR="C:/deps/llvm/llvm2116r/bin"
> $env:CMAKE_PREFIX_PATH="C:/deps/llvm/llvm-project-21.1.6.src/install/lib/cmake/llvm;C:/code/cxx-common-cmake/build/install"
> python_d -m build --wheel
> python_d -m pip install (Get-ChildItem .\dist\triton_library*)
Sin embargo, si prefiere descargar directamente la biblioteca precompilada, consulte nuestros artefactos de AppVeyor.
Tenga en cuenta que si utiliza los artefactos de AppVeyor, probablemente tenga que instalar los paquetes Visual C++ Redistributable para Visual Studio 2012.
Instalación desde vcpkg
El puerto de Triton en vcpkg se mantiene actualizado por miembros del equipo de Microsoft y colaboradores de la comunidad.
La URL de vcpkg es: https://github.com/Microsoft/vcpkg. Puede descargar e instalar Triton usando el administrador de dependencias vcpkg:
root@kitploit:~
git clone https://github.com/Microsoft/vcpkg.git; cd vcpkg; ./bootstrap-vcpkg.sh; ./vcpkg integrate install; ./vcpkg install triton
``````console
$ git clone https://github.com/Microsoft/vcpkg.git
$ cd vcpkg
$ ./bootstrap-vcpkg.sh # ./bootstrap-vcpkg.bat for Windows
$ ./vcpkg integrate install
$ ./vcpkg install triton
Pimp: Plugin de R2 basado en Triton para ejecución concolica y control total.
Ponce: ¡Ganador del concurso de plugins de IDA 2016! ¡Ejecución simbólica a solo un clic!
QSynthesis: Sintetizador de caja gris orientado a la desofuscación de instrucciones de ensamblador.
TritonDSE: Biblioteca DSE basada en Triton con capacidades de carga y exploración.
Titan: Titan es un desvirtualizador de VMProtect que utiliza Triton.
Artículos y conferencias
Sydr-Fuzz: Fuzzing Híbrido Continuo y Análisis Dinámico para el Ciclo de Vida del Desarrollo de Seguridad Ponencia en: Ivannikov ISP RAS Open Conference, Moscú, Rusia, 2022. [paper] [slide] Autores: Vishnyakov A., Kuts D., Logunova V., Parygina D., Kobrin E., Savidov G., Fedotov A. Resumen: Hoy en día, los marcos de análisis dinámico automatizado para pruebas continuas tienen una gran demanda para garantizar la seguridad del software y cumplir con los requisitos del ciclo de vida del desarrollo de seguridad (SDL). La eficiencia en la caza de errores de seguridad de las técnicas de fuzzing híbrido de vanguardia supera a las técnicas de fuzzing guiado por cobertura ampliamente utilizadas. Proponemos un pipeline de análisis dinámico mejorado para aprovechar la productividad de la detección automatizada de errores basada en fuzzing híbrido. Implementamos el pipeline propuesto en el conjunto de herramientas de fuzzing continuo Sydr-Fuzz, que está impulsado por un orquestador de fuzzing híbrido, integrando nuestra herramienta DSE Sydr con libFuzzer y AFL++. Sydr-Fuzz también incorpora verificadores de predicados de seguridad, la herramienta de triaje de fallos Casr y utilidades para la minimización del corpus y la recolección de cobertura. La evaluación comparativa de nuestro fuzzer híbrido frente a soluciones alternativas de última generación demuestra su superioridad sobre los fuzzers guiados por cobertura, manteniéndose al mismo nivel que los fuzzers híbridos avanzados. Además, confirmamos la relevancia de nuestro enfoque al descubrir 85 nuevas fallas de software del mundo real dentro del proyecto OSS-Sydr-Fuzz. Finalmente, abrimos el código fuente de Casr a la comunidad para facilitar el examen de los fallos existentes.
Resolución Optimista Fuerte para Ejecución Simbólica Dinámica Ponencia en: Ivannikov Memorial Workshop, Kazán, Rusia, 2022. [paper] [slide] Autores: Parygina D., Vishnyakov A., Fedotov A. Resumen: La ejecución simbólica dinámica (DSE) es un método eficaz para pruebas automatizadas de programas y detección de errores. Aumenta la cobertura de código mediante la exploración de ramas complejas durante el fuzzing híbrido. Las herramientas DSE invierten las ramas a lo largo de alguna ruta de ejecución y ayudan al fuzzer a examinar partes del programa previamente no disponibles. La DSE a menudo enfrenta problemas de sobre-restricción y sub-restricción. El primero conduce a una complicación significativa del análisis, mientras que el segundo causa una ejecución simbólica inexacta. Proponemos un método de resolución optimista fuerte que elimina las restricciones irrelevantes del predicado de ruta para la inversión de la rama objetivo. Eliminamos aquellas restricciones simbólicas de las cuales la rama objetivo no depende de control. Además, manejamos por separado las ramas simbólicas que tienen instrucciones de transferencia de control anidadas que pasan el control más allá del ámbito de la rama padre, por ejemplo, return, goto, break, etc. Implementamos el método propuesto en nuestra herramienta de ejecución simbólica dinámica Sydr. Evaluamos la estrategia optimista fuerte, la estrategia optimista que contiene solo la negación de la última restricción y su combinación. Los resultados muestran que la combinación de estrategias ayuda a aumentar ya sea la cobertura de código o el número promedio de ramas invertidas correctamente por minuto. Es óptimo aplicar ambas estrategias juntas en contraste con otras configuraciones.
Síntesis de Programas en Caja Gris: Un Nuevo Enfoque para Atacar la Ofuscación del Flujo de Datos Ponencia en: Blackhat USA, Las Vegas, Nevada, 2021. [slide] Autores: Robin David Resumen: Esta ponencia presenta los últimos avances en síntesis de programas aplicados a la desofuscación. Su objetivo es desmitificar esta técnica de análisis mostrando cómo se puede poner en acción sobre la ofuscación. En particular, la implementación Qsynthesis publicada para esta charla muestra un flujo de trabajo completo de extremo a extremo para desofuscar instrucciones de ensamblador y devolverlas como instrucciones optimizadas (desofuscadas) reensambladas en el binario.
Del código fuente al caso de prueba de fallo a través de la automatización de pruebas de software Ponencia en: C&ESAR, Rennes, Francia, 2021. [paper] [slide] Autores: Robin David, Jonathan Salwan, Justin Bourroux Resumen: Este artículo presenta un enfoque que automatiza el proceso de prueba de software desde el código fuente hasta las pruebas dinámicas del programa compilado. Más específicamente, a partir de un informe de análisis estático que indica alertas en líneas de código fuente, permite probar para cubrir estas líneas de manera dinámica y oportunista, verificando si pueden o no desencadenar un fallo. El resultado es un corpus de prueba que permite cubrir alertas y desencadenarlas si resultan ser verdaderos positivos. Este artículo discute la metodología empleada para rastrear alertas en el binario compilado, el proceso de selección de motores de prueba y los resultados obtenidos en una implementación de pila TCP/IP para sistemas embebidos y IoT.
Predicados de Seguridad Simbólicos: Cazar Debilidades del Programa Ponencia en: Ivannikov ISP RAS Open Conference, Moscú, Rusia, 2021. [paper] [slide] Autores: A.Vishnyakov, V.Logunova, E.Kobrin, D.Kuts, D.Parygina, A.Fedotov Resumen: La ejecución simbólica dinámica (DSE) es un método poderoso para la exploración de rutas durante el fuzzing híbrido y la detección automática de errores. Proponemos predicados de seguridad para detectar eficazmente comportamiento indefinido y errores de violación de acceso a memoria. Inicialmente, ejecutamos simbólicamente el programa en rutas que no desencadenan ningún error (el fuzzing híbrido puede explorar estas rutas). Luego construimos un predicado de seguridad simbólico para verificar alguna condición de error. Así, podemos cambiar el flujo de datos del programa para generar debilidades como desreferencia de puntero nulo, división por cero, acceso fuera de límites o desbordamiento de enteros. A diferencia del análisis estático, la ejecución simbólica dinámica no solo reporta errores, sino que también genera nuevos datos de entrada para reproducirlos. Además, introducimos el modelado de semántica de funciones para funciones comunes de la biblioteca estándar de C/C++. Nuestro objetivo es modelar el flujo de control dentro de una función con una única fórmula simbólica. Esto ayuda a la detección de errores, acelera la exploración de rutas y supera las sobre-restricciones en el predicado de ruta. Implementamos las técnicas propuestas en nuestra herramienta de ejecución simbólica dinámica Sydr. Así, utilizamos métodos potentes de Sydr como el segmentado del predicado de ruta que elimina restricciones irrelevantes. Presentamos Juliet Dynamic para medir la precisión de las herramientas de detección de errores dinámicos. El sistema de prueba también verifica que las entradas generadas desencadenen sanitizadores. Evaluamos la precisión de Sydr para 11 CWEs del conjunto de pruebas Juliet. Sydr muestra una precisión general del 95,59%. Ponemos a disposición pública los artefactos de evaluación de Sydr para facilitar la reproducibilidad de los resultados.
Hacia el Razonamiento de Punteros Simbólicos en la Ejecución Simbólica Dinámica Ponencia en: Ivannikov Memorial Workshop, Nizhny Novgorod, Rusia, 2021. [paper] [slide] Autores: Daniil Kuts Resumen: La ejecución simbólica dinámica es una técnica ampliamente utilizada para pruebas automatizadas de software, diseñada para la exploración de rutas de ejecución y la detección de errores de programa. Recientemente se ha generalizado un enfoque híbrido, donde el objetivo principal de la ejecución simbólica es ayudar al fuzzer a aumentar la cobertura del programa. Cuantas más ramas pueda invertir el ejecutor simbólico, más útil será para el fuzzer. El flujo de control de un programa a menudo depende de valores de memoria, que se obtienen calculando índices de direcciones a partir de la entrada del usuario. Sin embargo, la mayoría de las herramientas DSE no admiten tales dependencias, por lo que omiten algunas ramas deseadas del programa. Implementamos el razonamiento de direcciones simbólicas en lecturas de memoria en nuestra herramienta de ejecución simbólica dinámica Sydr. Las regiones de acceso a memoria posibles se determinan ya sea analizando expresiones simbólicas de direcciones de memoria, o mediante búsqueda binaria con un solucionador SMT. Proponemos una técnica de linealización mejorada para modelar accesos a memoria. Se comparan diferentes métodos de modelado de memoria en un conjunto de programas. Nuestra evaluación muestra que el manejo de direcciones simbólicas permite descubrir nuevas ramas simbólicas y aumentar la cobertura del programa.
QSynth: Un Enfoque Basado en Síntesis de Programas para la Desofuscación de Código Binario Ponencia en: BAR, San Diego, California, 2020. [paper] Autores: Robin David, Luigi Coniglio, Mariano Ceccato Resumen: Presentamos un enfoque genérico que aprovecha tanto la DSE como la síntesis de programas para sintetizar con éxito programas ofuscados con Aritmética Booleana Mixta, Codificación de Datos o Virtualización. El algoritmo de síntesis propuesto es una primitiva de síntesis enumerativa fuera de línea guiada por una búsqueda en amplitud de arriba hacia abajo. Mostramos su efectividad contra un ofuscador de última generación y su escalabilidad, ya que supera a otros enfoques similares basados en síntesis. También mostramos su efectividad en presencia de ofuscación compuesta (combinación de varias técnicas). Este trabajo en curso ilumina la efectividad de la síntesis para atacar ciertos tipos de ofuscaciones y abre el camino a algoritmos más robustos y estrategias de simplificación.
Sydr: Ejecución Simbólica Dinámica de Vanguardia Ponencia en: Ivannikov ISP RAS Open Conference, Moscú, Rusia, 2020. [paper] [slide] [video] Autores: A.Vishnyakov, A.Fedotov, D.Kuts, A.Novikov, D.Parygina, E.Kobrin, V.Logunova, P.Belecky, S.Kurmangaleev Resumen: La ejecución simbólica dinámica (DSE) tiene una enorme cantidad de aplicaciones en seguridad informática (fuzzing, descubrimiento de vulnerabilidades, ingeniería inversa, etc.). Proponemos varias mejoras de rendimiento y precisión para la ejecución simbólica dinámica. Omitir instrucciones no simbólicas permite construir un predicado de ruta 1,2–3,5 veces más rápido. El motor simbólico simplifica fórmulas durante la ejecución simbólica. El segmentado del predicado de ruta elimina conjunciones irrelevantes de las consultas al solucionador. Manejamos cada tabla de saltos (sentencia switch) como múltiples ramas y describimos el método para la ejecución simbólica de programas multi-hilo. Las soluciones propuestas se implementaron en la herramienta Sydr. Sydr realiza la inversión de ramas en el predicado de ruta. Sydr combina la herramienta de instrumentación binaria dinámica DynamoRIO con el motor simbólico Triton.
Desofuscación Simbólica: Del Código Virtualizado de Vuelta al Original Ponencia en: DIMVA, Paris-Saclay, Francia, 2018. [paper] [slide] Autores: Jonathan Salwan, Sébastien Bardin, Marie-Laure Potet Resumen: La protección de software ha ocupado un lugar importante durante la última década para proteger el software legítimo contra la ingeniería inversa o la manipulación. La virtualización se considera una de las mejores defensas contra tales ataques. Presentamos un enfoque genérico basado en exploración simbólica de rutas, taint y recompilación que permite recuperar, a partir de un código virtualizado, un código desvirtualizado semánticamente idéntico al original y de tamaño similar. Definimos criterios y métricas para evaluar la relevancia de los resultados desofuscados en términos de corrección y precisión. Finalmente, proponemos una configuración de código abierto que permite evaluar el enfoque propuesto frente a varias formas de virtualización.
Desofuscación de la protección de software basada en VM Ponencia en: SSTIC, Rennes, Francia, 2017. [french paper] [english slide] [french video] Autores: Jonathan Salwan, Sébastien Bardin, Marie-Laure Potet Resumen: En esta presentación describimos un enfoque que consiste en analizar automáticamente protecciones de software basadas en máquinas virtuales y que recompila una nueva versión del binario sin dichas protecciones. Este enfoque automatizado se basa en una ejecución simbólica guiada por un análisis de taint y algunas políticas de concreción, y luego en una reescritura de binarios utilizando la transición LLVM.
Cómo Triton puede ayudar a revertir protecciones de software basadas en máquinas virtuales Ponencia en: CSAW SOS, NYC, Nueva York, 2016. [slide] Autores: Jonathan Salwan, Romain Thomas Resumen: La primera parte de la charla será una introducción al framework Triton para exponer sus componentes y explicar cómo funcionan juntos. Luego, la segunda parte incluirá demostraciones sobre cómo es posible revertir protecciones basadas en máquinas virtuales utilizando análisis de taint, ejecución simbólica, simplificaciones SMT y optimizaciones LLVM-IR.
Análisis Dinámico de Binarios y Códigos Ofuscados Ponencia en: St'Hack, Burdeos, Francia, 2016. [slide] Autores: Jonathan Salwan, Romain Thomas Resumen: En esta presentación hablaremos sobre cómo un DBA (Análisis Dinámico de Binarios) puede ayudar a un ingeniero inverso a revertir código ofuscado. Primero introduciremos algunas técnicas básicas de ofuscación y luego expondremos cómo es posible romper algunas cosas (usando nuestro framework DBA de código abierto - Triton) como detectar predicados opacos, reconstruir CFG, encontrar el algoritmo original, aislar datos sensibles y muchos más... Luego, concluiremos con una demo y algunas palabras sobre nuestro trabajo futuro.
Cómo Triton puede ayudar a analizar binarios ofuscados Publicación en: Revista MISC 82, 2015. [french article] Autores: Jonathan Salwan, Romain Thomas Resumen: La ofuscación binaria se utiliza para proteger la propiedad intelectual del software. Existen diferentes tipos de ofuscación, pero en términos generales, transforma una estructura binaria en otra estructura binaria preservando la misma semántica. El objetivo de la ofuscación es asegurar que la información original esté "ahogada" en información inútil que dificulte la ingeniería inversa. En este artículo mostraremos cómo podemos analizar un programa ofuscado y romper algunas ofuscaciones utilizando el framework Triton.
Triton: Un Marco de Ejecución Concólica Ponencia en: SSTIC, Rennes, Francia, 2015. [french paper] [detailed english slide] Autores: Jonathan Salwan, Florent Saudel Resumen: Esta charla trata sobre el lanzamiento de Triton, un marco de ejecución concólica basado en Pin. Proporciona componentes como un motor de taint, un motor de ejecución simbólica dinámica, un motor de instantáneas, traducción de instrucciones x64 a SMT2, una interfaz Z3 para resolver restricciones y enlaces Python. Basado en estos componentes, Triton ofrece la posibilidad de construir herramientas para la investigación de vulnerabilidades o asistencia en ingeniería inversa.
Análisis de Comportamiento Dinámico Usando Instrumentación Binaria Ponencia en: St'Hack, Burdeos, Francia, 2015. [slide] Autores: Jonathan Salwan Resumen: Esta charla puede considerarse como la parte 2 de nuestra charla en SecurityDay. En la parte anterior, hablamos sobre cómo era posible cubrir una función objetivo en memoria usando el enfoque DSE (Ejecución Simbólica Dinámica). Cubrir una función (o sus estados) no significa encontrar todas las vulnerabilidades; algunas vulnerabilidades no provocan fallos en el programa. Por eso debemos implementar análisis específicos para encontrar errores específicos. Estos análisis se basan en la instrumentación binaria y el análisis de comportamiento en tiempo de ejecución del programa. En esta charla, veremos cómo es posible encontrar los siguientes tipos de errores: off-by-one, desbordamiento de pila / heap, use-after-free, cadena de formato y {write, read}-what-where.
Cubriendo una función usando un enfoque de Ejecución Simbólica Dinámica Ponencia en: Security Day, Lille, Francia, 2015. [slide] Autores: Jonathan Salwan Resumen: Esta charla trata sobre análisis e instrumentación de binarios. Veremos cómo es posible apuntar a una función específica, tomar una instantánea del contexto de memoria/registros antes de la función, traducir la instrumentación a una representación intermedia, aplicar un análisis de taint basado en esta IR, construir/mantener fórmulas para una Ejecución Simbólica Dinámica (DSE), generar un valor concreto para recorrer una ruta específica, restaurar el contexto de memoria/registros y generar otro valor concreto para recorrer otra ruta, y luego repetir esta operación hasta que se cubra la función objetivo.
Citar Triton```latex
@inproceedings{SSTIC2015-Saudel-Salwan,
author = {Saudel, Florent and Salwan, Jonathan},
title = {Triton: A Dynamic Symbolic Execution Framework},
booktitle = {Symposium sur la s{'{e}}curit{'{e}} des technologies de l'information
et des communications},
series = {SSTIC},
pages = {31--54},
address = {Rennes, France},
month = jun,
year = {2015},
}