House of Force
基本情報
コード
ゴール
この攻撃の目的は、特定のアドレスにチャンクを割り当てることです。
必要条件
上部チャンクヘッダーのサイズを上書きできるオーバーフローが必要です(例: -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