0

ジャンプ テーブル(サブルーチン名とそのアドレスをペアにしたデータ テーブル) が実行可能ファイル内のどこに配置されているか、それが言語、コンパイラ、またはおそらく PE のヘッダー内に標準的な配置に基づいているかどうかを把握しようとしています。 / ELF バイナリ。それはどれですか?また、テーブルを見つけたり、テーブルが配置されている場所に関するドキュメントを見つけたりするにはどうすればよいですか?


私がこれまでに試したこと:

まず、PE / ELF ヘッダーの各セクションについて読みましたが、どれがジャンプ テーブルになるかわかりませんでした。

私が考えた最も簡単な方法は、コンパイラがどのように機能するかを学ぶのがかなり怖いので、バイナリをサブルーチンで逆アセンブルし、そのジャンプ先などを参照するバイナリのセクションを見つけることでした。ELF 形式にコンパイルされたこの C プログラムの開始に向けて、次のセクションを見つけました。

0000000000001020 <.plt>:
    1020:   ff 35 1a 2f 00 00       pushq  0x2f1a(%rip)        # 3f40 <_GLOBAL_OFFSET_TABLE_+0x8>
    1026:   f2 ff 25 1b 2f 00 00    bnd jmpq *0x2f1b(%rip)        # 3f48 <_GLOBAL_OFFSET_TABLE_+0x10>
    102d:   0f 1f 00                nopl   (%rax)
    1030:   f3 0f 1e fa             endbr64 
    1034:   68 00 00 00 00          pushq  $0x0
    1039:   f2 e9 e1 ff ff ff       bnd jmpq 1020 <.plt>
    103f:   90                      nop
    1040:   f3 0f 1e fa             endbr64 
    1044:   68 01 00 00 00          pushq  $0x1
    1049:   f2 e9 d1 ff ff ff       bnd jmpq 1020 <.plt>
    ...

これらのアドレスは、さまざまな動的にリンクされたライブラリのオフセットであり、ジャンプ テーブルがどのように見えるかを考えました。以前に .plt を使用した ELF ヘッダー セクションへの参照を見たことがありますが、最初はそれがジャンプ テーブルであるかどうかは明確ではありませんでした。さらなる研究が示されました:

PLTはProcedure Linkage Tableの略で、簡単に言えば、リンク時にアドレスがわからない外部プロシージャ/関数を呼び出すために使用され、実行時に動的リンカによって解決されるために残されます。

GOT は Global Offsets Table の略で、アドレスの解決にも同様に使用されます。この記事では、PLT と GOT の両方、およびその他の再配置情報について詳しく説明します。

このセクションのどのジャンプ (もしあれば) が私のプログラムのサブルーチンを指しているかをまだ見つけようとしています。おそらく、そのGOTは私が次に見る必要がある場所です.


より多くのコンテキストが必要な場合は、ここに私が尋ねている理由があります:

私はバイナリ パッチ、特にマルウェアの動作を追跡するために使用されるフック手法と、マルウェアがその追跡をどのように防止できるかを研究してきました。フック(制御フローを中間関数にリダイレクトしてから、当初意図した目的地にリダイレクトする命令にすぎません) は、メモリ内の共有バイナリ (ライブラリ) にパッチを適用したり、カーネル サブルーチンにパッチを適用したりするなど、多くの場所に移動できますが、私が理解していれば正しくは、実行可能バイナリ内のサブルーチンに直接挿入されることもあります。

私が研究しているのは、攻撃者がバイナリ内に配置されたこれらのフックを阻止する可能性です。攻撃者が、マルウェアの実行の最初から (被害者の観点からは) 不確かなジャンプ先を使用するとします。ここで、アナリストまたは自動化されたヒューリスティック分析ツールが、プログラムの動作を確認するためにおそらくサンドボックス環境内でプログラムを逆アセンブルしようとしたとしますが、プログラムがこのジャンプ先アドレスに到達する Web サーバーはエントリ ポイントのみを返します。将来の特定の日にプログラムが実行されると、プログラムの悪意のある制御フローに影響を与えます。それまでは、プログラムを無害な方法で動作させるアドレスを返します。これは教科書の回避であり、x86/-64 アーキテクチャの可変長の性質によって可能になりました。私は最近、問題セットを私の理解できる範囲で視覚化した図。

ただし、コンパイラがジャンプ テーブルをプログラムに組み込んでいる場合でも、アナリストまたは脅威検出システムは、それらのサブルーチンにジャンプして分析するエントリ ポイントの場所を知ることができます。これらのサブルーチンが実行時に対象の条件下で実行されると、レジスタを分析してルーチンが実行されたアドレスを見つけることもできます (x86 呼び出し規約にはこの情報が含まれているため、サブルーチンはどこに戻るかがわかります)。この情報により、アナリストは逆アセンブルを開始する他の有効な命令境界も知ることができます。

私はコンパイラの仕組みについてほとんど何も知らず、PE / ELF ファイル ヘッダーの仕様を読みましたが、何か見落としている可能性があります。正しい方向へのポインタをいただければ幸いです。

4

1 に答える 1