如何使用otool检查是否启用了Stack Smashing?

How to use otool to check for whether Stack Smashing is enabled or not?

我看到很多回答,比如网上的this, and this说用otool命令检查项目上的stack_chk_guardstack_chk_fail

问题是,我不知道 otool 必须应用于哪个文件。在 source 上,他们说这个 otool 将应用于扩展名为 .a 的文件,这是一个库。但我不知道如何将其应用于我想检查 整个 项目而不仅仅是图书馆的情况。我试图在我的项目中找到任何扩展名为 .a 的文件,我找到了 none。我已经尝试 运行 otool 对抗 .app.framework.xcarchive.ipa,都失败了。

有人可以帮忙吗?如有必要,请详细说明,因为我以前从未使用过 otool,并且 Internet 上的文档在描述 otool.

可以检查哪些文件时根本没有帮助

经过艰难的搜索后,我发现您应该提供给 otool 的文件位于 .app 目录中。是的,.app 是目录,不是文件。

所以这是怎么做的:

  • 首先构建您的项目,这将创建一个 .app 文件。
  • 在 Xcode 项目导航器(左侧面板)中,过滤底部的 .app 名称。
  • 右键单击 .app 文件,select "show in finder"。
  • 打开一个终端window.
  • 键入 cd,然后将 .app 目录拖到终端。它将填充路径。
  • 输入otool -Iv Your_App_Binary_Name | grep stack

Your_App_Binary_Name 位可能会让您感到困惑,但请不要这样。请注意您的 .app 目录的名称。例如,如果目录是 MyApp.app,那么您的二进制文件应该是 MyApp,没有扩展名,在 MyApp.app 目录中。如果您使用 finder 查看文件(右键单击 .app 和 select "show package contents"),您将看到二进制文件的类型是 UNIX 可执行文件。

(别忘了,如果你的应用名称包含space,你需要使用反斜杠来转义space。例如,如果你的应用名称是"My Holy App" ,则目录为 My\ Holy\ App.app,应用程序二进制文件为 My\ Holy\ App)

因此,对于名为 "My App":

的目标,您的终端将如下所示
$ cd ......./Build/Products/Debug-iphoneos/MyApp.app
$ otool -Iv MyApp | grep stack
0x00000001000c17bc 19966 ___stack_chk_fail
0x00000001000d8268 19967 ___stack_chk_guard
0x00000001000d8d18 19966 ___stack_chk_fail

或者如果你的目标有 spaces 像 "My Holy App":

$ cd ......./Build/Products/Debug-iphoneos/My\ Holy\ App.app
$ otool -Iv My\ Holy\ App | grep stack
0x00000001000c17bc 19966 ___stack_chk_fail
0x00000001000d8268 19967 ___stack_chk_guard
0x00000001000d8d18 19966 ___stack_chk_fail

编辑: 用户 mnemonic23 指出,如果您使用从 bitcode 重建的 IPA 进行编译,otool 的结果将不会显示上面的结果。您必须编译 IPA 而无需从 bitcode 重建。