Binary Analysis 01 · バイナリ解析とは何か — 目的・作法・ワークフロー

Chapter 01

バイナリ解析とは何か — 目的・作法・ワークフロー

この章のゴール.

「フラッシュの中身を読む」作業が、何を知りたくて、どの順で、何に気をつけて行うものかを説明できるようになること。 ダンプを手に入れた直後にやるべき 5 つの手順を覚えること。

1. バイナリ解析が必要になる場面

バイナリ解析とは、ソースコードや仕様書に頼らず、メモリやファイルの中身(バイト列)そのものを読んで意味を復元する作業である。 組み込み開発では、次の場面で必ず必要になる。

場面知りたいこと対象
現場で壊れた機器の調査設定はどう残っているか。ログに何が記録されたか。フラッシュのどこが壊れたかNVM3・NVS などの設定領域、ログ領域
更新が失敗する書き込んだイメージは正しいか。ヘッダ・署名・スロットの状態はELF、HEX、MCUboot のヘッダとトレーラ
セキュリティの自己監査鍵や証明書が平文で残っていないか。デバッグ用の文字列が残っていないかフラッシュ全域
古い製品の保守ソースが失われた・ビルド環境が再現できないファームウェアの中身を知るELF、生バイナリ、逆アセンブル
相互運用他社機器のファイル形式・通信フォーマットを理解する設定ファイル、ダンプ
不具合の再現RAM の状態(スタック、ヒープ、タスク)を止まった瞬間に読むRAM ダンプ

共通するのは、「バイト列には必ず構造がある」ということである。 書いた人間(またはコンパイラ・ライブラリ)は、意味のある形でバイトを並べた。 本編は、その構造を対象ごとに読み解く手順と、対象を問わず使える読み方の基礎を扱う。

解析対象と、知りたいことファームウェアの入れ物ELF / HEX / Cortex-M / MCUboot / FS。何が、どこに、どう配置されるかデータ領域NVM3 / NVS / ログ。設定・記録・秘密がどう残るか実行ファイルとメモリLinux イメージ、機械語、RAM の状態共通の前提バイト列には必ず構造がある書いた人間(またはコンパイラ・ライブラリ)が、意味のある形でバイトを並べた。その構造を対象ごとに復元する更新の失敗、設定の化け、秘密の漏れ、古い製品の保守、相互運用、不具合の再現——どれも「バイト列の意味を復元する」作業に帰着する
対象は「入れ物・データ・実行ファイル」の 3 種。共通するのは「構造を復元する」こと

2. 法と倫理 — 先に決めておくこと

バイナリ解析の技術は、自分の製品を調べるときも、他人の製品を調べるときも同じである。 だから始める前に立場を確認する。

本編の例はすべて自分の製品を調べるという前提で書く。

3. ワークフロー — ダンプを手にしてからの 5 手順

どんな対象でも、最初の 5 手順は同じである。

手順 1: 証拠を固定する

sha256sum dump.bin > dump.bin.sha256
chmod 444 dump.bin
cp dump.bin work.bin

これを怠ると、後で「解析中にファイルを壊したのか、最初から壊れていたのか」が分からなくなる。

手順 2: 全体を眺める

ls -l work.bin
binwalk -E work.bin          # エントロピーのグラフ
strings -n 8 work.bin | head -100
binwalk work.bin             # マジックナンバーの検索

手順 3: 地図を描く

アドレス範囲ごとに「何が入っているか」の表を作る。これをメモリマップと呼ぶ。 最初は粗くてよい。作業が進むにつれて埋めていく。

オフセット大きさ内容(推定)根拠
0x0000032 KBブートローダベクタテーブルあり、"MCUBOOT" 文字列
0x08000448 KBアプリケーションMCUboot ヘッダ magic、ベクタテーブル
0x7800032 KB設定領域4 KB ごとに繰り返す構造、消去カウンタ
0x7E0008 KB空き0xFF

チップのリファレンスマニュアルのメモリマップと、リンカスクリプト(あれば)が最良の手がかりである。

手順 4: 対象ごとに構造を解く

地図の各領域について、本編の該当する章の手順で構造を復元する。 「まず既知の形式を疑う」——自分で全部解く前に、そのライブラリの公式ツール(commander nvm3 parse、nvs_partition_gen、imgtool、littlefs-python)があるか確かめる。

手順 5: 記録し、再現可能にする

ダンプを手にしてからの 5 手順① 固定ハッシュ・由来を記録。原本は読み取り専用② 眺めるサイズ・エントロピー・文字列・マジック③ 地図アドレス範囲ごとに何があるか(メモリマップ)④ 解く各領域を対象ごとの手順で。公式ツール優先⑤ 記録表・図・スクリプトにして再現可能に「まず既知の形式を疑う」自分で全部解く前に、そのライブラリの公式ツール(commander / imgtool / littlefs-python …)を試す。ライブラリのソースが最強の仕様書対象が変わっても、この 5 手順は同じ
固定・眺める・地図・解く・記録。どんな対象でも最初の 5 手順は共通

4. 前提となる心構え

5. 本編の構成

部章対象
I. 基礎と道具01〜04心構え、道具、バイト列の読み方、ダンプの取り方
II. ファームウェアの入れ物05〜09ELF、HEX / SREC、Cortex-M イメージ、MCUboot、ファイルシステム
III. データ領域10〜14NVM3、NVS 系、ログ、秘密情報、圧縮と暗号化の見分け
IV. 実行ファイルと動的解析15〜17Linux イメージ、逆アセンブル、動的解析
V. 応用18〜20差分と復元、自動化、ケーススタディ

6. 手を動かす

解析の手順を追う


この章のポイント