hacktricks/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md

8.7 KiB
Raw Blame History

WWW2Exec - GOT/PLT

ゼロからヒーローまでAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricks をサポートする他の方法:

基本情報

GOT: Global Offset Table

Global Offset Table (GOT) は、動的にリンクされたバイナリで 外部関数のアドレスを管理するために使用されるメカニズムです。これらの アドレスは実行時にはわかりません動的リンクのため、GOT はこれらの外部シンボルのアドレスが解決されると そのアドレスを動的に更新する方法を提供します。

GOT の各エントリは、バイナリが呼び出す可能性のある外部ライブラリのシンボルに対応しています。 関数が最初に呼び出されると、その実際のアドレスが動的リンカによって解決され、GOT に格納されます。同じ関数への後続の呼び出しでは、GOT に格納されたアドレスが使用され、アドレスを再度解決するオーバーヘッドが回避されます。

PLT: Procedure Linkage Table

Procedure Linkage Table (PLT) は GOT と密接に連携し、外部関数への呼び出しを処理するトランポリンとして機能します。バイナリが 外部関数を最初に呼び出すと、その関数に関連する PLT のエントリに制御が渡されます。この PLT エントリは、関数のアドレスがまだ解決されていない場合に、動的リンカを呼び出してアドレスを解決する責任があります。アドレスが解決された後、それは GOT に格納されます。

したがって、外部関数や変数のアドレスが解決されると、GOT エントリが直接使用されます。 PLT エントリは、動的リンカを介してこれらのアドレスの初期解決を容易にするために使用されます

実行を取得

GOT を確認する

objdump -s -j .got ./exec で GOT テーブルへのアドレスを取得します。

GEF で 実行可能ファイルロードした後、GOT にある 関数表示できます: gef➤ x/20x 0xDIR_GOT

GEF を使用して デバッグ セッションを開始し、got を実行して GOT テーブルを表示できます:

GOT2Exec

バイナリ内の GOT には、関数のアドレスまたは後で実行される関数アドレスをロードする PLT セクションのアドレスが含まれています。この任意の書き込みの目標は、後で実行される関数の GOT エントリを system 関数の PLT のアドレス で上書きすることです。

理想的には、制御可能なパラメータで呼び出される関数GOT上書き します(したがって、システム関数に送信されるパラメータを制御できます)。

system がスクリプトで 使用されていない 場合、システム関数には PLT にエントリがありません。このシナリオでは、まず system 関数のアドレスをリークしてから、そのアドレスを指すように GOT を上書きする必要があります。

objdump -j .plt -d ./vuln_binary で PLT のアドレスを確認できます。

libc の GOT エントリ

libc の GOT は通常、partial RELRO でコンパイルされており、そのアドレスを特定できれば(ASLR)このような攻撃の対象となります。

libc の一般的な関数は、コード実行を取得するために上書きできるように、他の内部関数を呼び出します。

このテクニックについての詳細情報はこちらを参照してください。

Free2system

ヒープの脆弱性を悪用するCTFでは、チャンクの内容を制御でき、GOT テーブルを上書きすることさえ可能になることが一般的です。利用可能なガジェットがない場合に RCE を取得するための簡単なトリックは、free の GOT アドレスを system を指すように上書きし、チャンク内に "/bin/sh" を書き込むことです。このようにして、このチャンクが解放されると、system("/bin/sh") が実行されます。

One Gadget

{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}

Heap からの GOT の乱用

ヒープの脆弱性から RCE を取得する一般的な方法は、fastbin を悪用して、GOT テーブルの一部を fast bin に追加できるようにすることで、そのチャンクが割り当てられるたびに、通常は free のポインタを上書きできるようにすることです。
その後、freesystem に向け、/bin/sh\x00 が書き込まれたチャンクを解放するとシェルが実行されます。

こちらの例を見つけることができます。

保護

Full RELRO 保護は、バイナリが開始されるとすべての関数のアドレスが解決され、その後 GOT テーブルが読み取り専用 になるようにすることで、この種のテクニックに対抗するために意図されています:

{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %} relro.md {% endcontent-ref %}

参考

ゼロからヒーローまでのAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricks をサポートする他の方法: