# WWW2Exec - GOT/PLT
ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricks をサポートする他の方法:
* **HackTricks で企業を宣伝したい**または **HackTricks をPDFでダウンロードしたい**場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
* [**公式PEASS&HackTricksグッズ**](https://peass.creator-spring.com)を入手する
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを発見する
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)** に参加するか、[telegramグループ](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live) をフォローする
* **ハッキングトリックを共有するために** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/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 テーブルへのアドレスを取得します。
![](<../../.gitbook/assets/image (121).png>)
GEF で **実行可能ファイル** を **ロード**した後、GOT にある **関数** を **表示**できます: `gef➤ x/20x 0xDIR_GOT`
![](<../../.gitbook/assets/image (620) (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 テーブルを表示できます:
![](<../../.gitbook/assets/image (496).png>)
### 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**](../common-binary-protections-and-bypasses/aslr/))このような攻撃の対象となります。
libc の一般的な関数は、コード実行を取得するために上書きできるように、他の内部関数を呼び出します。
このテクニックについての[**詳細情報はこちら**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries)を参照してください。
## **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](../rop-return-oriented-programing/ret2lib/one-gadget.md)
{% endcontent-ref %}
## **Heap からの GOT の乱用**
ヒープの脆弱性から RCE を取得する一般的な方法は、fastbin を悪用して、GOT テーブルの一部を fast bin に追加できるようにすることで、そのチャンクが割り当てられるたびに、通常は `free` のポインタを上書きできるようにすることです。\
その後、`free` を `system` に向け、`/bin/sh\x00` が書き込まれたチャンクを解放するとシェルが実行されます。
[**こちらの例**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk\_extend\_overlapping/#hitcon-trainging-lab13)を見つけることができます。
## **保護**
**Full RELRO** 保護は、バイナリが開始されるとすべての関数のアドレスが解決され、その後 **GOT テーブルが読み取り専用** になるようにすることで、この種のテクニックに対抗するために意図されています:
{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %}
[relro.md](../common-binary-protections-and-bypasses/relro.md)
{% endcontent-ref %}
## 参考
* [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](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](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**](https://github.com/sponsors/carlospolop) をチェックしてください!
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を入手する
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)、当社の独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) コレクションを発見する
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f) または [**telegramグループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** をフォローする。**
* **ハッキングトリックを共有するために** [**HackTricks**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) のGitHubリポジトリにPRを提出する。