WWW2Exec - GOT/PLT
基本情報
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参考文献
Last updated