【ハンズオン4】バイナリパッチ¶
前提条件¶
- 仮想環境の起動が完了していること
- 【ハンズオン3】前半・後半が完了していること
手順¶
1. パッチを適用するアセンブリコードを決める¶
このハンズオンでは、パッチを適用して、LEDの点灯間隔を変更する。 まずは、変更するアセンブリコード(ニーモニックコード)を一つ決める。
点灯間隔はdelay(1000)のように、delay([1以上の数字])と記述されているはずである。
[1以上の数字]が即値として指定されている箇所を探し、そのアセンブリコードを変更の対象とする。
ただし、[1以上の数字]が大きな数字の場合、二つのアセンブリコードに分割されていることがあるので、注意する。
例えば、以下のようなコードでは、sleep(10)が呼ばれるので、#0x0aの部分をパッチの対象とする。
また、以下のようなコードでは、sleep(1000)が呼ばれるので、#0xfaもしくは#0x2をパッチの対象とする。
sleep(0xfa << 0x02)
note: シフト演算
- 左シフト(
<<): ビットを左にずらす。例えば、0x01 << 2は0x04になる。2ビット左シフトは4倍するのと同じ。 - 右シフト(
>>): ビットを右にずらす。例えば、0x04 >> 2は0x01になる。2ビット右シフトは4で割るのと同じ。
2. パッチを適用する¶
Ghidraにおいて、1.で決めたアセンブリコードを右クリックし、Patch Instructionを選択する。
該当コードが赤枠で囲まれるので、コードを変更しEnterを押下する。

変更後、疑似コードを確認し、意図した通りに変更されていることを確認する。

note: Enterキーを押下してもパッチが適用されない場合
Invalid instruction and/or prefixと表示されると適用できない。この場合、オペランドやオペコードが正しくない可能性がある。
特に以下の点を確認する。
- オペランドの値は一般に0~255(0x0~0xff)であること
- オペコードが正しいこと(例えば、
movsやmovなど) - オペコードのオペランドが正しいこと(例えば、即値を指定する場合は
#を付ける必要がある)
2. パッチしたファームウェアの保存¶
パッチを適用したファームウェアを保存する。
FileメニューからExport Program...を選択し、以下のように設定する。
| 項目 | 値 |
|---|---|
| Format | Raw Bytes |
| File Name | 任意のファイル名 (例: /home/kali/patched.bin) |
設定が完了したら、OKを押下する。すると、Export Result Summaryが表示されるので、OKを押下する。
ファームウェアが指定したパスに保存される。

3. ファームウェアの書込¶
パッチが適用されたファームウェア(patched.bin)を書き込む。
【ハンズオン1】ファームウェアの作成 第8節を参照。
(上記の手順ではxxxx.ino.binを書き込むが、本手順ではパッチしたファームウェア(patched.bin)を書き込むことに注意)
書き込み後、LEDの点滅間隔など挙動が変更されていることを確認する。