跳过内容

MASTG-TECH-0118: 获取编译器提供的安全功能

iOS 编译器提供了几个可以在编译期间启用的安全功能。这些功能有助于保护应用程序免受常见的漏洞(如缓冲区溢出和内存泄漏)的攻击。本技术指南介绍如何检查已编译的二进制文件中是否启用了这些功能。

适用于 iOS 的 radare2

在 radare2 中,可以使用 iis 命令检查这些编译器提供的安全功能是否存在。

检查 PIC 和 Canaries: 使用 i 命令,您可以检查二进制文件是否启用了位置无关代码(PIC)(pic),以及是否启用了堆栈金丝雀(canary)。

r2 MASTestApp
[0x100007408]> i~canary,pic
canary   true
pic      true

输出显示该二进制文件具有堆栈金丝雀并启用了 PIE。

检查 ARC: 使用 is 命令,您可以列出二进制文件中的符号,并检查指示使用了自动引用计数(ARC)的符号。常见的 ARC 符号包括

  • objc_autorelease
  • objc_retainAutorelease
  • objc_release
  • objc_retain
  • objc_retainAutoreleasedReturnValue
  • swift_release
  • swift_retain

一个 iOS 二进制文件不需要包含所有这些符号才能被认为是启用了 ARC 的,但是其中一些符号的存在表明使用了 ARC。

[0x100007408]> is~release,retain
80  0x0000790c 0x10000790c LOCAL  FUNC 0        imp.objc_release_x20
81  0x00007918 0x100007918 LOCAL  FUNC 0        imp.objc_release_x24
82  0x00007924 0x100007924 LOCAL  FUNC 0        imp.objc_release_x25
83  0x00007930 0x100007930 LOCAL  FUNC 0        imp.objc_release_x27
84  0x0000793c 0x10000793c LOCAL  FUNC 0        imp.objc_release_x8
85  0x00007948 0x100007948 LOCAL  FUNC 0        imp.objc_retainAutoreleasedReturnValue
86  0x00007954 0x100007954 LOCAL  FUNC 0        imp.objc_retain_x23
101 0x00007a08 0x100007a08 LOCAL  FUNC 0        imp.swift_release
102 0x00007a14 0x100007a14 LOCAL  FUNC 0        imp.swift_retain

输出显示二进制文件包含指示使用了 ARC 的符号。

适用于 iOS 的 objection

Objection 有一个命令 ios info binary,可用于获取有关二进制文件的信息,包括是否启用了堆栈金丝雀和 PIE。

com.yourcompany.PPClient on (iPhone: 13.2.3) [usb] # ios info binary
Name                  Type     Encrypted    PIE    ARC    Canary    Stack Exec    RootSafe
--------------------  -------  -----------  -----  -----  --------  ------------  ----------
PayPal                execute  True         True   True   True      False         False
CardinalMobile        dylib    False        False  True   True      False         False
FraudForce            dylib    False        False  True   True      False         False
...

输出显示 PIEARCCanary,其值为 TrueFalse