hacktricks/binary-exploitation/libc-heap/large-bin-attack.md

86 lines
5.7 KiB
Markdown
Raw Normal View History

# 大きなビン攻撃
{% 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 %}
## 基本情報
大きなビンとは何かについての詳細情報は、次のページを参照してください:
{% content-ref url="bins-and-memory-allocations.md" %}
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
{% endcontent-ref %}
最新の"glibc"2.35)の「現在の」バージョンでは、**`P->bk_nextsize`** がチェックされていないため、特定の条件が満たされると大きなビンチャンクの値で任意のアドレスを変更できます。
その例では、次の条件が見つかります:
- 大きなチャンクが割り当てられている
- 最初のチャンクよりも小さい大きなチャンクが同じインデックスに割り当てられている
- ビン内で最初に行く必要があるため、それよりも小さくなければならない
- (トップチャンクとのマージを防ぐチャンクが作成される)
- 次に、最初の大きなチャンクが解放され、それよりも大きな新しいチャンクが割り当てられる -> チャンク1は大きなビンに移動
- 次に、2番目の大きなチャンクが解放される
- ここで、脆弱性:攻撃者は `chunk1->bk_nextsize``[target-0x20]` に変更できる
- 次に、チャンク2よりも大きなチャンクが割り当てられるため、チャンク2が大きなビンに挿入され、アドレス `chunk1->bk_nextsize->fd_nextsize` がチャンク2のアドレスで上書きされます
{% hint style="success" %}
他の潜在的なシナリオがありますが、重要なのは、ビンに現在のXチャンクよりも**小さい**チャンクを追加することです。そのためには、ビン内でそれよりも前に挿入する必要があり、Xの**`bk_nextsize`**を変更できる必要があります。それが小さなチャンクのアドレスが書き込まれる場所です。
{% endhint %}
これはmallocからの関連するコードです。アドレスがどのように上書きされたかをよりよく理解するためにコメントが追加されています
{% code overflow="wrap" %}
```c
/* if smaller than smallest, bypass loop below */
assert (chunk_main_arena (bck->bk));
if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk))
{
fwd = bck; // fwd = p1
bck = bck->bk; // bck = p1->bk
victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk)
victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}
```
{% endcode %}
これは、`global_max_fast`のグローバル変数を上書きして、より大きなチャンクで高速ビンアタックを悪用するために使用できます。
この攻撃の別の素晴らしい説明を[guyinatuxedo](https://guyinatuxedo.github.io/32-largebin_attack/largebin_explanation0/index.html)で見つけることができます。
### 他の例
* [La casa de papel. HackOn CTF 2024](https://7rocky.github.io/en/ctf/other/hackon-ctf/la-casa-de-papel/)
* 同じ状況での大きなビンアタックは、[how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c)に表示されています。
* 書き込みプリミティブはより複雑です、なぜなら`global_max_fast`はここでは役に立たないからです。
* エクスプロイトを完了するにはFSOPが必要です。
{% 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)](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](https://github.com/carlospolop/hacktricks)と[HackTricks Cloud](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。
</details>
{% endhint %}