First Fit
Last updated
Last updated
AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)
glibcを使用してプログラム内のメモリを解放すると、異なる"bins"がメモリチャンクを管理するために使用されます。ここでは、一般的な2つのシナリオ、つまりunsorted binsとfastbinsの簡略化された説明を示します。
高速チャンクでないメモリチャンクを解放すると、それはunsorted binに移動します。このbinは、新しく解放されたチャンクが前方("head")に追加されるリストのように機能します。新しいメモリチャンクを要求すると、アロケータはunsorted binを後方("tail")から見て、要求されたサイズに十分なチャンクを見つけます。unsorted binからのチャンクが必要なサイズよりも大きい場合、そのチャンクは分割され、前半部分が返され、残りの部分がbinに残ります。
例:
300バイト(a
)を割り当て、次に250バイト(b
)を割り当て、a
を解放してから再度250バイト(c
)を要求します。
a
を解放すると、unsorted binに移動します。
その後250バイトを再度要求すると、アロケータはa
を末尾で見つけて分割し、要求に合う部分を返し、残りをbinに保持します。
c
は以前のa
を指し示し、a
の内容で埋められます。
Fastbinsは小さなメモリチャンクに使用されます。unsorted binsとは異なり、fastbinsは新しいチャンクを先頭に追加し、最後に追加されたものが最初に取り出される(LIFO)動作を作成します。もしメモリの小さなチャンクをリクエストすると、アロケータはfastbinの先頭から取り出します。
例:
20バイトずつ4つのチャンク(a
、b
、c
、d
)を割り当てます。
任意の順序でそれらを解放すると、解放されたチャンクはfastbinの先頭に追加されます。
その後20バイトのチャンクをリクエストすると、アロケータはfastbinの先頭から最も最近解放されたチャンクを返します。
ARM64。Use after free: ユーザーオブジェクトを生成し、解放し、解放されたチャンクを取得し、その位置に書き込むことで、前のユーザー->パスワードを上書きします。ユーザーを再利用して、パスワードチェックをバイパスします。
プログラムではノートを作成できます。ノートには、malloc(8)でノート情報(呼び出される可能性のある関数へのポインタ)が含まれ、ノートの内容がmalloc(<size>)へのポインタで含まれます。
攻撃方法は、ノート情報サイズよりも大きなmallocコンテンツを持つ2つのノート(note0とnote1)を作成し、それらを解放して高速ビン(またはtcache)に入れることです。
次に、コンテンツサイズが8の別のノート(note2)を作成します。コンテンツはノート1になり、チャンクが再利用されるため、関数ポインタをwin関数を指すように変更し、note1をUse-After-Freeして新しい関数ポインタを呼び出します。
一部のメモリを割り当て、必要な値を書き込み、解放し、再割り当てすることが可能で、以前のデータがまだ残っているため、新しい期待される構造体に従って処理され、値を設定するかフラグを取得することが可能です。
この場合、最初に割り当てられた特定のチャンクに4を書き込む必要があります(それらをすべて強制的に解放した後でも)。 新しく割り当てられた各チャンクには、配列インデックスの番号が格納されます。 次に、4つのチャンク(最初に割り当てられたものを含む)を割り当て、最後のチャンクにはその中に4が含まれています。それらを解放し、最初のチャンクを再割り当てし、最後に解放された最初のチャンクを使用します。それは4が含まれているチャンクです。