2025/11/08 11:49 Disassembling terabytes of random data with Zig and Capstone to prove a point

やあ、ロボ子。今日はちょっと面白い実験結果を見つけたのじゃ。

博士、こんにちは。どんな実験ですか?

ランダムなバイト列で、Thumb命令とDEFLATE圧縮されたThumb命令のどっちが出やすいかって実験なのじゃ。

Thumb命令ですか?組み込み系のアーキテクチャでよく使われるやつですね。

そうそう。で、結論から言うと、Thumb命令の方がランダムなバイト列に出やすいって結果が出たのじゃ!

へえ、それは意外ですね。圧縮されたデータよりも、命令の方が自然に出現しやすいとは。

そうなのじゃ。記事によると、Thumb命令はコード密度が高いから、ランダムなバイト列でも解釈されやすいらしいぞ。

なるほど。実験方法も面白いですね。Zigでランダムなバイト列を生成して、それを逆アセンブルするんですね。

そう。Capstoneってツールを使って逆アセンブルしてるのじゃ。128バイトのバッファだと、95%以上が有効なThumb命令として解釈される割合が約65%もあったらしいぞ。

すごい確率ですね!完全に逆アセンブルされる割合でも、圧縮・展開よりも10倍以上多いんですか。

その通り!2バイトのシーケンスだと、約89.3%が有効なThumb命令になるらしいのじゃ。

圧縮データが展開に失敗する原因は何だったんですか?

無効なDEFLATEメタデータが主な原因らしいぞ。つまり、ランダムなバイト列だと、DEFLATEの形式に合わないことが多いってことじゃな。

なるほど。この実験結果から、何か応用できることはありますか?

うむ。例えば、ファジングに応用できるかもしれないのじゃ。ランダムなバイト列を生成して、それをプログラムに入力してみる。Thumb命令として解釈される部分が多いほど、バグを見つけやすいかもしれないぞ。

確かに、それは面白いアイデアですね。あとは、マルウェア解析にも使えるかもしれません。難読化されたコードの中に、Thumb命令が隠されているかどうかを調べる、とか。

なるほど!ロボ子は頭が良いのじゃ!記事には、他のアーキテクチャでも同じような実験をしたって書いてあるぞ。命令の逆アセンブルはステートフルで、以前の命令に依存するアーキテクチャもあるらしい。

それは興味深いですね。命令の依存関係を考慮すると、また違った結果になるかもしれません。

今後の研究として、Thumbよりもコード密度が高いISAを調査したり、ランダムなバッファに出現する命令シーケンスの有用性を評価したりするみたいじゃ。

DEFLATEストリームのヘッダーを操作して、展開の可能性を最大化する方法も検討するんですね。

そうそう。しかし、10年前の48コアサーバーで、10億個の128バイトバッファの逆アセンブルと展開を約30分で実行したって言うから驚きじゃ。すごい計算パワーなのじゃ。

Capstoneでの動的メモリ割り当てがボトルネックになっているみたいですね。展開のみを行うスクリプトでは、約345MB/sのスループットが出ているんですね。

この記事、なかなか奥が深いじゃろ?

はい、とても勉強になりました。博士、ありがとうございました。

どういたしまして。最後に一つ、ロボ子にクイズじゃ!ランダムなバイト列で一番出現しやすいプログラミング言語は何かな?

えーと…、それはアセンブリ言語、ですか?

ブー!残念!正解は…、バグだ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。