WWW2Exec - GOT/PLT
Reading time: 9 minutes
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
GEFで実行可能ファイルを読み込んだ後、GOTにある 関数を見ることができます: gef➤ x/20x 0xADDR_GOT
GEFを使用してデバッグセッションを開始し、**got
**を実行してGOTテーブルを表示できます:
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を提出してハッキングトリックを共有してください。