私の連絡先情報
郵便メール:
2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
実行可能ファイル形式 mach-O は、Apple のオペレーティング システム macOS および iOS で使用されるバイナリ ファイル形式です。
一部の iOS セキュリティ スキャンでは、ユーザーが脆弱性をより正確に特定できるように、関数の特定の呼び出し場所を取得する必要がある場合があります。
次に NSLog 関数を例として、macho でダイナミック リンク関数の特定の呼び出し位置を静的に検索します。
アプリケーション macho で NSLog 関数が呼び出される特定の場所を検索します。
検索プロセス全体は、マッチョ ファイルを解析し、バイナリ データを適切なデータ構造に解析するプロセスです。
マッチョの複数の部分が使用されています。
文字列テーブル
シンボルテーブル
ダイナミックシンボルテーブル
第64条(文章、スタブ
第64条(文章、文章)
Load Commands で LC_SYMTAB を見つけると、StringTable のオフセットとサイズを決定でき、また、シンボル テーブルのオフセットと番号も見つけることができます。
シンボルテーブルのオフセットは0x18c478です
シンボルの数は 0x9a2d です
文字列テーブルのオフセットは 0x2273b0 です
文字列テーブルのサイズは 0x108d58 です
各シンボルのデータ長は 0x10 の 16 バイトであるため、
したがって、シンボル テーブルのサイズは 0x9a2d*0x10 = 0x9A2D0 となります。
シンボルテーブルの開始アドレスは0x18c478です
終了アドレスは 0x18c478 0x9A2D0 = 0x226748 です。
文字列テーブルの開始アドレスは 0x2273b0 です
終了アドレスは 0x2273b0 0x108d58 = 0x330108 です。
文字列の長さは固定されていないため、文字列テーブル内の各データの長さも固定されていません。
文字列テーブルのデータをバイナリで読み取る場合、文字列区切り文字として「x00」を使用できます。
まず、macho で文字列テーブル データを読み取り、区切り文字として「x00」を使用して文字列配列を生成します。
文字列配列を走査し、各データが「_NSLog」と等しいかどうかを判断します。
_NSLog は 0x23331b で見つかり、マシン コード「5F4E534C6F6700」は「_NSLogn」文字列です。
49003 (16 進数で 0xBF6B) は現在の文字列のインデックス番号であり、strTab_index = 49003 として暫定的に決定されます。
インデックス番号 49003 は、文字列テーブルの開始アドレス 0x2273b0、49003 バイト目から計算されます。
0x2273b0 49003 = 0x23331B、これはたまたま _NSLog の開始アドレスです。
MachOView では、アドレス 0x00224988 が _NSLog に対応していることがわかります。
インデックス番号 49003 から一致するシンボル テーブル データを見つけるにはどうすればよいですか?
ステップ 1 でわかっていること:
シンボルテーブルの開始アドレスは0x18c478、
シンボルテーブルの終了アドレスは0x226748です。
このマッチョでは、1 つのシンボル テーブルのデータ サイズは 0x10 です。
シンボル テーブルの 38993 番目のデータの最初の 4 バイトの値は 0xBF6B、つまり 49003 です。
これは文字列テーブルの _NSLog 文字列のインデックス番号と同じであるため、このデータは「_NSLog」に対応します。
38993 はシンボル テーブル内の現在のデータのインデックス番号です。暫定的に symTab_index = 38993、
0x18c478 38993 * 0x10 = 0x224988 は、現在のデータのアドレスとまったく同じです。
間接シンボルの位置は、Macho の Load Commands の LC_DYSYMTAB で決定できます。
開始アドレス:0x226748、データ数は 794 個、各データのサイズは 0x4 です。
間接シンボル内の各データを走査すると、111 番目のデータには 38993 が格納されます。
したがって、このデータは「_NSLog」に対応し、dySymTab_index = 111 に設定します。
0x226748 111*0x4 = 0x226904