static unsafe void Main(string[] args)
{
Console.WriteLine(Change_Result());
Console.ReadLine();
}
static unsafe int Change_Result()
{
int i = 0;
//变量result,默认的返回值
int result = 123;
//申请一段栈内存,大小可随意设置
int* p = stackalloc int[1];
//从当前栈地址开始向下查找与函数返回值相匹配的地址,一旦匹配则修改为10000
while (true)
{
if (p[++i] == 123)
{
p[i] = 10000;
break;
}
};
return result;
}
变量result作为方法的返回值默认为123,并且没有任何显式修改其值的代码,关键在这里
{
if (p[++i] == 123)
{
p[i] = 10000;
break;
}
}
这段代码找到值为123的内存地址(也就可能是变量result的地址),然后将其值修改为10000,当然,函数返回值就肯定不会再是原先的123咯
这就是经典的StackOverFlow的两个例子,希望通俗易懂能让大家所接受,另外缓冲区溢出并不只是改变内存的值,在高手的手里,他还可以执行任意代码,因为方法执行的时候总会有一个指针指向方法即将执行的下一条指令,如果控制了这个指针,就控制了进程。