C#堆栈溢出覆盖EIP

C#堆栈溢出覆盖EIP,c#,stack,overflow,overwrite,eip,C#,Stack,Overflow,Overwrite,Eip,我想写一个易受攻击的程序,以便更好地理解c#中的堆栈溢出(原因),同时也是出于教育目的。基本上,我“只是”想要一个堆栈溢出,它会覆盖EIP,所以我可以控制它并指向我自己的代码。 我的问题是:哪些对象使用堆栈作为内存位置? 例如:程序使用递归字节读取解析文本文件,直到找到换行符为止(是的,我认为没有人会这样做,但这只是为了学习…)。目前,我正在一个文本文件中添加一个字符串,其十六进制值为chars。此字符串是调用main()后实例化的对象的字段。 使用WinDbg,我在堆栈从(几乎)无休止的递归溢

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

中有类似的方法吗? 致以最良好的祝愿, 游牧民族

编辑:我使用此代码导致堆栈溢出

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?

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

要导致堆栈溢出,最直接的方法是这样

void RecursiveMethod()
{
    RecursiveMethod();
}

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

我不太清楚您对尝试的内容的描述。堆栈溢出通常不会“覆盖EIP”

要导致堆栈溢出,最直接的方法是这样

void RecursiveMethod()
{
    RecursiveMethod();
}

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

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

针对托管环境的攻击通常是通过打破沙箱来工作的。只要代码在沙箱中运行,就会有很多这些技巧根本不起作用


如果你想了解栈损坏,我建议你坚持C或C++。<你可以利用C和C++中的堆栈损坏的原因是因为你自己处理内存,语言允许你做各种疯狂的事情。C#运行在专门设计的环境中,以防止出现大量此类问题。也就是说,虽然您可以在C#中轻松生成堆栈溢出,但您无法使用托管代码以这种方式修改程序的控制流

针对托管环境的攻击通常是通过打破沙箱来工作的。只要代码在沙箱中运行,就会有很多这些技巧根本不起作用


如果你想了解栈损坏,我建议你坚持C或C++。 我把代码贴在上面了。那么,堆栈空间是由参数和局部变量使用的,而不是字段?@NoMad-假设首先有一个堆栈。我在上面发布了我的代码。那么,堆栈空间是由参数和局部变量使用的,而不是字段?@NoMad-假设首先有一个堆栈。哦,是的,现在这是有意义的,我已经考虑过.net VM阻止这样的事情,但我希望这在我最喜欢的编程语言中是可能的。谢谢你的建议哦,是的,现在这是有意义的,我已经考虑过.NETVM阻止这样的事情,但是我希望这在我最喜欢的编程语言中是可能的。感谢您的建议如果您想了解托管系统的漏洞,请查阅Erez Metula关于托管代码rootkits的优秀书籍:如果您想了解托管系统的漏洞,请查阅Erez Metula关于托管代码rootkits的优秀书籍: