以下代码应该能够“测试”shellcode,即执行它。
char shellcode[] = "...";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) shellcode;
(int)(*func)();
}
但是,当我尝试使用这样的示例时,我得到的是代码似乎在不可执行的内存中执行,因为它在shellcode的第一条指令处收到了段错误。
如果我将shellcode声明更改为#define
,我可以让shellcode执行。但是,shellcode在尝试写入自己的内存时会停止(这个shellcode假设它在堆栈上执行)。
所以我的问题很简单,测试shellcode的最简单可靠的方法是假设可执行(显然)和可写内存?如果我在堆栈或堆上分配代码并尝试跳转到它,我将进入NX位保护并再次失败。现在显然我可以禁用NX位,但是没有更好的方法来进行测试吗?
答案 0 :(得分:0)
分配可写和可执行的内存区域(例如,使用mmap
和mprotect
)并将代码放在那里,然后将其称为main
。在W ^ X,PaX等可执行空间保护的情况下,您可以首先使您的存储区域可写复制shellcode,然后执行只执行它,但您的里程可能会根据现有的保护而有所不同
答案 1 :(得分:0)
如果你想要的只是测试功能,你可以在一个函数中编写相应的程序集。但是,这只是测试程序集,而不是shellcode作为bytestring,如果你的shellcode不是由程序集严格生成的(例如,如果你跳到"不存在的"指令的中间),那就赢了&#39工作。在这种情况下,您必须将代码推送到可执行内存中。您可以自己分配,或覆盖现有的.text部分(您需要禁用只读)。