House of Einherjar
基本情報
コード
または、https://guyinatuxedo.github.io/42-house_of_einherjar/house_einherjar_exp/index.html#house-of-einherjar-explanationから(tcacheを埋める必要があるかもしれません)
ゴール
ほぼ任意の特定のアドレスにメモリを割り当てることです。
必要条件
チャンクを割り当てるときに偽のチャンクを作成します:
サニティチェックをバイパスするためにポインタを自分自身を指すように設定します
1つのチャンクからもう1つのチャンクへのオフバイワンを悪用して、前に使用されたものを変更します
オフバイワンを悪用したチャンクの
prev_size
に、自身と偽のチャンクの間の差を示します偽のチャンクのサイズもサニティチェックをバイパスするために同じサイズに設定されている必要があります
これらのチャンクを構築するには、ヒープリークが必要です。
攻撃
攻撃者が制御するチャンク内に偽のチャンクが作成され、
fd
とbk
が元のチャンクを指すようにして保護をバイパスします他の2つのチャンク(
B
とC
)が割り当てられますB
のオフバイワンを悪用して、prev in use
ビットがクリアされ、prev_size
データがC
チャンクが割り当てられた場所から前に生成された偽のA
チャンクまでの差で上書きされますこの
prev_size
と偽のチャンクA
のサイズは、チェックをバイパスするために同じである必要があります。次に、tcacheが埋められます
次に、
C
が解放され、偽のチャンクA
と統合されます次に、偽の
A
チャンクで始まり、B
チャンクをカバーする新しいチャンクD
が作成されますEinherjarのハウスはここで終わります
これはファストビン攻撃で続けることができます:
B
を解放してファストビンに追加しますB
のfd
を上書きして、D
チャンクを悪用してターゲットアドレスを指すようにします(B
を含んでいるため)次に、2つのmallocが行われ、2番目のmallocがターゲットアドレスを割り当てることになります
参考文献と他の例
ポインタを解放した後、それらがヌルにならないため、データにアクセスすることがまだ可能です。したがって、チャンクはアンソートされたビンに配置され、それが含むポインタをリークします(libcリーク)、そしてそれが取得するポインタからヒープアドレスをリークし、新しいヒープが配置されます。
Last updated