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
GAMBA — Simplificación de Expresiones Booleanas-Aritméticas Mixtas Generales: GAMBA | Kitploit
Herramientas/GitHubGitHub/denuvosoftwaresolutions/gamba
Análisis EstáticoIngeniería InversaAnálisis de MalwareCriptografíaAnálisis de Binarios
GitHubdenuvosoftwaresolutions/gamba

GAMBA

Simplificación de Expresiones Booleanas-Aritméticas Mixtas Generales: GAMBA

Ver Repositorio
23834hace 2 añosRevisado 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

GAMBA

GAMBA es una herramienta para la simplificación de expresiones mixtas booleanas-aritméticas (MBAs). GAMBA es el acrónimo de General Advanced Mixed Boolean Arithmetic simplifier (simplificador aritmético booleano mixto avanzado general). Utiliza el simplificador algebraico lineal SiMBA para simplificar iterativamente subexpresiones lineales de un MBA de entrada potencialmente no lineal. En general, sus ingredientes principales son los siguientes:

  • Uso de árboles de sintaxis abstracta (ASTs)
  • Aislamiento de subexpresiones lineales mediante la aplicación de transformaciones (triviales y más sofisticadas)
  • Refactorización para aumentar la probabilidad de construir subexpresiones lineales que puedan simplificarse
  • Simplificación de subexpresiones lineales mediante SiMBA
  • Lógica de sustitución para eliminar temporalmente constantes no triviales y operaciones aritméticas dentro de operaciones bit a bit

GAMBA se basa en el siguiente artículo; véanse también las diapositivas utilizadas para la presentación:

