コンテンツにスキップ

【ハンズオン4】バイナリパッチ

前提条件

  • 仮想環境の起動が完了していること
  • 【ハンズオン3】前半・後半が完了していること

手順

1. パッチを適用するアセンブリコードを決める

このハンズオンでは、パッチを適用して、LEDの点灯間隔を変更する。 まずは、変更するアセンブリコード(ニーモニックコード)を一つ決める。

点灯間隔はdelay(1000)のように、delay([1以上の数字])と記述されているはずである。 [1以上の数字]が即値として指定されている箇所を探し、そのアセンブリコードを変更の対象とする。 ただし、[1以上の数字]が大きな数字の場合、二つのアセンブリコードに分割されていることがあるので、注意する。

例えば、以下のようなコードでは、sleep(10)が呼ばれるので、#0x0aの部分をパッチの対象とする。

movs r0, #0x0a
bl FUN_XXXXXXXX

また、以下のようなコードでは、sleep(1000)が呼ばれるので、#0xfaもしくは#0x2をパッチの対象とする。

movs r0, #0xfa
lsls r0,r0,#0x2
bl FUN_XXXXXXXX
上記コードをC言語で表すと、下記コードを実行していることになる。

sleep(0xfa << 0x02)

note: シフト演算
  • 左シフト(<<): ビットを左にずらす。例えば、0x01 << 20x04になる。2ビット左シフトは4倍するのと同じ。
  • 右シフト(>>): ビットを右にずらす。例えば、0x04 >> 20x01になる。2ビット右シフトは4で割るのと同じ。

2. パッチを適用する

Ghidraにおいて、1.で決めたアセンブリコードを右クリックし、Patch Instructionを選択する。 該当コードが赤枠で囲まれるので、コードを変更しEnterを押下する。 alt text

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

note: Enterキーを押下してもパッチが適用されない場合

Invalid instruction and/or prefixと表示されると適用できない。この場合、オペランドやオペコードが正しくない可能性がある。 特に以下の点を確認する。

  • オペランドの値は一般に0~255(0x0~0xff)であること
  • オペコードが正しいこと(例えば、movsmovなど)
  • オペコードのオペランドが正しいこと(例えば、即値を指定する場合は#を付ける必要がある)

2. パッチしたファームウェアの保存

パッチを適用したファームウェアを保存する。 FileメニューからExport Program...を選択し、以下のように設定する。

項目
Format Raw Bytes
File Name 任意のファイル名 (例: /home/kali/patched.bin

設定が完了したら、OKを押下する。すると、Export Result Summaryが表示されるので、OKを押下する。 ファームウェアが指定したパスに保存される。 alt text

3. ファームウェアの書込

パッチが適用されたファームウェア(patched.bin)を書き込む。 【ハンズオン1】ファームウェアの作成 第8節を参照。

(上記の手順ではxxxx.ino.binを書き込むが、本手順ではパッチしたファームウェア(patched.bin)を書き込むことに注意)

書き込み後、LEDの点滅間隔など挙動が変更されていることを確認する。