关于同一消息还有其他问题,但是当我尝试执行调用某些函数的机器代码字符串时,我似乎特别遇到了这个问题。在我的情况下,我调用了 exit(0),当在同一程序中以 C 语言调用时,它工作正常。但是,如果作为练习,我将 EIP 设置为某个机器代码的地址(您可以称其为“shellcode”),例如
const char code[] =
"\x6A\x00" // push 0"
"\xFF\x15\x00\x00\x00\x00" //system call, 'read access violation': call dword ptr [__imp__exit]
"\x5D" //pop ebp
"\xC3"; //ret
我将收到消息“访问冲突读取位置 0x00000000。”。"\x6A\x00" 指令将运行,但对 exit(0) 的调用将引发此异常。
这是在 VS2010 中使用 /GS- 编译的 C,并且还运行具有执行权限的“shellcode”,但是仍然存在某种不可执行的内存或堆栈保护吗?为什么这条指令会导致错误?
int main()
{
void *exec = VirtualAlloc(0, sizeof(code), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, code, sizeof(code));
//EIP = exec in debug->immediate
exit(0);
}