記事の最初の部分はこちらです。

内容
- はじめに
- アーキテクチャESP8266
- メモリカード(アドレス空間)
- ファームウェア形式
- 起動プロセス
- ツール
- 研究用ファームウェアのダウンロード
- アセンブラーXtensa
- 登録
- 基本的な演算子
- 機能
- 条件付きジャンプ
- おわりに
- 参照資料
4.研究用ファームウェアのダウンロード
必要なツールを準備した後、最も興味深い部分に来ました-ファームウェアのダウンロードと分解。
ELF
SDKを使用して作成されたELF形式の最も簡単なapp.outファイルのダウンロードから始めましょう。
通常、app.outファイルは、ファームウェアのソースコードがある場合に使用できます。これは、はるかに簡単で学習しやすいものです。 ただし、コンパイラの機能、セグメントの場所、および関数の名前を確認するには、最初から始めることをお勧めします。
コンパイルとアセンブリの後、app.outファイルがビルドフォルダーに表示されます。このフォルダーは、コンパイルされたユーザーコード、データ、ライブラリ、およびデバッグ情報を表します。 この形式では、ファームウェアをモジュールにロードできないため、ELFファイルをアセンブルした後、SDKはapp.outをファームウェアフォルダー内の1つまたは2つのファイルに変換します-0x00000.binと0x40000.binは直接フラッシュできます。
HIEWでapp.outを開き、セグメントテーブル(enter、F8、F6)を見ると、次の図が表示されます。

VirtAddr列には、Xtensaアドレス空間内のセグメントの開始アドレスが含まれています。 3つのセグメント(.data、.rodataおよび.bss)がRAM領域にロードされ、.textセグメントがユーザー実行可能コードのアドレスに書き込まれ、.irom0.textセグメントがSDKライブラリコードのアドレスに書き込まれることに注意してください。 開始アドレスがゼロの残りのセグメントにはサービス情報が含まれており、モジュールに入力する準備ができているファームウェアには追加されません。
先を見て、.irom0.textセグメントは元の形式で0x40000ファイルにコピーされ、.data、.rodata、.bss、および.textセグメントは、上記で説明した形式を考慮して0x00000.binファイルに収集されます。
app.outをIDAにロードするには、次の手順を実行します。
1. IDA Pro 6.6以降を開きます
2. [Go]をクリックします-まだファイルを開きません
3. [ファイル]-[スクリプトファイル]メニュー項目を開き、xtensa.pyプロセッサ定義スクリプトを選択します
4. app.outファイルをダウンロードします。ここでは、プロセッサのタイプを選択して「設定」をクリックする必要があります。

5.次のウィンドウで、不明なタイプのマシンに関する警告が表示され、デバッグ情報をダウンロードするように求められたら、「はい」をクリックします
6.結果として、調査の準備ができたファイルを取得します。

何が欠けていますか? モジュールの基本機能を含むシステムROMが不足しています。 必要に応じて、手動でダウンロードできます。これは次のセクションで行います。
モジュールファームウェア
IDAのかなり単純なファームウェアダウンロードをELFファイルとして見ました。 ただし、実際には、フラッシュモジュールから抽出された(フラッシュに直接接続して)既製のファームウェア、またはファイル0x00000.binおよび0x40000.binの形式で配布されたファームウェアを調査する必要があります。 ここでは、少し手作りの仕事をしなければなりません。 システムROMイメージをロードすることから始めましょう。 最初の部分では、ファイル40000000.binでアーカイブへのリンクを指定しました-これがそれです。 アクションのシーケンスは次のとおりです。
1. IDA Pro 6.6以降を開きます
2.「実行」をクリックします
3. [ファイル]-[スクリプトファイル]メニュー項目を開き、xtensa.pyプロセッサ定義スクリプトを選択します
4.ファイル40000000.binを開きます
5.プロセッサTensilica Xtensa [xtensa]のタイプを選択し、[設定]をクリックします
6.次に、バイナリファイルを正しくダウンロードするためのメモリ構成を指定する必要があります。 ここでは、0x40000000にコードセグメントを作成し、ファイルをロードします。

7. ROMイメージはロードされますが、関数名が不足しているため、読み取りが不十分です。 スクリプト40000000.idcをロードします。これは追加の作業を行います-関数の名前を決定し、アドレススペースに追加のセグメントを作成します:ファイル-スクリプトファイル-40000000.idc。 結果は次のとおりです。

これについては、システムROMのブートが完了したと見なすことができます。その調査に進むことができます。 スクリプトは、システムROMの関数の名前を決定しました。これで、この関数またはその関数がSDKから呼び出されるものを把握できます。
ところで、ここに、ユーザーファームウェアをフラッシュからSoCメモリにコピーする機能があります。

