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

如何检测iOS应用程序中是否启用了堆栈粉碎保护,ios,xcode,ios11,otool,stack-smash,Ios,Xcode,Ios11,Otool,Stack Smash,我希望能够检查在一个构建在Xcode 9上、目标为iOS 11的iOS应用程序中是否启用了堆栈破坏保护(-fstack protector all) 我构建了一个应用程序,在“其他C标志”中启用了-fstack-protector,它确实构建并运行了,但我如何验证是否启用了堆栈破坏保护 有很多较老的(2013年及更早)资源提到了otool-Iv appName | grep stack_chk,但我在我的应用程序二进制上运行了它,在输出中找不到stack_chk 有没有一个现代的类似命令?考虑到

我希望能够检查在一个构建在Xcode 9上、目标为iOS 11的iOS应用程序中是否启用了堆栈破坏保护(-fstack protector all)

我构建了一个应用程序,在“其他C标志”中启用了-fstack-protector,它确实构建并运行了,但我如何验证是否启用了堆栈破坏保护

有很多较老的(2013年及更早)资源提到了
otool-Iv appName | grep stack_chk
,但我在我的应用程序二进制上运行了它,在输出中找不到stack_chk


有没有一个现代的类似命令?考虑到Xcode中当前的一组默认值,-fstack protector是否仍然是必需的?

您可以自己检查生成的代码。编译时有保护和无保护,然后查看反汇编代码(对于XCode,您可以使用:,或者只使用您最喜欢的反汇编程序)

这两种情况下生成的代码示例可在此处找到:


最后但并非最不重要的一点是,尝试编写一个自己的小测试,它试图破坏堆栈。一旦你能够粉碎堆栈,启用保护标志,重建,看看它是否有任何效果。当然,这里可以找到一些简单的例子:

-fstack protector all
是用于Xcode的llvm编译器的有效选项,请参见示例。不幸的是,它只是缺乏文档记录


关于如何验证,您可以查看使用和不使用另一个答案中建议的选项生成的程序集,或者首先比较生成的二进制文件大小。

我已经在Xcode 9.2和9.3中选中了空白的Swift应用程序,我可以确认没有看到与
堆栈相关的符号
其他C标志
应不会对Swift编译器产生影响
swiftc
-
-fstack protector all
仅适用于使用
clang
编译的文件。如果二进制文件上的
otool/grep
显示存在
stack*
符号,这并不意味着它们来自Swift文件-它们可以来自C/Objective-C对象。我猜Swift中没有堆栈保护,至少如果我们根据二进制文件中没有
stack*
符号来决定的话,是有意的,还是一种回归。