hacktricks/binary-exploitation/heap/use-after-free/first-fit.md

6.6 KiB
Raw Blame History

First Fit

ゼロからヒーローまでのAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricks をサポートする他の方法:

First Fit

glibcを使用してプログラム内のメモリを解放すると、異なる "bins" がメモリチャンクを管理するために使用されます。ここでは、2つの一般的なシナリオ、unsorted bins と fastbins の簡略化された説明があります。

Unsorted Bins

高速チャンクでないメモリチャンクを解放すると、それはunsorted binに移動します。このbinは、新しく解放されたチャンクが前方"head"に追加されるリストのように機能します。新しいメモリチャンクを要求すると、アロケータはunsorted binを後方"tail"から見て、必要なサイズのチャンクを見つけます。unsorted binからのチャンクが必要なサイズよりも大きい場合、分割され、前半部分が返され、残りの部分がbinに残ります。

例:

  • 300バイト (a) を割り当て、次に250バイト (b) を割り当て、a を解放してから再度250バイト (c) を要求します。
  • a を解放すると、unsorted binに移動します。
  • 次に250バイトを要求すると、アロケータはtailでaを見つけ、それを分割して、リクエストに合う部分を返し、残りをbinに保持します。
  • c は以前の a を指し示し、a で埋められます。
char *a = malloc(300);
char *b = malloc(250);
free(a);
char *c = malloc(250);

Fastbins

Fastbinsは小さなメモリチャンクに使用されます。Unsorted binsとは異なり、fastbinsは新しいチャンクを先頭に追加し、最後に追加されたものが最初に取り出されるLIFO動作を作成します。もしメモリの小さなチャンクをリクエストすると、アロケータはfastbinの先頭から取り出します。

例:

  • 20バイトずつ4つのチャンクabcd)を割り当てます。
  • 任意の順序でそれらを解放すると、解放されたチャンクはfastbinの先頭に追加されます。
  • その後20バイトのチャンクをリクエストすると、アロケータはfastbinの先頭から最も最近解放されたチャンクを返します。
char *a = malloc(20);
char *b = malloc(20);
char *c = malloc(20);
char *d = malloc(20);
free(a);
free(b);
free(c);
free(d);
a = malloc(20);   // d
b = malloc(20);   // c
c = malloc(20);   // b
d = malloc(20);   // a

その他の参考文献と例

  • https://heap-exploitation.dhavalkapil.com/attacks/first_fit
  • https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/
  • ARM64。Use after free: ユーザーオブジェクトを生成し、解放し、解放されたチャンクを取得し、そのチャンクに書き込みを許可するオブジェクトを生成し、以前のものからuser->passwordの位置を上書きします。ユーザーを再利用してパスワードチェックをバイパスします。
  • https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example
  • プログラムはートを作成することを許可します。ートには、malloc(8)でート情報呼び出される可能性のある関数へのポインタを持つと、ートの内容を持つ別のmalloc(<size>)へのポインタがあります。
  • 攻撃は、ート情報サイズよりも大きなmallocコンテンツを持つ2つのートnote0とnote1を作成し、それらを解放して高速ビンまたはtcacheに入れることです。
  • 次に、コンテンツサイズが8の別のートnote2を作成します。コンテンツはート1になり、チャンクが再利用されるため、関数ポインタをwin関数を指すように変更し、その後、note1をUse-After-Freeして新しい関数ポインタを呼び出します。
  • https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html
  • 一部のメモリを割り当て、必要な値を書き込み、解放し、再割り当てすることが可能で、以前のデータがまだ残っているため、新しい期待される構造体に従って処理され、値を設定するかフラグを取得することが可能です。
  • https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html
  • この場合、最初に割り当てられた特定のチャンクに4を書き込む必要がありますそれらをすべて強制的に解放した後でも。 新しく割り当てられた各チャンクには、配列インデックスの番号が格納されます。 次に、4つのチャンク最初に割り当てられたものを含むを割り当て、最後のチャンクにはその中に4が含まれています。それらを解放し、最初のチャンクを再割り当てし、最後に解放された最初のチャンクを使用します。それは中に4が含まれているチャンクです。