1

如下代码应该能够“测试”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 位,但是没有更好的方法来做这个测试吗?

4

2 回答 2

1

分配一个可写且可执行的内存区域(例如使用mmapand mprotect)并将您的代码放在那里,然后像您一样调用它main。在 W^X、PaX 等可执行空间保护的情况下,您可以首先使您的内存区域可写以复制 shellcode,然后仅可执行以执行它,但是您的里程可能会根据保护措施的不同而有所不同.

于 2013-03-12T12:51:53.603 回答
0

如果您只想测试功能,则可以在函数中编写相应的程序集。但是,这只会测试程序集,而不是作为字节串的 shellcode,并且如果您的 shellcode 不是由程序集严格生成的(例如,如果您跳转到“不存在”指令的中间),那将无法正常工作。在这种情况下,您必须将代码推送到可执行内存中。您可以自己分配它,或覆盖现有的 .text 部分(但您需要禁用只读)。

于 2015-01-19T13:03:45.927 回答