【Python】バイナリ解析ツール – capstone, angr, pyelftools

Python
この記事は約6分で読めます。

こんにちは、JS2IIUです。
今回はバイナリ解析ツールを3種類紹介します。それぞれ基本的な使い方も紹介します。今回もよろしくお願いします。

1. はじめに

近年、ソフトウェアのリバースエンジニアリングやバイナリ解析は、マルウェア解析、脆弱性調査、CTF(Capture The Flag)など多岐にわたる分野で重要な役割を果たしています。Pythonは豊富な解析ライブラリを提供しており、複雑なバイナリ解析も手軽に実行できます。

本記事では、以下の3つの強力なPythonバイナリ解析ツールを紹介し、基本的な使い方を具体的なコードとともに解説します。

  • capstone:軽量かつ高速なディスアセンブラエンジン
  • angr:高度なシンボリック実行が可能なバイナリ解析フレームワーク
  • pyelftools:ELF形式のバイナリを解析するためのライブラリ

2. 解析ツールの概要

2.1 capstone

capstoneは、複数のCPUアーキテクチャに対応した逆アセンブラエンジンで、バイナリコードを人間が読めるアセンブリ命令に変換します。

  • 特徴
    • マルチプラットフォーム対応
    • ARM、x86、MIPSなど複数のアーキテクチャに対応
    • 高速かつ軽量

2.2 angr

angrは、静的・動的解析を組み合わせた強力なバイナリ解析フレームワークで、シンボリック実行を利用した制御フロー解析や脆弱性検出を行えます。

  • 特徴
    • バイナリのパス探索とシンボリック実行
    • 複雑な解析をPythonで記述可能
    • CTFでの問題解決にも有効

2.3 pyelftools

pyelftoolsは、ELF(Executable and Linkable Format)形式のバイナリファイルを解析するためのPythonライブラリで、メタデータ抽出や解析に特化しています。

  • 特徴
    • ELFヘッダー、セクション、シンボル情報の取得
    • デバッグ情報(DWARF)の解析
    • ELF形式の解析に特化

3. 各ツールのインストールと準備

以下のコマンドを実行して、必要なパッケージをインストールします。

Bash
pip install capstone angr pyelftools

4. 基本的な使い方とサンプルコード

4.1 capstoneの使い方

ここでは、capstoneを使ってx86のバイナリコードを逆アセンブルする例を示します。

Python
import capstone

# x86_64アーキテクチャのバイナリコード
CODE = b"\x55\x48\x8b\x05\xb8\x13\x00\x00"

# capstoneのインスタンスを作成
md = capstone.Cs(capstone.CS_ARCH_X86, capstone.CS_MODE_64)

print("Disassembly:")
for i, insn in enumerate(md.disasm(CODE, 0x1000)):
    print(f"0x{i + 0x1000:x}:    {insn.mnemonic} {insn.op_str}")

実行結果例:

Bash
Disassembly:
0x1000:    push    rbp
0x1001:    mov     rax, qword ptr [rip + 0x13b8]

4.2 angrの使い方

次に、angrを使ってバイナリの特定のパスを解析します。ここでは、入力に応じて異なる分岐を持つバイナリを解析します。

Python
import angr

# 解析対象のバイナリパス
binary_path = "./test_binary"

# プロジェクトを作成
proj = angr.Project(binary_path, auto_load_libs=False)

# エントリーポイントから探索開始
state = proj.factory.entry_state()
simgr = proj.factory.simulation_manager(state)

# 成功条件(特定のアドレスに到達)
target_address = 0x4006ed
simgr.explore(find=target_address)

if simgr.found:
    solution_state = simgr.found[0]
    print("Solution:", solution_state.posix.dumps(0))
else:
    print("No solution found")

注意: 解析するバイナリは事前に用意しておく必要があります。

4.3 pyelftoolsの使い方

pyelftoolsを使ってELFファイルのシンボル情報を抽出します。

Python
from elftools.elf.elffile import ELFFile

# ELFファイルを開く
with open("/bin/ls", "rb") as f:
    elf = ELFFile(f)

    # シンボルテーブルを探す
    for section in elf.iter_sections():
        if section.header["sh_type"] == "SHT_SYMTAB":
            print("Symbol Table:")
            for symbol in section.iter_symbols():
                print(f"{symbol.name}: {symbol.entry.st_value:#x}")

5. 応用例

5.1 CTFでの活用

  • capstoneは、バイナリの逆アセンブルにより命令を解析。
  • angrを使えば、複雑なパス解析や条件分岐の攻略が可能。
  • pyelftoolsは、ELFファイルから隠されたシンボルを特定。

5.2 実際のバイナリ解析

  • マルウェア解析に利用し、不審な挙動を特定。
  • 独自のバイナリ形式を解析し、リバースエンジニアリングに応用。

6. まとめと参考リンク

6.1 まとめ

  • capstoneは、軽量で高速な逆アセンブラ。
  • angrは、強力なシンボリック実行とパス解析。
  • pyelftoolsは、ELFフォーマット解析に最適。

6.2 参考リンク

最後に、書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

コメント

タイトルとURLをコピーしました