2012-02-05 55 views
2

我看这个例子w.r.t在堆栈中执行代码:理解在执行堆栈的C代码(苹果黑客手册代码)

#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

堆栈不是只读的,但很可能不可执行。 – 2012-02-05 00:21:48

+0

只有3个字节可以复制。 '\ x'表示接下来的两个字符表示实际放入程序的字节的十六进制值。 – ughoavgfhw 2012-02-05 00:23:10

回答

2

准确地说你正在使用哪种操作系统?

为了从Mac黑客手册引用:

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

[您的代码段如下]

(重点煤矿。)

如果权限被设置为不可执行的(或者如果权限被省略共)的代码应该段错误。它并不在Leopard上,即使作者也提出质疑。你观察到的是现代操作系统的完美正常行为。

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

+1

明白了。没有意识到\ xeb \ xfe是一个无限循环。我正在狮子测试这个。所以基本上,因为函数永远不会返回的堆栈将永远不会返回,这将有点冻结系统......这是重点吗? – ZionKing 2012-02-05 00:33:50

+0

@ZionKing进程独立运行,因此它不会冻结系统。 – 2012-02-05 00:45:35

+0

这也有助于:http://stackoverflow.com/questions/5609745/jmp-short-0x0-causing-loop-forever – ZionKing 2012-02-05 00:46:25