【问题标题】:understanding executing c code in stack ( Mac Hackers Handbook code)理解在堆栈中执行 c 代码(Mac Hackers Handbook 代码)
【发布时间】:2012-02-05 00:17:40
【问题描述】:

我正在查看这个示例 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。堆栈内存是只读的。 我的理解正确吗?

【问题讨论】:

  • 堆栈不是只读的,但很可能是不可执行的。
  • 而且只有3个字节要复制。 \x 表示接下来的两个字符表示实际放入程序中的字节的十六进制值。

标签: c stack shellcode


【解决方案1】:

你在什么操作系统上运行这个?

引用 Mac 黑客手册:

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

[你的 sn-p 跟随]

(强调我的。)

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

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

【讨论】:

  • 知道了。没有意识到 \xeb\xfe 是一个无限循环。我正在狮子上测试这个。所以基本上因为函数永远不会返回堆栈永远不会返回,这会有点冻结系统......这就是重点吗?
  • @ZionKing 进程独立运行,因此不会冻结系统。
  • 嗯..不确定我理解代码的重点和作者试图提出的重点......
  • 经过一番思考终于搞定了。 :) 感谢所有的帮助。
猜你喜欢
  • 1970-01-01
  • 2015-12-23
  • 2016-05-01
  • 1970-01-01
  • 2016-10-12
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多