2012-03-17 8 views
2

C#のスタックオーバーフロー(原因)を理解しやすくするため、また教育上の目的で、脆弱なプログラムを作成したいと考えています。基本的には、スタックオーバーフローが必要で、EIPを上書きするので、私はそれを制御して自分のコードを指すことができます。 私の問題は次のとおりです。どのオブジェクトがメモリの場所としてスタックを使用していますか? 例:プログラムは、行区切りが見つかるまで、再帰的なバイト・リーディングでテキスト・ファイルを解析します(ええと、誰もこれをしないと思いますが、これは学習のためだけです)。現在、テキストファイルにcharの16進数の文字列を追加しています。この文字列は、main()を呼び出した後にインスタンス化されるオブジェクトのフィールドです。 はWinDbgのを使用して、私は、スタックが(ほぼ)無限再帰から溢れ出た後に、これらの値を得た:C#のスタックオーバーフローの上書きEIP

(14a0.17e0): Break instruction exception - code 80000003 (first chance) 
eax=00000000 ebx=00000000 ecx=0023f618 edx=778570b4 esi=fffffffe edi=00000000 
eip=778b04f6 esp=0023f634 ebp=0023f660 iopl=0 

これは興味からのものである場合ところで、私は、Win7x86 AMDマシンを使用しています。 私はstrcpyを使ってスタックオーバーフローを引き起こす多くのC++の例を見てきましたが、C#で同様のメソッドがありますか?

よろしく、 NOMAD

編集:私は、スタックオーバーフローを引き起こすために、このコードを使用します。

class FileTest 
{ 
    FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read); 
    string line = String.Empty; 
    public FileTest() 
    { 
     Console.WriteLine(ReadTillBreak()); 
    } 

    private string ReadTillBreak() 
    { 
     int b = 0; 
     b = fs.ReadByte(); 
     line += (char)b; 
     if (b != 13) 
      ReadTillBreak(); 
     return line; 
    } 
} 

スタックをオーバーフローさせ、ライン文字列(つまり、test.txtの内容)でeipに書き込むことはできますか?

+0

管理対象システムの脆弱性を理解したい場合は、Erez Metulaの管理コードルートキットに関する優れた本を参照してください。http://www.amazon.com/Managed-Code-Rootkits-Hooking-Environments/dp/1597495743/ ref = sr_1_1?ie = UTF8&qid = 1332014581&sr = 8-1 – zmbq

答えて

4

CやC++でスタックの破損を悪用する理由は、メモリを自分で処理することができ、あらゆる種類の狂ったことを行うことができるからです。 C#は、これらの問題の多くを防ぐために特別に設計された環境で動作します。私。 C#でスタックオーバーフローを簡単に生成することはできますが、マネージコードを使用してプログラムの制御フローを変更することはできません。

通常、管理対象環境に対する悪用方法は、サンドボックスから切り離して発声する方法です。コードがサンドボックス内で実行されている限り、単純に機能しないこれらのトリックがたくさんあります。

スタックの破損について知りたい場合は、CまたはC++に固執することをお勧めします。

+0

管理コードに言及する場合+1。 –

+0

ohええ、これは意味があります。私はすでに.net VMがそのようなことを防ぐことを考えていましたが、これは私の好きなプログラミング言語では可能だと思っていました。助けてくれてありがとう – NoMad

0

私は、あなたが試みたことの説明を完全には明確にしていません。スタックオーバーフローは、一般に「EIPを上書きしない」。

スタックオーバーフローを引き起こすために、最も直接的な方法は次のようなものです。

void RecursiveMethod() 
{ 
    RecursiveMethod(); 
} 

このメソッドを呼び出すたびは、最終的にはすべてのスタック領域を使用します戻らず、このように延々とそれを呼び出して、スタック上のリターンアドレスを格納しているので。もちろん、現代のWindowsアプリケーションにはスタックがたくさんあるため、しばらく時間がかかります。メソッド内に引数またはローカル変数を追加することで、各呼び出しのスタック使用量を増やすことができます。

+0

私は上記のコードを投稿しました。だから、スタックスペースは、引数ではなく、ローカル変数で使われますか? – NoMad

+0

@ NoMad - 最初にスタックがあると仮定します。 –

関連する問題