WWW2Exec - GOT/PLT
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
基本情報
GOT: グローバルオフセットテーブル
グローバルオフセットテーブル (GOT) は、動的リンクされたバイナリで外部関数のアドレスを管理するために使用されるメカニズムです。これらのアドレスは実行時まで知られないため(動的リンクのため)、GOTはこれらの外部シンボルのアドレスを解決した後に動的に更新する方法を提供します。
GOTの各エントリは、バイナリが呼び出す可能性のある外部ライブラリのシンボルに対応しています。関数が最初に呼び出されると、その実際のアドレスは動的リンカーによって解決され、GOTに格納されます。同じ関数への後続の呼び出しは、GOTに格納されたアドレスを使用し、再度アドレスを解決するオーバーヘッドを回避します。
PLT: プロシージャリンクテーブル
プロシージャリンクテーブル (PLT) はGOTと密接に連携し、外部関数への呼び出しを処理するためのトランポリンとして機能します。バイナリが外部関数を初めて呼び出すと、制御はその関数に関連付けられたPLTのエントリに渡されます。このPLTエントリは、関数のアドレスがまだ解決されていない場合、動的リンカーを呼び出してアドレスを解決する責任があります。アドレスが解決された後、それはGOTに格納されます。
したがって、 外部関数または変数のアドレスが解決されると、GOTエントリは直接使用されます。PLTエントリは、動的リンカーを介してこれらのアドレスの初期解決を促進するために使用されます。
実行を取得
GOTを確認
GOTテーブルのアドレスを取得するには: objdump -s -j .got ./exec
.png)
GEFで実行可能ファイルを読み込んだ後、GOTにある 関数を 見ることができます: gef➤ x/20x 0xADDR_GOT
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png)
GEFを使用してデバッグセッションを開始し、**got**を実行してGOTテーブルを表示できます:
.png)
GOT2Exec
バイナリ内のGOTには、関数のアドレスまたは PLTセクションのアドレスが含まれており、関数アドレスを読み込むことになります。この任意の書き込みの目標は、後で実行される関数のGOTエントリを system 関数のPLTのアドレスで上書きすることです。
理想的には、あなたが制御するパラメータで呼び出される関数のGOTを上書きすることになります(これにより、system関数に送信されるパラメータを制御できます)。
もし**system** がバイナリで使用されていない場合、system関数はPLTにエントリを持ちません。このシナリオでは、最初にsystem関数のアドレスを漏洩させ、その後GOTをこのアドレスを指すように上書きする必要があります。
PLTアドレスは**objdump -j .plt -d ./vuln_binary**で確認できます。
libc GOTエントリ
libcのGOTは通常、部分的RELROでコンパイルされており、そのアドレスを特定することができれば、良いターゲットになります(ASLR)。
libcの一般的な関数は、他の内部関数を呼び出すことがあり、そのGOTはコード実行を得るために上書きされる可能性があります。
この技術に関する詳細情報はこちらを参照してください。
Free2system
ヒープのエクスプロイトCTFでは、チャンクの内容を制御でき、時にはGOTテーブルを上書きすることが一般的です。利用可能なガジェットがない場合にRCEを取得するための簡単なトリックは、freeのGOTアドレスをsystemを指すように上書きし、チャンク内に"/bin/sh"を書き込むことです。このようにして、このチャンクが解放されると、system("/bin/sh")が実行されます。
Strlen2system
もう一つの一般的な技術は、**strlenのGOTアドレスをsystem**を指すように上書きすることです。これにより、この関数がユーザー入力で呼び出されると、文字列"/bin/sh"を渡してシェルを取得することが可能になります。
さらに、putsがユーザー入力で使用される場合、strlenのGOTアドレスをsystemを指すように上書きし、文字列"/bin/sh"を渡してシェルを取得することが可能です。putsはユーザー入力でstrlenを呼び出します。
One Gadget
ヒープからのGOTの悪用
ヒープの脆弱性からRCEを取得する一般的な方法は、ファストビンを悪用することです。これにより、GOTテーブルの一部をファストビンに追加できるため、そのチャンクが割り当てられると、通常はfreeのポインタを上書きすることが可能になります。
その後、freeをsystemに指し、/bin/sh\x00が書き込まれたチャンクを解放すると、シェルが実行されます。
保護
フルRELRO保護は、この種の技術に対抗するために、バイナリが起動されるときにすべての関数のアドレスを解決し、その後GOTテーブルを読み取り専用にすることを目的としています:
参考文献
- 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
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
HackTricks

