如下代码应该能够“测试”shellcode,即执行它。
char shellcode[] = "...";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) shellcode;
(int)(*func)();
}
但是,当我尝试使用此类示例时,我发现代码似乎在不可执行的内存中执行,因为它在 shellcode 的第一条指令处接收到段错误。
如果我将 shellcode 声明改为 a #define
,我可以让 shellcode 执行。然而,当 shellcode 尝试写入自己的内存时,它会停止(这个 shellcode 假设它是在堆栈上执行的)。
所以我的问题很简单,测试假设可执行(显然)和可写内存的 shellcode 的最简单和可靠的方法是什么?如果我在堆栈或堆上分配代码并尝试跳转到它,我只会遇到 NX 位保护并再次失败。现在显然我可以禁用 NX 位,但是没有更好的方法来做这个测试吗?