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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
SiMBA — 線形混合ブール算術式の効率的な難読化解除 | Kitploit
ツール/GitHubGitHub/denuvosoftwaresolutions/simba
静的分析リバースエンジニアリング暗号化バイナリ解析論文と研究学習と教育
GitHubdenuvosoftwaresolutions/simba

SiMBA

線形混合ブール算術式の効率的な難読化解除

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

人気

すべて見る →

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

すべてのツールを探索

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

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

SiMBA

SiMBAは、線形混合ブール算術式(MBA)の簡約のためのツールです。MBA-BlastやMBA-Solverと同様に、線形MBAがゼロと一の集合上の値によって完全に決定されるという考えに基づく完全に代数的なアプローチを使用していますが、そのためには1ビット空間への変換が不要であるという新しい洞察を活用しています。

これは以下の論文に基づいています:

root@kitploit:~
@inproceedings{simba2022,
    author = {Reichenwallner, Benjamin and Meerwald-Stadler, Peter},
    title = {Efficient deobfuscation of linear mixed Boolean-arithmetic expressions},
    year = {2022},
    month = nov,
    address = {Los Angeles, CA, USA},
    date = {November 7 - 11, 2022},
    booktitle = {Proceedings of the CheckMATE 2022 workshop, co-located with the ACM Conference on Computer and Communication Security, CCS'22},
    pages = {19--28},
    doi = {10.1145/3560831.3564256},
    publisher = {ACM},
    howpublished = {\url{https://arxiv.org/abs/2209.06335}}
}

プレゼンテーションのスライドとビデオ録画はこちらからご覧いただけます。また、ACMからも入手できます。

内容

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

  • 単一の線形MBAの簡約用の simplify.py
  • ファイルに含まれる一連の線形MBAの簡約と、同じファイルに含まれる対応するより単純な式との比較による検証用の simplify_dataset.py

さらに、check_linear_mba.py プログラムを使用して、式が線形MBAを表すかどうかを確認できます。

使用方法

単一の式の簡約

単一の式 expr を簡約するには、次を使用します。

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

あるいは、複数の式を一度に簡約することもできます。例:

root@kitploit:~
python3 src/simplify.py "x+x" "a&a"

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

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

デフォルトでは、入力式が線形MBAであるかどうかのチェックは実行されません。このチェックは、オプション -l を使用して任意に有効にできます:

root@kitploit:~
python3 src/simplify.py "x*x" -l

$x*x$ は線形MBAではないため、この場合には次の出力が表示されます:

root@kitploit:~
*** Expression x*x
Error: Input expression may be no linear MBA: x*x

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

root@kitploit:~
python3 src/simplify.py "x*x" -z

これにより、次のエラーが発生します:

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

SiMBAの出力式に現れる定数は常に非負であるため、それらは定数および変数に使用されるビット数に依存する可能性があります。この数はデフォルトで $64$ であり、オプション -b を使用して設定できます:

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

$b$ ビットの場合、出力に現れる定数は常に $0$ から $2^b-1$ の範囲にあります。したがって、上記の呼び出しでは次の出力が得られます:

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

ファイルからの式の簡約と検証

パス path_to_file のファイルに格納された式を簡約するには、次を使用します:

root@kitploit:~
python3 src/simplify_dataset.py -f path_to_file

つまり、ファイルはオプション -f を使用して指定する必要があります。ファイルの各行には、複雑な式とそれと等価なより単純な式をカンマで区切って含める必要があります。例:

example-expressions.txt:

root@kitploit:~
(x&y)+(x|y), x+y
(x|y)-(~x&y)-(x&~y), x&y
-(a|~b)+(~b)+(a&~b)+b, a^b
2*(s&~t)+2*(s^t)-(s|t)+2*~(s^t)-~t-~(s&t), s

各行について、複雑な式と単純な式の両方が簡約され、最終的に比較されます。後者(単純な式)を簡約する理由は、検証結果を空白、因子や加数の順序などに依存しないようにするためです。

simplify.py と同様に、線形性チェックと正しい簡約のチェックは、それぞれオプション -l と -z を使用して有効にでき、ビット数はオプション -b を使用して指定できます。指定されたファイルに含まれる式のうち、特定の最大数に対してのみSiMBAを実行したい場合は、この最大数をオプション -r で指定できます:

root@kitploit:~
python3 src/simplify_dataset.py -f some_file.txt -r 2

some_file.txt に上記の式が含まれている場合、最初の2つのみが簡約されます:

root@kitploit:~
Simplify expressions from data/some_file.txt ...
  * total count: 2
  * verified: 2
  * equal: 2
  * average duration: 0.00014788552653044462

いずれの場合も、出力は次の情報を提供します:

  • 入力内の式の総数
  • 簡約後にZ3を使用して対応するより単純な式と等価であることを検証できた式の数(簡約結果がすでにまったく同じ文字列表現を持つ場合を除く)
  • 対応する単純な式とまったく同じ式に簡約された式の数
  • 平均実行時間(秒)

Z3を使用した正しい簡約の任意の検証は実行時間に加算されることに注意してください。一方、複雑な式とより単純な式のペアの簡約結果の比較は実行時間に加算されません。

デフォルトでは、簡約結果は出力されず、これらの統計のみが表示されます。前者に関する情報が必要な場合は、オプション -v を使用できます:

root@kitploit:~
python3 src/simplify_dataset.py -f some_file.txt -v

すると、次の出力が表示されます:

root@kitploit:~
Simplify expressions from data/some_file.txt ...

    *** 1 groundtruth x+y, simplified x+y => equal: True, verified: True
    *** 2 groundtruth x&y, simplified x&y => equal: True, verified: True
    *** 3 groundtruth a^b, simplified a^b => equal: True, verified: True
    *** 4 groundtruth s, simplified s => equal: True, verified: True

  * total count: 4
  * verified: 4
  * equal: 4
  * average duration: 0.00016793253598734736

もう1つのオプション -e は、$b$ をビット数として、$1$ から $2^b-1$ の範囲のランダムな整数 $a,b$ によるアフィン関数 $f(x) = ax+b$ ですべての式の出力をエンコードする機能を提供します:

root@kitploit:~
python3 src/simplify_dataset.py -f some_file.txt -v -e

もちろん、同じ関数が同じ行の式のペアに適用されます。これにより、次のような出力が得られます:

root@kitploit:~
Simplify expressions from data/some_file.txt ...

    *** 1 groundtruth 10623056950310032687+5038261596809828791*x+5038261596809828791*y, simplified 10623056950310032687+5038261596809828791*x+5038261596809828791*y => equal: True, verified: True
    *** 2 groundtruth 15181401701264988765+3962868592131193124*(x&y), simplified 15181401701264988765+3962868592131193124*(x&y) => equal: True, verified: True
    *** 3 groundtruth 6812440940417974076+11894131080657788315*(a^b), simplified 6812440940417974076+11894131080657788315*(a^b) => equal: True, verified: True
    *** 4 groundtruth 4558303267887122851+10271005790757592209*s, simplified 4558303267887122851+10271005790757592209*s => equal: True, verified: True

  * total count: 4
  * verified: 4
  * equal: 4
  * average duration: 0.00019435951253399253

再現性

論文に記載された実験の一部を再現するには、data/ ディレクトリに含まれる任意のデータセットファイルを使用できます。次の各関数 $e_1,\ldots, e_5$ について、$2$、$3$、または $4$ 変数を使用した $1,000$ 個の等価な線形MBAのデータセットが提供されています:

  • $e_1(x,y) = x+y$
  • $e_2 = 49,374$
  • $e_3(x) = 3,735,936,685, x + 49,374$
  • $e_4(x,y) = 3,735,936,685, (x\mathbin{^\wedge}y) + 49,374$
  • $e_5(x) = 3,735,936,685\cdot \mathord{\sim} x$

$e_1$ については、$5$ から $7$ 変数の追加データセットも提供されています。これらのMBAは、2007年にZhouらによって記述され、論文でも説明されている方法に基づくアルゴリズムを使用して生成されています。

これらのデータセットは $b=64$ ビット用に生成されていることに注意してください。異なるビット数の場合、$e_i$ との等価性は保証されません。

さらなる実験の再現については、それぞれ MBA-Solverリポジトリ と NeuReduceリポジトリ が提供するデータセットを参照してください。

線形性の確認

check_linear_mba.py ファイルは簡約器によって使用されますが、独自のインターフェースも提供します。例:

root@kitploit:~
python3 src/check_linear_mba.py "x+x" "x*x"

コマンドライン引数で渡されたすべての式をチェックします。この場合、次の出力が得られます:

root@kitploit:~
*** Expression x+x
*** +++ valid
*** Expression x*x
*** --- not valid

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ですらないことに注意してください。

依存関係

SMTソルバー Z3 が必要です

  • simplify_dataset.py では、簡約された式が対応する単純な式と等価であることを検証するために必要です。
  • simplify.py では、簡約式の任意検証を使用する場合に必要です。このオプションを使用しない場合、Z3がインストールされていなくてもエラーは発生しません。

Z3のインストール:

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

ライセンス

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

連絡先

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