下面这样的代码应该能够“测试”外壳代码,即执行它。
char shellcode[] = "...";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) shellcode;
(int)(*func)();
}但是,当我尝试使用这样的示例时,我发现代码似乎是在不可执行的内存中执行的,因为它在外壳代码的第一条指令处接收到segfault。
如果我将外壳代码声明改为#define,我就能够让外壳代码执行。但是,外壳代码在尝试写入自己的内存时停止(该外壳代码假设它在堆栈上执行)。
所以我的问题很简单,测试假设可执行(显然)和可写内存的外壳代码的最简单和可靠的方法是什么?如果我分配堆栈或堆上的代码并尝试跳转到它,我将会遇到NX位保护,并再次失败。现在很明显,我可以禁用NX位,但是没有更好的方法来做这个测试吗?
发布于 2013-03-12 20:51:54
分配一个可写和可执行的内存区域(例如,使用mmap和mprotect)并将代码放在那里,然后像main一样调用它。在W^X、PaX等可执行空间保护的情况下,您可以首先将内存区设置为可写以复制外壳代码,然后将其设置为可执行,但您的里程数可能会因保护措施的不同而有所不同。
发布于 2015-01-19 21:03:46
如果你想要的只是测试功能,你可以在一个函数中编写相应的程序集。然而,这只会测试程序集,而不是字节串形式的外壳代码,如果外壳代码不是严格地由汇编生成的(例如,如果你跳到“不存在”指令的中间),就不会工作。在这种情况下,您必须将代码推送到可执行内存中。您可以自己分配它,或者覆盖现有的.text部分(但您需要禁用只读)。
https://stackoverflow.com/questions/14323658
复制相似问题