14

我希望能够检查是否在基于 Xcode 9 且目标为 iOS 11 的 iOS 应用程序中启用了堆栈粉碎保护(-fstack-protector-all)。

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

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

是否有与该命令等效的现代命令?考虑到 Xcode 中的当前默认设置,-fstack-protector-all 是否还需要?

4

2 回答 2

0

您可以自己检查生成的代码。在有保护和无保护的情况下编译,然后查看反汇编代码(对于 XCode,您可以使用:在 XCode 4(或 Xcode 5 或 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

于 2018-07-30T10:10:59.030 回答
0

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

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

于 2018-07-30T10:21:48.083 回答