SDKにはそのような関数はないため、任意に名前を付けました。
ただし、ファームウェアは、ユーザー部分(ファイル0x00000.binおよび0x40000.bin)をロードしないと完全ではありません。 したがって、これらのファイルをシステムROMにアップロードします。
カスタムファームウェア
システムROMモジュールをIDAにロードし、スクリプトは残りのパーツをロードするためのいくつかのセグメントを準備しました。 簡単なものから始めましょう-ライブラリコードの読み込み。
前述したように、ファームウェアファイル0x40000.binは、サービス情報のないコードセグメントのイメージであり、0x40240000のプロセッサのアドレススペースに直接マップされます。 IDAにロードするには、次の手順を実行します。
1.データベース40000000.binが開いており、スクリプト40000000.idcが追加のセグメントを作成したことを確認します:RAM、ROM、IRAM、IROM
2.メニューから[ファイル]-[ファイルのロード]-[追加のバイナリファイル]を選択し、ファームウェアファイル40000.binを開きます
3.次のウィンドウで、起動オプションを選択します。 ロードはパラグラフのオフセットによって行われることに注意してください。 アドレスの代わりに、10h倍少ない値を指定します(最後のゼロを破棄します)。 セグメントを作成するためのDawは削除できます。すでに作成済みです。

4.ファイルがアップロードされます。 コードの始まりを示した後(この場合、4024000Ch)、およそ次の図が表示されます。

ELFファイルとは異なり、関数と変数の名前はここでは定義されませんが、それについて行うことは何もありません。
わずかな余談
ベアアセンブラコードを調べる方法は? この機能またはその機能の実行内容を理解するにはどうすればよいですか? 多くの有名なSDKの場合、IDAには標準関数の名前を定義するFLIRTシグネチャがあります。 私たちの場合、IDAはこのSDKを知らないため、これは役に立ちません。 したがって、この作業は手動で行う必要があります。 たとえば、複雑さの昇順でいくつかの方法を示します。
1. SDKの同じバージョンでコンパイルされたELFファイルの逆アセンブラーで、調査中の関数のシグネチャを見つけます。 あなたは彼女を見つける可能性があり、彼女は(デバッグ情報から)名前を持つことになります。 これを含めて、ファームウェアをELFにダウンロードすることを検討していました。
2.既知の定数-関数はテキスト文字列またはバイナリデータを参照できます。 経験上、これらの定数の多くは、定数がなじみのないものである場合、グーグルによって暗記されます。 以下に例を示します。
2つの注目すべき定数があります。 Googleは最初のリンクに、これらの定数を使用したstrlenアルゴリズムの説明を提供します。
アルゴリズムの実装を比較すると、strlen関数は40100E70hにあると自信を持って言えます。
または、すぐに除算関数を生成するコードの一部を次に示します。
3.実際には、アセンブラコードの調査と、関数が実行する内容の理解の試み。 時には、おなじみのアルゴリズムの「ローカル」実装があると判断できる場合とそうでない場合があります。
いずれにしても、アセンブリコードを理解するスキルには経験が必要なので、ぜひ試してください!
1. SDKの同じバージョンでコンパイルされたELFファイルの逆アセンブラーで、調査中の関数のシグネチャを見つけます。 あなたは彼女を見つける可能性があり、彼女は(デバッグ情報から)名前を持つことになります。 これを含めて、ファームウェアをELFにダウンロードすることを検討していました。
2.既知の定数-関数はテキスト文字列またはバイナリデータを参照できます。 経験上、これらの定数の多くは、定数がなじみのないものである場合、グーグルによって暗記されます。 以下に例を示します。

2つの注目すべき定数があります。 Googleは最初のリンクに、これらの定数を使用したstrlenアルゴリズムの説明を提供します。

アルゴリズムの実装を比較すると、strlen関数は40100E70hにあると自信を持って言えます。
または、すぐに除算関数を生成するコードの一部を次に示します。

3.実際には、アセンブラコードの調査と、関数が実行する内容の理解の試み。 時には、おなじみのアルゴリズムの「ローカル」実装があると判断できる場合とそうでない場合があります。
いずれにしても、アセンブリコードを理解するスキルには経験が必要なので、ぜひ試してください!
ファイル00000.binに移動します。 これは単なる画像ではなく、データとコードセグメントを記述する構造を持つファイルであることを覚えています。 16進数で表示すると、次のようになります。

最初に来るのは、セグメントの数とエントリポイントを決定する一般的なファームウェアヘッダーの8バイトです。 次に、セグメント自体が移動し、アドレスと長さを持つ8バイトのヘッダーも持ちます。
それらをIDAに正しく読み込むために、各セグメントのデータ(ヘッダーなし)を個別のファイルに切り取り、ダウンロードアドレスに名前を付けます。

これで、IDAにそれらをロードすることができます。 各ファイルに対して、システムROMのロードに類似した一連のアクションを実行します。
1.ファイル-ファイルをロード-追加のバイナリファイル、データファイルを選択
2.ブートパラメータで、セグメントを指定します(最後のゼロなしのファイル名で)。セグメントは作成しません。
以上で、完全にロードされた研究用ファームウェアの準備が整いました!

記事のこの部分では、IDA Proで分解するためのさまざまなタイプのESP8266ファームウェアのロード手順について説明しました。 最後の部分では、Xtensaプロセッサの機能、x86アーキテクチャとの違い、レジスタとコマンドのセットを検討します。