Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
GAMBA — Vereinfachung allgemeiner gemischter boolesch-arithmetischer Ausdrücke: GAMBA | Kitploit
Tools/GitHubGitHub/denuvosoftwaresolutions/gamba
Statische AnalyseReverse EngineeringMalware-AnalyseKryptographieBinäranalyse
GitHubdenuvosoftwaresolutions/gamba

GAMBA

Vereinfachung allgemeiner gemischter boolesch-arithmetischer Ausdrücke: GAMBA

Repository anzeigen
23834vor 2 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

GAMBA

GAMBA ist ein Werkzeug zur Vereinfachung gemischter boolesch-arithmetischer Ausdrücke (MBAs). GAMBA ist die Kurzform für „General Advanced Mixed Boolean Arithmetic Simplifier“. Es verwendet den linear-algebraischen Simplifier SiMBA, um lineare Teilausdrücke eines potenziell nichtlinearen Eingabe-MBA iterativ zu vereinfachen. Insgesamt sind seine Kernbestandteile die folgenden:

  • Verwendung abstrakter Syntaxbäume (ASTs)
  • Isolierung linearer Teilausdrücke durch Anwendung (trivialer und anspruchsvollerer) Transformationen
  • Refactoring, um die Chance zu erhöhen, lineare Teilausdrücke zu bilden, die vereinfacht werden können
  • Vereinfachung linearer Teilausdrücke mit SiMBA
  • Substitutionslogik, um vorübergehend nichttriviale Konstanten und arithmetische Operationen innerhalb bitweiser Operationen loszuwerden

GAMBA basiert auf dem folgenden Paper; siehe auch die für die Präsentation verwendeten Folien:

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}
}

Inhalt

Es werden zwei Hauptprogramme bereitgestellt:

  • simplify_general.py zur Vereinfachung allgemeiner MBAs
  • simplify.py zur Vereinfachung linearer MBAs

Darüber hinaus wird ein Testskript bereitgestellt, um die in der Arbeit angegebenen Ergebnisse zu reproduzieren.

Verwendung

Vereinfachen einzelner allgemeiner Ausdrücke

Um einen einzelnen Ausdruck expr zu vereinfachen, verwenden Sie

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

Alternativ können mehrere Ausdrücke gleichzeitig vereinfacht werden, z. B.:

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

Tatsächlich wird jedes Kommandozeilenargument, das keine Option ist, als ein zu vereinfachender Ausdruck betrachtet. Beachten Sie, dass das Weglassen der Anführungszeichen zu unerwünschtem Verhalten führen kann. Die Vereinfachungsergebnisse werden wie im Folgenden gezeigt auf der Kommandozeile ausgegeben:

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

Wenn die Option -z verwendet wird, werden die Vereinfachungsergebnisse abschließend mithilfe von Z3 daraufhin überprüft, ob sie semantisch äquivalent zu den ursprünglichen Ausdrücken sind. Dies hat keine Auswirkung auf die Kommandozeilenausgabe, solange der Algorithmus korrekt arbeitet:

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

Falls der Algorithmus ein falsches Ergebnis ausgeben würde, würde der folgende Fehler ausgelöst:

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

Zusätzlich kann eine numerische Validierung der Ergebnisse mit allen möglichen Eingaben bis zu einer bestimmten Bitanzahl durchgeführt werden. Dies wird mit der Option -v aktiviert, gefolgt von einer maximalen Bitanzahl der verwendeten Eingaben:

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

Auch im Falle eines falschen Ergebnisses könnte die Ausgabe wie folgt aussehen:

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

Die in den GAMBA-Ausgabeausdrücken auftretenden Konstanten können offensichtlich von der Anzahl der Bits abhängen, die für Konstanten sowie Variablen verwendet werden. Diese Anzahl beträgt standardmäßig $64$ und kann mit der Option -b festgelegt werden:

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

Standardmäßig werden die in der Ausgabe auftretenden Konstanten in der Darstellung angegeben, die so nahe wie möglich an Null liegt. Das heißt, im obigen Fall würde die Zahl -1 erhalten bleiben:

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

Dieses Verhalten kann geändert werden: Mit der Option -m wird eine Modulo-Reduktion von Konstanten aktiviert:

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

Dann liegen die Konstanten für eine Anzahl $b$ von Bits immer zwischen $0$ und $2^b-1$. Daher würde der obige Aufruf die folgende Ausgabe ergeben:

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

Vereinfachen einzelner linearer Ausdrücke

Die Datei src/simplify.py ist dazu gedacht, von src/simplify_general.py genutzt zu werden, kann aber auch isoliert ausgeführt werden. Verwenden Sie die Kommandozeilenoption -h, um die verfügbaren Einstellungen zu sehen.

Reproduktion der Experimente

Die Datei experiments/tests.py kann verwendet werden, um die in der Arbeit angegebenen Experimente zu reproduzieren. Standardmäßig führt es GAMBA auf 6 Datensätzen aus:

root@kitploit:~
python3 experiments/tests.py

Alternativ kann es angewiesen werden, stattdessen SiMBA auszuführen, und zwar mit der Option --linear oder -l. In diesem Fall wird SiMBA nur auf MBAs mit linearen Grundwahrheiten ausgeführt:

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

Numerische Prüfungen oder Prüfungen mit Z3 können über die Optionen --check (-c) bzw. --z3 (-z) aktiviert werden.

