8.7 KiB
WWW2Exec - GOT/PLT
ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricks をサポートする他の方法:
- HackTricks で企業を宣伝したいまたは HackTricks をPDFでダウンロードしたい場合は SUBSCRIPTION PLANS をチェックしてください!
- 公式PEASS&HackTricksグッズを入手する
- The PEASS Family、独占的な NFTs のコレクションを発見する
- 💬 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 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 は通常、partial RELRO でコンパイルされており、そのアドレスを特定できれば(ASLR)このような攻撃の対象となります。
libc の一般的な関数は、コード実行を取得するために上書きできるように、他の内部関数を呼び出します。
このテクニックについての詳細情報はこちらを参照してください。
Free2system
ヒープの脆弱性を悪用するCTFでは、チャンクの内容を制御でき、GOT テーブルを上書きすることさえ可能になることが一般的です。利用可能なガジェットがない場合に RCE を取得するための簡単なトリックは、free
の GOT アドレスを system
を指すように上書きし、チャンク内に "/bin/sh"
を書き込むことです。このようにして、このチャンクが解放されると、system("/bin/sh")
が実行されます。
One Gadget
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}
Heap からの GOT の乱用
ヒープの脆弱性から RCE を取得する一般的な方法は、fastbin を悪用して、GOT テーブルの一部を fast bin に追加できるようにすることで、そのチャンクが割り当てられるたびに、通常は 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
ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricks をサポートする他の方法:
- HackTricks で企業を宣伝したい または HackTricks をPDFでダウンロードしたい場合は SUBSCRIPTION PLANS をチェックしてください!
- 公式PEASS&HackTricksのグッズを入手する
- The PEASS Family、当社の独占的な NFTs コレクションを発見する
- 💬 Discordグループ または telegramグループ に参加するか、Twitter 🐦 @hacktricks_live をフォローする。**
- ハッキングトリックを共有するために HackTricks と HackTricks Cloud のGitHubリポジトリにPRを提出する。