理解在堆栈中执行c代码(Mac黑客手册代码)

时间:2012-02-05 00:17:41

标签: c stack shellcode

我正在看这个例子,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。堆栈内存是只读的错误。 我的理解是否正确?

1 个答案:

答案 0 :(得分:2)

你正在运行什么操作系统?

引用Mac Hacker's Handbook:

  

Leopard不会在内存的任何部分设置XD位   堆。 目前还不清楚这是一个错误,一个疏忽,还是故意的,   但即使软件的内存权限设置为   不可执行,你仍然可以执行除堆栈之外的任何地方。该   以下简单程序说明了这一点。

     

[你的片段如下]

(强调我的。)

如果权限设置为nonexecutable(或者完全省略权限),代码应该是段错误的。它没有出现在Leopard上,即便是作者提问。您观察到的是现代操作系统的完全正常行为。

我想补充一点:尝试通过调试器运行它。 \xeb\xfe是一个无限循环,但从技术上讲,你甚至不应该循环一次。操作系统应该拍你的手腕(这显然发生在这里)。