我查看了metasploit meterpreter源代码,发现它通过将其转换为函数指针来执行shell代码,而不将页面保护设置为page_execute,我还看到github上的一些源代码这样做,例如nullcrypter和 但是在 Visual Studio 中,如果我尝试这样做,它会导致访问冲突,如微软文档中所述,所以这对于 mingw 来说是特别的还是背后有一些技巧
最佳答案
without setting page protect as page_execute
这是不正确的;从您的代码:
unsigned char* exec = (unsigned char*)VirtualAlloc(NULL, PAYLOAD_LENGTH/2 ,0x1000,0x40);
//...
((void (*)())exec)();
注意 VirtualAlloc
的最后一个参数是 0x40
,即 PAGE_EXECUTE_READWRITE
,因此无论编译器如何,您都会获得从一开始就可以执行的内存。 MinGW 在这方面没有做任何特别的事情,可执行位已经可以了。
如果此代码在 VC++ 中失败,可能是由于其他一些不兼容性 - 也许您在有效负载代码为 32 位时以 64 位模式进行编译?
关于c - mingw 是否允许在没有 page_execute 的情况下执行字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49253684/