我正在看这个例子,w.r.t在堆栈中执行代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char shellcode[] = “\xeb\xfe”;
int main(int argc, char *argv[]){
void (*f)();
char x[4];
memcpy(x, shellcode, sizeof(shellcode));
f = (void (*)()) x;
f();
}
这会导致分段错误。我的理解是因为shellcode的剩余字节耗尽了内存,因为x的大小只有4个字节。这导致创建一个复制到堆栈内存的写操作,并导致seg。堆栈内存是只读的错误。 我的理解是否正确?
答案 0 :(得分:2)
你正在运行什么操作系统?
引用Mac Hacker's Handbook:
Leopard不会在内存的任何部分设置XD位 堆。 目前还不清楚这是一个错误,一个疏忽,还是故意的, 但即使软件的内存权限设置为 不可执行,你仍然可以执行除堆栈之外的任何地方。该 以下简单程序说明了这一点。
[你的片段如下]
(强调我的。)
如果权限设置为nonexecutable(或者完全省略权限),代码应该是段错误的。它没有出现在Leopard上,即便是作者提问。您观察到的是现代操作系统的完全正常行为。
我想补充一点:尝试通过调试器运行它。 \xeb\xfe
是一个无限循环,但从技术上讲,你甚至不应该循环一次。操作系统应该拍你的手腕(这显然发生在这里)。