8.9 KiB
WWW2Exec - GOT/PLT
{% hint style="success" %}
AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングの学習と練習:HackTricks Training GCP Red Team Expert (GRTE)
HackTricksのサポート
- サブスクリプションプランをチェック!
- 💬 Discordグループに参加するか、telegramグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksとHackTricks CloudのgithubリポジトリにPRを提出して、ハッキングトリックを共有してください。
基本情報
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
の関数を指します。
その後、free
をsystem
に向け、/bin/sh\x00
が書かれたチャンクを解放するとシェルが実行されます。
保護
Full RELRO 保護は、バイナリが開始されるときにすべての関数のアドレスを解決し、その後 GOT テーブルを読み取り専用 にすることで、この種の技術を防ぐことを意図しています。
{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %} relro.md {% endcontent-ref %}
参考文献
- https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite
- https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook
{% hint style="success" %}
AWS ハッキングの学習と実践:HackTricks Training AWS Red Team Expert (ARTE)
GCP ハッキングの学習と実践: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks のサポート
- サブスクリプションプランをチェック!
- 💬 Discord グループ に参加するか、telegram グループ に参加するか、Twitter 🐦 @hacktricks_live をフォローする。
- HackTricks と HackTricks Cloud の github リポジトリに PR を提出してハッキングトリックを共有する。