mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
57 lines
3.6 KiB
Markdown
57 lines
3.6 KiB
Markdown
# Large Bin Attack
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## 基本情報
|
|
|
|
大きなビンについての詳細はこのページを参照してください:
|
|
|
|
{{#ref}}
|
|
bins-and-memory-allocations.md
|
|
{{#endref}}
|
|
|
|
[**how2heap - large bin attack**](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c) で素晴らしい例を見つけることができます。
|
|
|
|
基本的に、最新の "current" バージョンの glibc (2.35) では、**`P->bk_nextsize`** がチェックされていないため、特定の条件が満たされると、大きなビンチャンクの値で任意のアドレスを変更することができます。
|
|
|
|
その例では、以下の条件が見つかります:
|
|
|
|
- 大きなチャンクが割り当てられる
|
|
- 最初のものより小さいが同じインデックスにある大きなチャンクが割り当てられる
|
|
- ビン内で最初に入る必要があるため、より小さくなければならない
|
|
- (トップチャンクとのマージを防ぐためのチャンクが作成される)
|
|
- その後、最初の大きなチャンクが解放され、それより大きな新しいチャンクが割り当てられる -> Chunk1 が大きなビンに入る
|
|
- 次に、2番目の大きなチャンクが解放される
|
|
- ここで脆弱性:攻撃者は `chunk1->bk_nextsize` を `[target-0x20]` に変更できる
|
|
- その後、チャンク2よりも大きなチャンクが割り当てられるため、チャンク2が大きなビンに挿入され、アドレス `chunk1->bk_nextsize->fd_nextsize` がチャンク2のアドレスで上書きされる
|
|
|
|
> [!TIP]
|
|
> 他にも潜在的なシナリオがありますが、重要なのは、ビン内の現在の X チャンクよりも **小さい** チャンクを大きなビンに追加することです。したがって、それはビン内の X の直前に挿入される必要があり、X の **`bk_nextsize`** を変更できる必要があります。そこに小さいチャンクのアドレスが書き込まれるからです。
|
|
|
|
これは malloc からの関連コードです。アドレスがどのように上書きされたかを理解するためにコメントが追加されています:
|
|
```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
|
|
}
|
|
```
|
|
これは、libcの**`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が必要です。
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|