ソース
1の#include <stdio.hの> 2の#include <stdint.h> 3の#include <STDLIB.H> 4 5 INT メイン(){ 6 ボイド * P1 = のmalloc(0x40の)。 7 ボイド * P2 = のmalloc(0x40の)。 8 関数fprintf(stderrに、" 割り当て2 fastbins:P1 =%P P2 =%P N \ " 、P1、P2)。 9 関数fprintf(stderrに、" 今、自由P1 \ N!" ); 10 フリー(P1)。 11 12 無効 * P3 = のmalloc(0x400 )。 13 関数fprintf(stderrに、" malloc_consolidateをトリガするために割り当てられた大型のビン():P3 =%P \ n " 、P3)。 14 関数fprintf(stderrに、" malloc_consolidate()において、P1はソートされていないビンに移動されます。\ n " ); 15 フリー(P1)。 16 関数fprintf(stderrに、" 二重解放の脆弱性をトリガ\ n個!" ); 17 関数fprintf(stderrに、" p1は速いトップではありませんので、我々は、malloc関数()にチェックを渡すことができます\ N。" ); 18 関数fprintf(stderrに、"今P1ソートされていないビンと速いビンです。だから、それを2回取得we'will:%pが%のp \ nを"、malloc関数(0x40の)、のmalloc(0x40の)); 19 }
業績
checksec
最初のサイズ範囲のfastbin内、メモリの2つの0x40の量P1、P2を適用
リリースP1の後
)400バイトP3のために適用します(小ビントリガーmalloc_consolidateに属し
小さなビンにP1のfastbin
この時点で、p1が頭をfastbinされていません
それは再び解放することができます
リリース後
両方のP1でfastbinと小さなビン
再びアプリケーションには、次の2つの点P1のメモリを取得することができます
図デバッグを得る、ことが理解さは、最初の削除fastbin P1では、次に小さなビンP1を削除します
これは二重の自由をもたらしました