技術共有

iOSダイナミックリンク機能の呼び出し位置の静的検索

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

iOSダイナミックリンク機能の呼び出し位置の静的検索

実行可能ファイル形式 mach-O は、Apple のオペレーティング システム macOS および iOS で使用されるバイナリ ファイル形式です。

一部の iOS セキュリティ スキャンでは、ユーザーが脆弱性をより正確に特定できるように、関数の特定の呼び出し場所を取得する必要がある場合があります。
次に NSLog 関数を例として、macho でダイナミック リンク関数の特定の呼び出し位置を静的に検索します。

目標

アプリケーション macho で NSLog 関数が呼び出される特定の場所を検索します。

アイデア

検索プロセス全体は、マッチョ ファイルを解析し、バイナリ データを適切なデータ構造に解析するプロセスです。
マッチョの複数の部分が使用されています。
文字列テーブル
シンボルテーブル
ダイナミックシンボルテーブル
第64条(文章、スタブ
第64条(文章、文章)

具体的な手順

1. まず、macho ファイル内のシンボル タルベと文字列テーブルの場所を見つけます。

Load Commands で LC_SYMTAB を見つけると、StringTable のオフセットとサイズを決定でき、また、シンボル テーブルのオフセットと番号も見つけることができます。

シンボルテーブルのオフセットは0x18c478です
シンボルの数は 0x9a2d です
文字列テーブルのオフセットは 0x2273b0 です
文字列テーブルのサイズは 0x108d58 です

各シンボルのデータ長は 0x10 の 16 バイトであるため、

したがって、シンボル テーブルのサイズは 0x9a2d*0x10 = 0x9A2D0 となります。
シンボルテーブルの開始アドレスは0x18c478です
終了アドレスは 0x18c478 0x9A2D0 = 0x226748 です。

文字列テーブルの開始アドレスは 0x2273b0 です
終了アドレスは 0x2273b0 0x108d58 = 0x330108 です。
文字列の長さは固定されていないため、文字列テーブル内の各データの長さも固定されていません。
文字列テーブルのデータをバイナリで読み取る場合、文字列区切り文字として「x00」を使用できます。

2. 文字列テーブルを調べて、_NSLog を見つけます。

まず、macho で文字列テーブル データを読み取り、区切り文字として「x00」を使用して文字列配列を生成します。
文字列配列を走査し、各データが「_NSLog」と等しいかどうかを判断します。

_NSLog は 0x23331b で見つかり、マシン コード「5F4E534C6F6700」は「_NSLogn」文字列です。

49003 (16 進数で 0xBF6B) は現在の文字列のインデックス番号であり、strTab_index = 49003 として暫定的に決定されます。
インデックス番号 49003 は、文字列テーブルの開始アドレス 0x2273b0、49003 バイト目から計算されます。
0x2273b0 49003 = 0x23331B、これはたまたま _NSLog の開始アドレスです。

3. 手順 2 の 49003 (0xBF6B) に従って、SymbolTable で対応するシンボルを検索できます。

MachOView では、アドレス 0x00224988 が _NSLog に対応していることがわかります。

インデックス番号 49003 から一致するシンボル テーブル データを見つけるにはどうすればよいですか?
ステップ 1 でわかっていること:
シンボルテーブルの開始アドレスは0x18c478、
シンボルテーブルの終了アドレスは0x226748です。
このマッチョでは、1 つのシンボル テーブルのデータ サイズは 0x10 です。

シンボル テーブルの 38993 番目のデータの最初の 4 バイトの値は 0xBF6B、つまり 49003 です。
これは文字列テーブルの _NSLog 文字列のインデックス番号と同じであるため、このデータは「_NSLog」に対応します。

38993 はシンボル テーブル内の現在のデータのインデックス番号です。暫定的に symTab_index = 38993、
0x18c478 38993 * 0x10 = 0x224988 は、現在のデータのアドレスとまったく同じです。

4. 動的シンボルテーブルの symTab_index に基づいてデータを検索します。

間接シンボルの位置は、Macho の Load Commands の LC_DYSYMTAB で決定できます。

開始アドレス:0x226748、データ数は 794 個、各データのサイズは 0x4 です。
間接シンボル内の各データを走査すると、111 番目のデータには 38993 が格納されます。
したがって、このデータは「_NSLog」に対応し、dySymTab_index = 111 に設定します。
0x226748 111*0x4 = 0x226904