2

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

(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;
    }
}

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

4

2 に答える 2

4

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

管理された環境に対するエクスプロイトが通常機能する方法は、いわばサンドボックスから抜け出すことです。コードがサンドボックスで実行される限り、これらの多くのトリックは機能しません。

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

于 2012-03-17T17:32:31.373 に答える
0

あなたが試したことの説明については、完全にはわかりません。通常、スタック オーバーフローは「EIP を上書き」しません。

スタック オーバーフローを引き起こす最も簡単な方法は、次のようなものです。

void RecursiveMethod()
{
    RecursiveMethod();
}

このメソッドを呼び出すたびにリターン アドレスがスタックに格納されるため、このようにエンドレスにリターンせずに呼び出すと、最終的にすべてのスタック スペースが使用されます。もちろん、最新の Windows アプリケーションには大量のスタック スペースがあるため、しばらく時間がかかる場合があります。メソッド内に引数またはローカル変数を追加することで、呼び出しごとのスタック使用量を増やすことができます。

于 2012-03-17T17:12:03.293 に答える