WWW2Exec - GOT/PLT

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks 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は通常、部分的なRELROでコンパイルされており、そのアドレスを特定できれば(ASLR)この攻撃の対象となります。

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

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

One Gadget

pageOne Gadget

保護

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

pageRelro

参考文献

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

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

Last updated