Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/denuvosoftwaresolutions/gamba
静的分析リバースエンジニアリングマルウェア分析暗号化バイナリ解析
GitHubdenuvosoftwaresolutions/gamba

GAMBA

一般的な混合ブール算術式の簡約化: GAMBA

リポジトリを見る
2383432年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

GAMBA

GAMBA は、混合ブール演算(MBA)式を簡略化するためのツールです。 GAMBA は General Advanced Mixed Boolean Arithmetic simplifier の略です。 線形代数に基づく簡略化器 SiMBA を使用して、非線形の入力 MBA に含まれる線形部分式を反復的に簡略化します。全体として、その中核となる要素は以下のとおりです。

  • 抽象構文木(AST)の使用
  • (自明な、およびより高度な)変換を適用することによる線形部分式の分離
  • 簡略化可能な線形部分式を構築する可能性を高めるためのリファクタリング
  • SiMBA を用いた線形部分式の簡略化
  • ビット演算内の非自明な定数と算術演算を一時的に取り除くための代入ロジック

GAMBA は次の 論文 に基づいています。発表で使用された スライド も参照してください。

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

内容

2つの主要なプログラムが提供されています:

  • simplify_general.py は、一般的な MBA の簡略化用
  • simplify.py は、線形 MBA の簡略化用

さらに、論文に記載された結果を再現するためのテストスクリプトも提供されています。

使用方法

単一の一般的な式の簡略化

単一の式 expr を簡略化するには、次のコマンドを使用します:

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

または、複数の式を一度に簡略化することもできます。例:

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

実際には、オプションではない各コマンドライン引数は簡略化する式と見なされます。引用符を省略すると、意図しない動作を引き起こす可能性があることに注意してください。簡略化結果は、次のようにコマンドラインに出力されます:

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

オプション -z を使用すると、簡略化結果が Z3 を使用して元の式と意味的に等価であることが最終的に検証されます。アルゴリズムが正しく動作する限り、コマンドライン出力には影響しません:

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

アルゴリズムが誤った結果を出力した場合は、次のエラーが発生します:

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

さらに、特定のビット数までのすべての可能な入力を用いた結果の数値検証を実行できます。これは、オプション -v を使用し、その後に使用する入力の最大ビット数を指定することで有効になります:

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

誤った結果の場合も、出力は次のようになることがあります:

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

GAMBA の出力式に現れる定数は、当然ながら変数だけでなく定数に使用されるビット数にも依存します。この数はデフォルトで $64$ であり、オプション -b で設定できます:

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

デフォルトでは、出力に現れる定数は、可能な限りゼロに近い表現で報告されます。つまり、上記の例では、-1 という数値のままになります:

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

この動作は変更できます: オプション -m を使用すると、定数のモジュロ削減が有効になります:

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

この場合、ビット数 $b$ に対して、定数は常に $0$ 以上 $2^b-1$ 以下になります。したがって、上記の呼び出しは次の出力になります:

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

単一の線形式の簡略化

ファイル src/simplify.py は src/simplify_general.py によって利用されることを意図していますが、単独で実行することもできます。利用可能な設定を確認するには、コマンドラインオプション -h を使用してください。

実験の再現

ファイル experiments/tests.py を使用して、論文に記載された実験を再現できます。デフォルトでは、6つのデータセットに対して GAMBA を実行します:

root@kitploit:~
python3 experiments/tests.py

または、オプション --linear または -l を使用して、代わりに SiMBA を実行するように指示することもできます。その場合、SiMBA は線形のグラウンドトゥルースを持つ MBA に対してのみ実行されます:

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

数値チェックまたは Z3 を使用したチェックは、それぞれオプション --check (-c) または --z3 (-z) で有効にできます。

式は、簡略化または検証の成否に応じて分類されます:

  • ok: 対応するグラウンドトゥルースと完全に同じ結果に簡略化された式
  • okz: アルゴリズムを使用してグラウンドトゥルースとの等価性を検証できる式(式からグラウンドトゥルース式を引いたものを 0 に簡略化することによる)
  • z3: Z3 を使用してグラウンドトゥルースとの等価性を検証できる式
  • to: アルゴリズムがタイムアウトになった式
  • ng: 簡略化と検証が成功しなかった式
  • nc: SiMBA を使用する場合、グラウンドトゥルースが線形でないためアルゴリズムが実行されなかった式
  • err: エラーが発生した式

データセット

experiments/tests.py で使用するデータセットは、ディレクトリ experiments/datasets/ にあります。

  • neureduce.txt: オプション -d 0 を使用; https://github.com/fvrmatteo/NeuReduce/tree/master/dataset/linear/test/test_data.csv から(いくつかの修正を適用)
  • mba_obf_linear.txt: オプション -d 1 を使用; https://github.com/nhpcc502/MBA-Obfuscator/tree/main/samples/ground.linear.poly.txt から(1000個の線形式)
  • mba_obf_nonlinear.txt: オプション -d 2 を使用; https://github.com/nhpcc502/MBA-Obfuscator/tree/main/samples/ground.linear.poly.txt および https://github.com/nhpcc502/MBA-Obfuscator/tree/master/samples/ground.linear.nonpoly.txt から(それぞれ500個の式。非多項式の式にはいくつかの修正を適用)
  • syntia.txt: オプション -d 3 を使用; MBA-Flatten の dataset/dataset_syntia.txt から
  • mba_flatten.txt: オプション -d 4 を使用; MBA-Flatten の dataset/pldi_dataset_linear_MBA.txt、dataset/pldi_dataset_poly_MBA.txt、dataset/pldi_dataset_nonpoly_MBA.txt の最初の1000式から
  • qsynth_ea.txt: オプション -d 5 を使用; https://github.com/werew/qsynth-artifacts/tree/master/datasets/syntia/ground_truth.json から

さらに、以下のボーナスデータセットがディレクトリ experiments/datasets/bonus/ に提供されています(出版物では取り上げられていません):

  • loki_tiny.txt: オプション -d 6 を使用; https://github.com/RUB-SysSec/loki/tree/main/experiments/experiment_10_mba_formula/data から、LOKI 論文によって単純なグラウンドトゥルース式($x+y$, $x-y$, $x\&y$, $x|y$, $x^y$)用に生成された25000個のMBA(深さ5まで)

MBA の形式

変数の数は理論上無制限ですが、もちろん実行時間は変数の数に応じて増加します。変数の表記に強い制限はありません。変数は文字で始まる必要があり、文字、数字、アンダースコアを含めることができます。例えば、次の変数名はすべて問題ありません:

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

次の演算子がサポートされており、Python での優先順位順に並んでいます:

  • $**$: べき乗
  • $\mathord{\sim}$, $-$: ビット否定と単項マイナス
  • $*$: 積
  • $+$, $-$: 和と差
  • <<: 左シフト
  • &: 論理積
  • $\mathbin{^\wedge}$: 排他的論理和
  • $|$: 論理和

入力式では空白を使用できます。例えば、式 "x+y" は "x + y" と書くこともできます。

演算子の優先順位を尊重し、必要に応じて括弧を使用してください! 例えば、式 $1 + (x|y)$ と $1 + x|y$ は、$+$ が $|$ よりも優先順位が高いため、等価ではありません。後者は線形 MBA ですらないことに注意してください。

依存関係

Z3

SMTソルバー Z3 は、簡略化された式のオプション検証を使用する場合に simplify_general.py と simplify.py によって必要とされます。このオプションを使用しない場合、Z3 がインストールされていなくてもエラーは発生しません。

Z3 のインストール:

  • Github リポジトリから: https://github.com/Z3Prover/z3
  • Debian の場合: sudo apt-get install python3-z3

NumPy

科学計算パッケージ NumPy は怠惰のため必要ですが、動作にはそれほど必須ではありません。 注: numpy.quantile には少なくともバージョン 1.15.0 が必要です。

NumPy のインストール:

  • Github リポジトリから: https://github.com/numpy/numpy.git
  • Debian の場合: sudo apt-get install python3-numpy

ライセンス

Copyright (c) 2023 Denuvo GmbH、GPLv3 の下で公開されています。

連絡先

  • Benjamin Reichenwallner: benjamin(dot)reichenwallner(at)denuvo(dot)com
  • Peter Meerwald-Stadler: peter(dot)meerwald(at)denuvo(dot)com
ツールをダウンロード