コンテンツにスキップ

【ハンズオン3】ファームウェアの解析(後半)

前提条件

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

手順

5. loop()関数を探す

ボードの内蔵LEDをコントロールするファームウェアでは、下記の命令が含まれる(理由は演習後、講義で説明)。

movs r1, #0x1
movs r0, #0x40
これをアセンブルすると、以下の16進数の命令列になる。
01 21 40 20
この命令列をGhidraの検索機能で探す。 GhidraのメニューからSearchMemory...を選択し、Hexを選んだ上で、上記命令列を入力する。 alt text

実装したファームウェアによって検索結果は異なるが、1件以上の結果が表示されるはずである。 見つかったアドレスを上から一つずつダブルクリックし、逆コンパイルされたコードを確認していく。

右側ペインに表示される疑似コードより、表示されたアドレスのどれか一つは自分で実装したloop関数であると判定できる。 alt text

注意

FUN_XXXXXXXXXXXXXXXXの部分は、実際の関数開始アドレスに置き換わる。上記の図は例示であり、実際のアドレスは異なる場合がある。

note: 自分で書いたコードの見つけ方
  • loop関数では、sleep関数を使用したことを思い出してください。sleep([自分で設定した秒数])のようなコードが含まれているはずです(シンボル情報はないため、FUN_XXXXXXXX([自分で設定した秒数])と表示される)。
  • 講義資料も参照してください
  • loop関数が見つからない場合は、チューターまたは講師に相談してください。

時間が余った場合は、XREF機能を使用して、loop関数がどこから呼び出されているかを調べてみましょう。辿っていくと、いずれ0x10000000にたどり着くはずです。