-
-
[求助]VS2008堆栈不可执行的问题
-
发表于:
2010-12-28 18:01
7999
-
今天看到别人提了个问题:windows中内存如果是RW的话,是否就是RWE?刚好我也有同样的疑问,所以上来问问。
早些时候,我在VS08里面测试过类似代码:
(注:我的是win7系统)
void main()
{
char s[]="\x90\x90\x90\xc3";
((void (__stdcall*)())&s[0])();
}
VS08中编译成功,运行失败,原因是xx内存不能执行。
加上
DWORD a;
VirtualProtect(s,6,PAGE_EXECUTE_READWRITE,&a);
后运行成功。
这说明VS08中,堆栈必须要指定RWE才能执行
OK,换VC6.0的编译器
VirtualProtect(s,6,PAGE_EXECUTE_READWRITE,&a);
执行成功。
VirtualProtect(s,6,PAGE_READWRITE,&a);
依然执行成功。
这下我郁闷了,OD中alt+M,均为 RW 保护。RW我明白,“保护”何意?
还有为何同样的代码,VS08中堆栈不可执行,VC6就可以?什么标志位不同?求解!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课