2009-03-20 26 views
19

ヒープオーバーフロー攻撃はどのように行われますか?ヒープオーバーフロー攻撃

スタックオーバーフロー攻撃の場合、攻撃者は関数戻りアドレスをそのアドレスに置き換えます。

これはヒープオーバーフロー攻撃でどのように行われますか?また、ヒープからコードを実行することは可能ですか?

答えて

32

これはプラットフォームによって異なり、私の例はあまりにも単純化されています。これは、基本的に、リンクされたリストがオーバーランする可能性のあるマネージャをヒープするようになり、リンクされたリストポインタを使用して、プロセスのメモリのランダムな部分を上書きすることができます。 、次/前のポインタを変更することで

ヒープが解放されます
struct HeapBlockHeader 
{ 
    HeapBlockHeader* next; 
    HeapBlockHeader* prev; 
    int size; 

    // Actual heap buffer follows this structure. 
}; 

は、この制御ブロックが解放されたブロックのリストに戻ります:

私はその制御ブロックのようにしている素朴なヒープ実装を持っている想像してみて。私がヒープバッファをオーバランすると、次のコントロールブロックのポインタを制御しているデータで上書きすることができます。これらのリンクをオーバーライドして、コードへのポインタ(恐らくbuffer I overranにある)とスタック上の関数の戻りアドレスを指すと仮定します。ヒープマネージャがブロックを解放されたリストにリンクしようとすると、スタック上の戻りアドレスを実際に制御しているコードへのポインタで上書きします。 http://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Marinescu.pdf

EDIT: はhttp://www.h-online.com/security/features/A-Heap-of-Risk-747161.html

この記事では、この種の攻撃を防ぐために、Vistaのヒープマネージャに入った硬化のいくつかを説明します

この記事では、ヒープ・オーバーフロー攻撃の素敵な概観を持っている上ヒープからコードを実行する可能性があります。可能です。多くのプラットフォームでは、デフォルトではヒープメモリが実行不能になり、任意のコードを実行する障壁となります。しかし、あなたはまだ "libcへのジャンプ"スタイルの攻撃を行うことができます - リターンアドレスを実行可能な既知の関数に上書きします。

+0

偉大な答えは - 私はプログラミングの私の特定の領域について多くのことを知っていることを感じて、私は、コンパイラ、メモリ管理、保護メカニズムに飛び込むことができていたことがありません - プロセッサのresponsibitiesが停止し、OSの起動場所を知っています。次に、OSとアプリコードの間で再び。私はIntelのx86マニュアル(vol 1)のカバーを読んでいます。あなたはどうやってこれらのことを学びましたか? –

関連する問題