如何检测iOS应用程序中是否启用了堆栈粉碎保护

时间:2017-10-07 06:07:44

标签: ios xcode ios11 otool stack-smash

我希望能够检查在Xcode 9上构建的iOS应用程序中是否启用了堆栈粉碎保护(-fstack-protector-all),目标是iOS 11.

我在“其他C标志”中启用了-fstack-protector-all的应用程序,它确实构建并运行,但是如何验证是否已启用堆栈粉碎保护?

有很多旧的(2013年及之前的)资源提到otool -Iv appName |grep stack_chk,但是我在我的应用程序二进制文件上运行了它,并且在输出中找不到stack_chk。

是否存在与该命令相当的现代版本?是-fstack-protector - 根据Xcode中当前的默认设置,它们甚至都是必需的吗?

2 个答案:

答案 0 :(得分:0)

您可以自己检查生成的代码。在有保护或无保护的情况下进行编译,然后查看反汇编的代码(对于XCode,您可以使用:View disassembly in XCode 4 (or Xcode 5 or Xcode 6),或仅使用您喜欢的反汇编程序)。

两种情况下生成的代码示例都可以在这里找到:https://security.stackexchange.com/questions/158609/how-is-the-stack-protection-enforced-in-a-binary?newreg=af786a3bcdc841e1b92110299a2951af

最后但并非最不重要的一点,就是尝试编写一个自己的小型测试,尝试破坏堆栈。一旦能够粉碎堆栈,请启用保护标志,重新构建并查看其是否起作用。当然,可以在这里找到一些简单的示例:https://en.wikipedia.org/wiki/Stack_buffer_overflow

答案 1 :(得分:0)

-fstack-protector-all是Xcode中使用的llvm编译器的有效选项,例如,参见http://lists.llvm.org/pipermail/cfe-dev/2017-April/053662.html。不幸的是,它的文献很少。

有关如何验证的信息,您可以查看在另一个答案中建议的有无选项生成的程序集,或者只是先比较生成的二进制文件大小。