Large Bin Attack
基本情報
大きなビンとは何かについての詳細情報は、次のページを参照してください:
pageBins & Memory Allocationshow2heap - large bin attack に素晴らしい例が見つかります。
基本的に、最新の「現在の」glibc(2.35)では、P->bk_nextsize
がチェックされていないため、特定の条件が満たされると大きなビンチャンクの値で任意のアドレスを変更できます。
その例では、次の条件が見つかります:
大きなチャンクが割り当てられている
最初のものよりも小さいが同じインデックスにある大きなチャンクが割り当てられている
ビン内で最初に行く必要があるため、それよりも小さくなければならない
(トップチャンクとのマージを防ぐチャンクが作成される)
次に、最初の大きなチャンクが解放され、それよりも大きな新しいチャンクが割り当てられる -> チャンク1 が大きなビンに移動
次に、2番目の大きなチャンクが解放される
ここで、脆弱性: 攻撃者は
chunk1->bk_nextsize
を[target-0x20]
に変更できる次に、チャンク2よりも大きなチャンクが割り当てられると、チャンク2 が大きなビンに挿入され、アドレス
chunk1->bk_nextsize->fd_nextsize
がチャンク2 のアドレスで上書きされます
他の潜在的なシナリオがありますが、大きなビンに 現在のXチャンクよりも小さい チャンクを追加することが重要です。そのためには、ビン内でそれよりも前に挿入する必要があり、X の bk_nextsize
を変更できる必要があります。それが小さなチャンクのアドレスが書き込まれる場所です。
これはmallocからの関連するコードです。アドレスがどのように上書きされたかをよりよく理解するためにコメントが追加されています:
これは、global_max_fast
グローバル変数を上書きして、その後大きなチャンクで高速ビン攻撃を行うために使用できます。
この攻撃の別の素晴らしい説明をguyinatuxedoで見つけることができます。
Last updated