House of Force
基本情報
コード
このテクニックは修正されました(こちら)し、このエラーが発生します:
malloc(): corrupted top size
テストしたい場合は、こちらからコードを取得できます。
ゴール
この攻撃の目標は、特定のアドレスにチャンクを割り当てることです。
必要条件
ヘッダーのトップチャンクサイズを上書きできるオーバーフロー(例:-1)が許可されるオーバーフロー
ヒープ割り当てのサイズを制御できること
攻撃
攻撃者がアドレスPにチャンクを割り当てて値を上書きしたい場合、まずトップチャンクサイズを-1
で上書きします(おそらくオーバーフローを使用)。これにより、mallocは常に十分なスペースを持つトップチャンクを使用しないため、どの割り当てにもmmapを使用しなくなります。
次に、トップチャンクのアドレスとターゲットスペースを割り当てるための距離を計算します。このサイズでmallocが実行されると、トップチャンクがその位置に移動されます。差分/サイズを簡単に計算する方法は次のとおりです:
したがって、target - old_top - 4*sizeof(long)
のサイズをアロケートすることで(4つのlongは、トップチャンクと新しいチャンクのメタデータのためです)、トップチャンクを上書きしたいアドレスに移動させることができます。
その後、別のmallocを行い、書き込むターゲットアドレスを含むチャンクを取得します。
参考文献と他の例
このシナリオの目標は、ret2winであり、ret2win関数のアドレスによって呼び出される関数のアドレスを変更する必要があります
バイナリには、トップチャンクのサイズを変更することができるオーバーフローがあり、これは-1またはp64(0xffffffffffffffff)に変更されます
次に、上書きするポインタが存在する場所へのアドレスが計算され、現在のトップチャンクの位置からそこまでの差が
malloc
でアロケートされます最後に、この望ましいターゲットを含む新しいチャンクがアロケートされ、ret2win関数によって上書きされます
Input your name:
には、ヒープからアドレスをリークさせることができる初期の脆弱性があります次に、
Org:
およびHost:
機能では、org nameを求められたときにs
ポインタの64Bを埋めることができ、スタック上ではv2
のアドレスが続き、その後に指定されたhost nameが続きます。その後、strcpyがsの内容をサイズ64Bのチャンクにコピーしようとするため、host nameに入れられたデータでトップチャンクのサイズを上書きすることができます。任意の書き込みが可能になったので、
atoi
のGOTをprintfのアドレスに上書きしました。%24$p
でIO_2_1_stderr
のアドレスをリークさせることができ、このlibcリークを使用してatoi
のGOTを再度system
のアドレスに上書きし、/bin/sh
をパラメータとして渡して呼び出すことができました。この他の解説で提案されている代替方法は、
free
をputs
で上書きし、後で解放されるポインタにatoi@got
のアドレスを追加し、それをリークさせ、このリークを使用して再度atoi@got
をsystem
に上書きし、/bin/sh
で呼び出すことができます。ポインタをクリアせずに解放されたチャンクを再利用できるUAFがあります。いくつかの読み取りメソッドがあるため、ここでGOTにfree関数へのポインタを書き込み、その後read関数を呼び出すことでlibcアドレスをリークさせることができます。
次に、UAFを悪用してHouse of forceを使用して、左側のスペースのサイズを-1で上書きし、freeフックに到達するのに十分な大きさのチャンクを割り当て、その後、freeフックを含む別のチャンクを割り当てます。その後、フックに
system
のアドレスを書き込み、チャンクに"/bin/sh"
を書き込み、最後にその文字列内容でチャンクを解放します。
Last updated