ヒープオーバーとuse after freeの違い


文章の訳本:http://www.thegreycorner.com/2010/03/difference-between-heap-overflow-and.html
レベルが限られているので、原文を見に行ってもいいです.この文章は後ろにいくつかのプログラムを加えています.
先日、私のブログの読者からの質問を受けましたが、彼はヒープオーバーとuse after freeホールの違いについて聞きたいです.考えてみましたが、これはいい話題になりますので、この文章を書きました.
        
今はこの問題に答える前に、メモリ管理の仕組みと関連した理論について話しておきたいです.
        
メモリ管理には、重要なデータ構造の2つがあります.スタックは、主に関数を格納するための局所変数と関数によって呼び出されるデータとして後進先に出る構造である.スタック作業時は、スタックの上からデータを入れたり、データを除去したりすることができます.上から二つ目の「皿」を外したいなら、上のものを先に移してください.スタックは非常に単純な構成であり、X 86プロセッサにはレジスタとコマンドと、アセンブリ言語とがあり、管理およびアクセスする.
        
ヒープは、プロセスがグローバル変数を格納するために使用されるか、またはスタックの空間が不足し、変数のサイズを満たすために格納されるメモリ空間です.x 86プロセッサとアセンブリ言語には専用のレジスタとコマンドがなく、高レベルの関数で管理されています.これらの関数は一回C言語で書かれています.windows、GNU/linuxなどのシステムに含まれています.
        
オーバーフローの観点から、スタックとスタック管理の違いにより、OllyDbgなどのアセンブラがスタックとスタックの変化を比較すると、スタックの変化についていけなくなり、スタックベースのオーバーフローがより使いにくくなります.しかし、これらは管理機構の複雑さを増し、異なるタイプの利用可能な脆弱性も同様に提供する.だから、ヒープやスタックの中のバッファが溢れているほか、ヒープの中にはuse after freeというホールがあります.
        
use after freeというタイプの脆弱性の出現を考慮すると、ヒープ管理機構が追加的に導入された複雑な管理機構によって引き起こされる.私たちはまず、ヒープがどのように働いているかを理解し、use after freeとスタックオーバーフローの脆弱性を理解し、それらの違いを理解しなければならない.私たちはWindowsオペレーティングシステムの管理方法を例として使用します.
        
 windowsでは、プロセス毎に、デフォルトのプロセススタックと他のダイナミックアプリケーション指定サイズを含む1つ以上のヒープがプログラムデータとして使用されています.動的申請ヒープはHeappCreate()関数で申請できます.各ヒープは、任意の大きさのブロックを有することができ、malloc()、Heao Alloc()、LocalAlloc()、Global Alloc()またはRtkAllocateHeap()によって割り当て空間を申請することができます.
        
申請空間がある以上、同様に釈放することも必要です.メモリ空間を再利用できるように、必要でない時に.HeappreFree()やHeappreAlloc()などの関数は、ヒープの中でリリースし、ヒープ空間の割り当てを再申請するために使います.
        
もちろん、ヒープの中で空間の割り当てを申請できる関数または方法を追跡する必要があります.これらは、ヒープ・ベース・アドレスの広い範囲のデータ構造の中で見つけることができ、どのブロックが割り当てられているかを識別するために、各ブロックの入口アドレスが記録されています.割り当てられたブロックと割り当てられていないブロックの各々には、ブロックの先頭があり、上述した各種ヒープ管理関数は、アプリケーションとリリース空間の両方にこれらの構造を使用して動作します.同様に、ヒープベースのオーバーフローも、これらの同じヒープ管理関数を利用して、CPUがヒープを破壊する構造を制御するものである.
        
 特に、スタックオーバーフローはブロックのオーバーフローとブロックのブロックヘッダを書き換えることによって作業され、次のブロックには他のスタックの入口アドレスまたはリリースされたスタックのブロック(それぞれ前に述べたブロックヘッダを含む)が含まれていてもよい.その後、ヒープマネージャがブロックを操作する時(例えば、新しいブロックを申請する)、操作の空間が書き換えられたブロックを指しています.この転位のブロックの最初はヘッド管理関数によってアクセスできますが、これは異常を生じ、適切な条件で利用できます.前述したように、これらのホールを利用して、オペレーティング・スタック管理の関数が含まれているので、これらの関数が変更された場合(windows xp sp 2に導入されたセキュリティ除去機能のような)、オーバーフローしたいくつかの編集のexpがより利用しにくくなることに注意が必要です.
 Useafter freeの利用操作はヒープオーバーとは少し違っています.まず、ヒープブロックを指すアドレスが必要です.(HeappAllocを通じて)申請してからリリースして、その後、リリース操作後に再度使用します.これらのリリースされたブロックが利用されると、プロセスを制御する機会が発生する可能性があります.
        
プログラム:
Example 1:
#include 
#include 
#define BUFSIZER1 512
#define BUFSIZER2 ((BUFSIZER1/2) - 8)
int main(int argc, char **argv) {
char *buf1R1;
char *buf2R1;
char *buf2R2;
char *buf3R2;
buf1R1 = (char *) malloc(BUFSIZER1);               //    
buf2R1 = (char *) malloc(BUFSIZER1);               //    
free(buf2R1);                                                 //  
buf2R2 = (char *) malloc(BUFSIZER2);
buf3R2 = (char *) malloc(BUFSIZER2);
strncpy(buf2R1, argv[1], BUFSIZER1-1);             //      ,    buf2R1
free(buf1R1);
free(buf2R2);
free(buf3R2);
}
Example 2:
char* ptr = (char*)malloc (SIZE);
if (err) {
abrt = 1;
free(ptr);
}
...
if (abrt) {
logError("operation aborted before commit", ptr);
}
        ,      。            logError   。