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

Che*_*ong 3 xcode otool

我看到很多答案,像这样在互联网上说要使用otool命令来检查stack_chk_guard和检查stack_chk_fail项目。

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

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

Che*_*ong 11

经过一番搜索之后,我发现您应该提供给 otool 的文件位于该.app目录中。是的,这.app是一个目录,而不是一个文件。

所以这是如何做到的:

  • 首先构建您的项目,这将创建一个.app文件。
  • 在 Xcode 项目导航器(左侧面板侧)中,过滤.app底部的名称。
  • 右键单击.app文件,选择“在查找器中显示”。
  • 打开一个终端窗口。
  • 键入cd然后将.app目录拖到终端。它将填充路径。
  • 类型 otool -Iv Your_App_Binary_Name | grep stack

这些Your_App_Binary_Name位可能会让你感到困惑,但不要。只需注意您的.app目录的名称。例如,如果目录是MyApp.app,那么您的二进制文件应该MyAppMyApp.app目录内没有扩展名。如果您使用 finder 看到该文件(右键单击.app并选择“显示包内容”),您将看到二进制文件的类型是 UNIX 可执行文件。

(不要忘记,如果你的应用名称包含空格,你需要使用反斜杠来转义空格。例如,如果你的应用名称是“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
Run Code Online (Sandbox Code Playgroud)

或者如果您的目标有像“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
Run Code Online (Sandbox Code Playgroud)

编辑:用户 mnemonic23 表示,如果您使用从位码重建的方式编译 IPA,则 otool 的结果将不会显示上述结果。您必须编译 IPA 而无需从 bitcode 重建。