root@kitploit:~
@inproceedings{gamba2023,
    author = {Reichenwallner, Benjamin and Meerwald-Stadler, Peter},
    title = {Simplification of General Mixed Boolean-Arithmetic Expressions: {GAMBA}},
    address = {Delft, The Netherlands},
    year = {2023},
    month = jul,
    publisher = {IEEE},
    pages = {427--438},
    doi = {10.1109/EuroSPW59978.2023.00053},
    howpublished = {https://arxiv.org/abs/2305.06763},
    booktitle = {Proceedings of the 2nd Workshop on Robust Malware Analysis, WORMA'23, 
                 co-located with the 8th IEEE European Symposium on Security and Privacy}
}

Contenido

Se proporcionan dos programas principales:

  • simplify_general.py para la simplificación de MBAs generales
  • simplify.py para la simplificación de MBAs lineales

Además, se proporciona un script de prueba para reproducir los resultados indicados en el artículo.

Uso

Simplificación de expresiones generales individuales

Para simplificar una única expresión expr, utilice

root@kitploit:~
python3 src/simplify_general.py "expr"

Alternativamente, se pueden simplificar varias expresiones a la vez, p. ej.:

root@kitploit:~
python3 src/simplify_general.py "x+x" "y*y" "a&a"

De hecho, cada argumento de línea de comandos que no sea una opción se considera una expresión a simplificar. Tenga en cuenta que omitir las comillas puede provocar un comportamiento no deseado. Los resultados de la simplificación se imprimen en la línea de comandos como se muestra a continuación:

root@kitploit:~
*** Expression x+x
*** ... simplified to 2*x
*** Expression y*y
*** ... simplified to y**2
*** Expression a
*** ... simplified to a

Si se utiliza la opción -z, los resultados de la simplificación se verifican finalmente para que sean semánticamente equivalentes a las expresiones originales mediante Z3. Esto no afecta a la salida de la línea de comandos siempre que el algoritmo funcione correctamente:

root@kitploit:~
python3 src/simplify_general.py "x+x" -z

Si el algoritmo produjera un resultado incorrecto, se activaría el siguiente error:

root@kitploit:~
*** Expression x+x
Error in simplification! Simplified expression is not equivalent to original one!

Además, se puede realizar una validación numérica de los resultados con todas las entradas posibles hasta un número de bits específico. Esto se habilita con la opción -v, seguida de un número máximo de bits de las entradas utilizadas:

root@kitploit:~
python3 src/simplify_general.py "x+x" -v 3

Nuevamente, en caso de un resultado incorrecto, la salida podría verse así:

root@kitploit:~
*** Expression x+x
*** ... verify via evaluation ... [                    ] 0%
*** ... verification failed for input [1, 0]: orig 1, output 2

Las constantes que aparecen en las expresiones de salida de GAMBA pueden depender obviamente del número de bits utilizados tanto para las constantes como para las variables. Este número es $64$ por defecto y se puede configurar con la opción -b:

root@kitploit:~
python3 src/simplify_general.py "-x" -b 32

Por defecto, las constantes que aparecen en la salida se notifican en la representación lo más cercana posible a cero. Es decir, en el caso anterior, el número -1 permanecería:

root@kitploit:~
*** Expression -x
*** ... simplified to -x

Este comportamiento se puede cambiar: con la opción -m, se habilita una reducción módulo de las constantes:

root@kitploit:~
python3 src/simplify_general.py "-x" -b 32 -m

Entonces, para un número $b$ de bits, las constantes siempre se encuentran entre $0$ y $2^b-1$. Por lo tanto, la llamada anterior implicaría la siguiente salida:

root@kitploit:~
*** Expression -x
*** ... simplified to 4294967295*x

Simplificación de expresiones lineales individuales

El archivo src/simplify.py está pensado para ser utilizado por src/simplify_general.py, pero también puede ejecutarse de forma aislada. Utilice la opción de línea de comandos -h para ver las configuraciones disponibles.

Reproducción de experimentos

El archivo experiments/tests.py se puede utilizar para reproducir los experimentos indicados en el artículo. Por defecto, ejecuta GAMBA en 6 conjuntos de datos:

root@kitploit:~
python3 experiments/tests.py

Alternativamente, se le puede indicar que ejecute SiMBA en su lugar utilizando la opción --linear o -l. En ese caso, SiMBA solo se ejecuta en MBAs con verdades de terreno lineales:

root@kitploit:~
python3 experiments/tests.py --linear

Las comprobaciones numéricas o las comprobaciones con Z3 se pueden habilitar mediante las opciones --check (-c) o --z3 (-z), respectivamente.

Las expresiones se clasifican según el éxito de la simplificación o verificación:

  • ok: expresiones que se simplifican exactamente al mismo resultado que las correspondientes verdades de terreno
  • okz: expresiones cuya equivalencia con las verdades de terreno se puede verificar mediante el algoritmo (simplificando la expresión menos la expresión de verdad de terreno a 0)
  • z3: expresiones cuya equivalencia con las verdades de terreno se puede verificar mediante Z3
  • to: expresiones para las que el algoritmo agotó el tiempo de espera
  • ng: expresiones para las que la simplificación y la verificación no tuvieron éxito
  • nc: expresiones para las que el algoritmo, en caso de que se utilice SiMBA, no se ejecutó porque las verdades de terreno no son lineales
  • err: expresiones para las que se produjo un error

Conjuntos de datos

Los conjuntos de datos para usar con experiments/tests.py se pueden encontrar en el directorio experiments/datasets/.

  • neureduce.txt: Use la opción -d 0; de https://github.com/fvrmatteo/NeuReduce/tree/master/dataset/linear/test/test_data.csv (con algunas correcciones aplicadas)
  • mba_obf_linear.txt: Use la opción -d 1; de https://github.com/nhpcc502/MBA-Obfuscator/tree/main/samples/ground.linear.poly.txt (1000 expresiones lineales)
  • mba_obf_nonlinear.txt: Use la opción -d 2; de https://github.com/nhpcc502/MBA-Obfuscator/tree/main/samples/ground.linear.poly.txt y https://github.com/nhpcc502/MBA-Obfuscator/tree/master/samples/ground.linear.nonpoly.txt (500 expresiones cada uno; con algunas correcciones para expresiones no polinómicas)
  • syntia.txt: Use la opción -d 3; de MBA-Flatten, dataset/dataset_syntia.txt
  • mba_flatten.txt: Use la opción -d 4; de MBA-Flatten, primeras 1000 expresiones de dataset/pldi_dataset_linear_MBA.txt, dataset/pldi_dataset_poly_MBA.txt, dataset/pldi_dataset_nonpoly_MBA.txt
  • qsynth_ea.txt: Use la opción -d 5; de https://github.com/werew/qsynth-artifacts/tree/master/datasets/syntia/ground_truth.json

Además, se proporcionan los siguientes conjuntos de datos adicionales en el directorio experiments/datasets/bonus/ (no cubiertos en la publicación):

  • loki_tiny.txt: Use la opción -d 6; de https://github.com/RUB-SysSec/loki/tree/main/experiments/experiment_10_mba_formula/data, 25000 MBAs generados por el artículo LOKI para expresiones de verdad de terreno simples ($x+y$, $x-y$, $x\&y$, $x|y$, $x^y$), hasta profundidad 5

Formato de los MBAs

El número de variables es, en teoría, ilimitado, pero por supuesto el tiempo de ejecución aumenta con el número de variables. No hay una restricción estricta sobre la notación de las variables. Deben comenzar con una letra y pueden contener letras, números y guiones bajos. Por ejemplo, los siguientes nombres de variable serían todos válidos:

  • $a$, $b$, $c$, ..., $x$, $y$, $z$, ...
  • $v0$, $v1$, $v2$, ...
  • $v_0$, $v_1$, $v_2$, ...
  • $X0$, $X1$, $X2$, ...
  • $var0$, $var1$, $var2$, ...
  • $var1a$, $var1b$, $var1c$, ...
  • ...

Se admiten los siguientes operadores, ordenados por su precedencia en Python:

  • $**$: exponenciación
  • $\mathord{\sim}$, $-$: negación bit a bit y menos unario
  • $*$: producto
  • $+$, $-$: suma y diferencia
  • <<: desplazamiento a la izquierda
  • &: conjunción
  • $\mathbin{^\wedge}$: disyunción exclusiva
  • $|$: disyunción inclusiva

Se puede usar espacio en blanco en las expresiones de entrada. Por ejemplo, la expresión "x+y" también puede escribirse como "x + y".

Respete la precedencia de los operadores y use paréntesis si es necesario. Por ejemplo, las expresiones $1 + (x|y)$ y $1 + x|y$ no son equivalentes ya que $+$ tiene mayor precedencia que $|$. Tenga en cuenta que la última ni siquiera es un MBA lineal.

Dependencias

Z3

El solucionador SMT Z3 es requerido por simplify_general.py y simplify.py si se utiliza la verificación opcional de expresiones simplificadas. Si esta opción no se usa, no se lanza ningún error incluso si Z3 no está instalado.

Instalación de Z3:

  • desde el repositorio de Github: https://github.com/Z3Prover/z3
  • en Debian: sudo apt-get install python3-z3

NumPy

El paquete de computación científica NumPy se requiere por pereza, pero no es realmente esencial para el funcionamiento. Nota: se requiere al menos la versión 1.15.0 para numpy.quantile

Instalación de NumPy:

  • desde el repositorio de Github: https://github.com/numpy/numpy.git
  • en Debian: sudo apt-get install python3-numpy

Licencia

Copyright (c) 2023 Denuvo GmbH, publicado bajo GPLv3.

Contacto

  • Benjamin Reichenwallner: benjamin(dot)reichenwallner(at)denuvo(dot)com
  • Peter Meerwald-Stadler: peter(dot)meerwald(at)denuvo(dot)com
Descargar herramienta