如何使用otool检查是否启用了Stack Smashing?
How to use otool to check for whether Stack Smashing is enabled or not?
我看到很多回答,比如网上的this, and this说用otool
命令检查项目上的stack_chk_guard
和stack_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 重建。
我看到很多回答,比如网上的this, and this说用otool
命令检查项目上的stack_chk_guard
和stack_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 重建。