2

我正在查看这个示例 wrt 在堆栈中执行代码:

#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。堆栈内存是只读的。我的理解正确吗?

4

1 回答 1

2

确切地说,您在哪个操作系统上运行它?

引用 Mac 黑客手册:

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

[您的片段如下]

(强调我的。)

如果权限设置为不可执行(或者完全省略权限),则代码应该出现段错误。它没有出现在 Leopard 上,甚至作者也对此提出质疑。您观察到的对于现代操作系统来说是完全正常的行为。

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

于 2012-02-05T00:26:43.850 回答