我想编写一个易受攻击的程序,以更好地理解 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;
}
}
是否可以溢出堆栈并使用行字符串写入eip(因此,test.txt的内容)?