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

8.9 KiB
Raw Permalink Blame History

WWW2Exec - GOT/PLT

{% hint style="success" %} AWSハッキングの学習と練習HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングの学習と練習HackTricks Training GCP Red Team Expert (GRTE)

HackTricksのサポート
{% endhint %}

基本情報

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 0xADDR_GOT

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

GOT2Exec

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

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

バイナリで**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")が実行されます。

Strlen2system

もう1つの一般的なテクニックは、**strlenのGOTアドレスをsystem**を指すように上書きすることです。したがって、この関数がユーザー入力とともに呼び出される場合、文字列"/bin/sh"を渡すことができ、シェルを取得できます。

さらに、putsがユーザー入力とともに使用される場合、strlenのGOTアドレスをsystemを指すように上書きし、文字列"/bin/sh"を渡すことでシェルを取得できます。なぜなら**putsはユーザー入力とともにstrlenを呼び出す**からです。

One Gadget

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

ヒープからGOTを悪用

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

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

保護

Full RELRO 保護は、バイナリが開始されるときにすべての関数のアドレスを解決し、その後 GOT テーブルを読み取り専用 にすることで、この種の技術を防ぐことを意図しています。

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

参考文献

{% hint style="success" %} AWS ハッキングの学習と実践:HackTricks Training AWS Red Team Expert (ARTE)
GCP ハッキングの学習と実践: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks のサポート
{% endhint %}