hacktricks/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md

115 lines
8.9 KiB
Markdown
Raw Permalink Normal View History

# WWW2Exec - GOT/PLT
{% hint style="success" %}
AWSハッキングの学習と練習<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCPハッキングの学習と練習<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricksのサポート</summary>
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェック!
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォロー**してください。
* **HackTricks**と**HackTricks Cloud**のgithubリポジトリにPRを提出して、ハッキングトリックを共有してください。
</details>
{% endhint %}
## **基本情報**
### **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 0xADDR_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**セクションが含まれています。この任意の書き込みの目標は、後で**`system`** **関数**の**PLTのアドレス**であるGOTエントリを**上書きする**ことです。
理想的には、**制御可能なパラメータで呼び出される関数**の**GOT**を**上書き**します(したがって、`system`関数に送信されるパラメータを制御できます)。
バイナリで**`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")`が実行されます。
### **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](../rop-return-oriented-programing/ret2lib/one-gadget.md)
{% endcontent-ref %}
## **ヒープからGOTを悪用**
ヒープの脆弱性からRCEを取得する一般的な方法は、fastbinを悪用してGOTテーブルの一部をfast binに追加できるようにすることです。その後、`free`のポインタを上書きすることができるようになり、通常は`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)
{% hint style="success" %}
AWS ハッキングの学習と実践:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCP ハッキングの学習と実践: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricks のサポート</summary>
* [**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェック!
* 💬 [**Discord グループ**](https://discord.gg/hRep4RUj7f) に参加するか、[**telegram グループ**](https://t.me/peass) に参加するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live) をフォローする。
* **HackTricks** と **HackTricks Cloud** の github リポジトリに PR を提出してハッキングトリックを共有する。
</details>
{% endhint %}