
ファームウェアリバースエンジニアリングワークショップ
このリポジトリには、ScapyCon Automotive 2025 で発表された Emproof のファームウェアリバースエンジニアリングワークショップ向けのスライドとハンズオン教材が含まれています。このワークショップは、セキュリティ経験がほとんどない技術者を対象としており、実践的で自己完結型のタスクを通じて基礎を教えます。トピックは次のとおりです。
もし興味があれば、追加の演習と録画セッションを含む Emproof テクニカルウェビナーシリーズ もチェックしてください。
ワークショップの内容は、Tim Blazytko が設計・企画し、Simran Kathpalia がサポートしました。
環境をセットアップするには、リポジトリをクローンしてください:
git clone https://github.com/emproof-com/workshop_firmware_reverse_engineering
cd workshop_firmware_reverse_engineering
いくつかのタスクでは、AArch64 Linux 実行環境が必要です。一般的なツール (例: GNU Binutils、Binwalk) がプリインストールされた Kali Linux ベースの Docker コンテナ を提供しています。これにより、ホストの CPU アーキテクチャに関係なく、Linux、Windows、macOS 間で環境を簡単に統一できます。コンテナを起動してシェルに入るには、次を実行してください:
./docker_run.sh
注: 初回実行時は、イメージのビルドに時間がかかる場合があります。
注 (アーキテクチャ): Docker Compose サービスは
platform: "linux/arm64"を設定します。
x86_64 ホスト (Intel macOS/Windows/Linux) では、Docker Desktop がエミュレーションでイメージを実行するため、最初のビルドと起動が遅くなる場合があります — これは想定どおりです。ネイティブな ARM64 ホスト (Apple Silicon、ARM サーバー) ではネイティブに実行されるため高速です。
注: Docker コンテナは ARMv7 (armhf) バイナリも実行できます。イメージには armhf ランタイム (動的ローダー + ライブラリ) をインストールし、起動スクリプトで
aarch64とarmの両方の binfmt ハンドラを登録しています。
さらに、インタラクティブなリバースエンジニアリングタスクのために、ホストに次のグラフィカルツールをインストールしてください (これらはコンテナには含まれません):
どちらのツールも Windows、Linux、macOS で利用できます。
注: Binary Ninja Free は AArch64 をサポートしていません。AArch64 解析には Ghidra (またはライセンス版 Binary Ninja) を使用してください。そのため、いくつかのラボでは Binary Ninja Free 専用の ARMv7 コンパニオン バイナリ (
*.armv7) を同梱しています。これらは同じコンテナ内でも実行できます。
各タスクは tasks/<name>/ 内に自己完結しており、以下を含みます:
samples/ — 演習で使用するバイナリ (場合によってはソース)task.md — ステップバイステップの手順とヒントを含む課題タスクは個別に試すこともできますが、難易度を上げながら新しいテクニックを段階的に紹介する推奨順序 (下記) を提供しています。ほとんどのサンプルは ARMv7 (Thumb/ARM32) または AArch64 を対象としています。関連する場合、タスクのノートにはアーキテクチャ、必要なツール、特別なランタイム要件が明記されています。
tasks/hello_world: ELF ファイルとメタデータ解析の基本; Ghidra / Binary Ninja の最初のステップ。
tasks/license_check: ハードコードされたシークレットの抽出 / 機能のアンロック; 検証をバイパスするための基本的なパッチ適用 (クラッキング)。
tasks/game: シンプルな数当てゲーム; ロジックを理解し、トライアル版とフル版をクラックする。
tasks/keygenning_1: ライセンス検証をリバースし、有効なシリアルを生成する最小限のキージェネレータを作成する。
tasks/keygenning_2: もう少し高度なキージェネレーションタスク (ソルト/キー、16進エンコーディング)。
tasks/string_encryption: 暗号化された文字列を含むバイナリ (マルウェアで一般的); 復号ルーチンを特定し、文字列を静的に復元する。
tasks/mirai: 文字列復号ルーチンを使用する組み込みマルウェア; より大きなコードベースを調査し、興味深い構造を特定し、難読化された文字列を扱う。
tasks/embedded_linux_1: ファイルシステム付き組み込み Linux ファームウェア; 展開して調査し、Linux ログイン情報をクラックする (CTF スタイル)。
tasks/embedded_linux_2: 同様だが、そこにあるべきではない隠されたバイナリを見つけて分析する。
tasks/car_demo: ベアメタルファームウェア解析: アーキテクチャ、ボード、メモリマップ、ツールチェーンアーティファクトを特定; Wi-Fi 認証情報とプロトコルエンドポイントを抽出する。
tasks/iot_diag: 診断ツールのベアメタルファームウェアダンプ; データシートからメモリレイアウトを再現し、診断モードをアンロックするパスワードを見つける。
tasks/crypto_detection: ハードコードされた AES キーで暗号化操作を実行する AArch64 バイナリ; EVP 呼び出しを特定し、キー/IV を遡ってプログラムなしで復号する。
特に記載がない限り、このリポジトリ内のすべてのワークショップ教材は GNU General Public License, version 2 (GPL-2.0) の下でライセンスされています。全文については LICENSE を参照してください。
一部の サードパーティ / 外部ソースのサンプル は GPL の対象外であり、分析/教育専用 として提供されています (再配布禁止)。これらは次のとおりです:
注: サブディレクトリに独自のライセンスファイルまたはヘッダーが含まれている場合、そのライセンスがそのサブディレクトリの内容に対して優先されます。
tasks/license_check_anti_patching: コードチェックサムによるアンチパッチング; CRC ガードを理解し、それをバイパスする方法を学ぶ。
tasks/fibonacci_obfuscation: クリーンな Fibonacci 実装と難読化された Fibonacci 実装の比較 (スイッチフラット化、computed goto、オペーク述語、算術難読化、小規模 VM); テクニックを理解し、正規化する。