C#Stack Overflow覆盖EIP

时间:2012-03-17 17:07:50

标签: c# stack overflow overwrite eip

我想编写一个易受攻击的程序,以便更好地理解c#中的Stack Overflow(原因),以及用于教育目的。基本上,我“只是”想要一个堆栈溢出,它会覆盖EIP,所以我可以控制它并可以指向我自己的代码。 我的问题是:哪些对象使用堆栈作为内存位置? 例如:程序使用递归的逐字节读取来解析文本文件,直到找到换行符(是的,我认为没有人会这样做,但这只是为了学习......)。目前,我在文本文件中追加一个字符串,其中包含字符的十六进制值。此字符串是在调用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

BTW我正在使用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的内容)?

2 个答案:

答案 0 :(得分:4)

你可以在C和C ++中利用堆栈损坏的原因是因为你自己处理内存而且语言允许你做各种疯狂的事情。 C#在专门设计用于防止许多这些问题的环境中运行。即虽然您可以在C#中轻松生成堆栈溢出,但您无法使用托管代码修改程序的控制流。

对托管环境的攻击方式通常可以通过打破沙箱来实现。只要代码在沙箱中运行,就会有很多这些技巧无法正常工作。

如果你想了解堆栈损坏,我建议你坚持使用C或C ++。

答案 1 :(得分:0)

我对你所尝试的内容的描述并不完全清楚。堆栈溢出通常不会“覆盖EIP”。

为了导致堆栈溢出,最直接的方式就是这样。

void RecursiveMethod()
{
    RecursiveMethod();
}

由于对此方法的每次调用都会将返回地址存储在堆栈中,因此无需返回就无休止地调用它将最终耗尽所有堆栈空间。当然,现代Windows应用程序有大量的堆栈空间,因此可能需要一段时间。您可以通过在方法中添加参数或局部变量来增加每个调用的堆栈使用量。