Die Ausdrücke werden je nach Erfolg der Vereinfachung oder Verifikation kategorisiert:

  • ok: Ausdrücke, die zu exakt demselben Ergebnis wie die entsprechenden Grundwahrheiten vereinfacht werden
  • okz: Ausdrücke, deren Äquivalenz zu den Grundwahrheiten mit dem Algorithmus verifiziert werden kann (indem der Ausdruck abzüglich des Grundwahrheiten-Ausdrucks zu 0 vereinfacht wird)
  • z3: Ausdrücke, deren Äquivalenz zu den Grundwahrheiten mit Z3 verifiziert werden kann
  • to: Ausdrücke, bei denen der Algorithmus in ein Timeout lief
  • ng: Ausdrücke, bei denen Vereinfachung und Verifikation nicht erfolgreich waren
  • nc: Ausdrücke, für die der Algorithmus – falls SiMBA verwendet wird – nicht ausgeführt wurde, da die Grundwahrheiten nicht linear sind
  • err: Ausdrücke, bei denen ein Fehler aufgetreten ist

Datensätze

Datensätze zur Verwendung mit experiments/tests.py finden Sie im Verzeichnis experiments/datasets/.

  • neureduce.txt: Verwenden Sie Option -d 0; von https://github.com/fvrmatteo/NeuReduce/tree/master/dataset/linear/test/test_data.csv (mit einigen Korrekturen)
  • mba_obf_linear.txt: Verwenden Sie Option -d 1; von https://github.com/nhpcc502/MBA-Obfuscator/tree/main/samples/ground.linear.poly.txt (1000 lineare Ausdrücke)
  • mba_obf_nonlinear.txt: Verwenden Sie Option -d 2; von https://github.com/nhpcc502/MBA-Obfuscator/tree/main/samples/ground.linear.poly.txt und https://github.com/nhpcc502/MBA-Obfuscator/tree/master/samples/ground.linear.nonpoly.txt (je 500 Ausdrücke; mit einigen Korrekturen für nichtpolynomiale Ausdrücke)
  • syntia.txt: Verwenden Sie Option -d 3; von MBA-Flatten, dataset/dataset_syntia.txt
  • mba_flatten.txt: Verwenden Sie Option -d 4; von MBA-Flatten, die ersten 1000 Ausdrücke aus dataset/pldi_dataset_linear_MBA.txt, dataset/pldi_dataset_poly_MBA.txt, dataset/pldi_dataset_nonpoly_MBA.txt
  • qsynth_ea.txt: Verwenden Sie Option -d 5; von https://github.com/werew/qsynth-artifacts/tree/master/datasets/syntia/ground_truth.json

Zusätzlich werden die folgenden Bonus-Datensätze im Verzeichnis experiments/datasets/bonus/ bereitgestellt (nicht in der Veröffentlichung abgedeckt):

  • loki_tiny.txt: Verwenden Sie Option -d 6; von https://github.com/RUB-SysSec/loki/tree/main/experiments/experiment_10_mba_formula/data, 25000 MBAs, die von der LOKI-Arbeit für einfache Grundwahrheiten-Ausdrücke ($x+y$, $x-y$, $x\&y$, $x|y$, $x^y$) bis zu einer Tiefe von 5 erzeugt wurden

Format von MBAs

Die Anzahl der Variablen ist theoretisch unbegrenzt, aber natürlich steigt die Laufzeit mit der Variablenanzahl. Es gibt keine strenge Einschränkung bei der Schreibweise von Variablen. Sie müssen mit einem Buchstaben beginnen und können Buchstaben, Zahlen und Unterstriche enthalten. Z. B. wären die folgenden Variablennamen alle in Ordnung:

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

Die folgenden Operatoren werden unterstützt, geordnet nach ihrer Priorität in Python:

  • $**$: Potenzierung
  • $\mathord{\sim}$, $-$: bitweise Negation und unäres Minus
  • $*$: Produkt
  • $+$, $-$: Summe und Differenz
  • <<: Linksverschiebung
  • &: Konjunktion
  • $\mathbin{^\wedge}$: exklusive Disjunktion
  • $|$: inklusive Disjunktion

In den Eingabeausdrücken kann Leerraum verwendet werden. Z. B. kann der Ausdruck "x+y" alternativ als "x + y" geschrieben werden.

Bitte beachten Sie die Priorität der Operatoren und verwenden Sie bei Bedarf Klammern! Z. B. sind die Ausdrücke $1 + (x|y)$ und $1 + x|y$ nicht äquivalent, da $+$ eine höhere Priorität als $|$ hat. Beachten Sie, dass Letzterer nicht einmal ein lineares MBA ist.

Abhängigkeiten

Z3

Der SMT-Löser Z3 wird von simplify_general.py und simplify.py benötigt, wenn die optionale Verifikation vereinfachter Ausdrücke verwendet wird. Wenn diese Option nicht verwendet wird, wird kein Fehler ausgelöst, selbst wenn Z3 nicht installiert ist.

Z3 installieren:

  • vom GitHub-Repository: https://github.com/Z3Prover/z3
  • unter Debian: sudo apt-get install python3-z3

NumPy

Das wissenschaftliche Rechenpaket NumPy wird aus Bequemlichkeit benötigt, ist aber für den Betrieb nicht wirklich wesentlich. Hinweis: Für numpy.quantile wird mindestens Version 1.15.0 benötigt.

NumPy installieren:

  • vom GitHub-Repository: https://github.com/numpy/numpy.git
  • unter Debian: sudo apt-get install python3-numpy

Lizenz

Copyright (c) 2023 Denuvo GmbH, veröffentlicht unter GPLv3.

Kontakt

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