MASTG-TECH-0118: 获取编译器提供的安全功能
iOS 编译器提供了几个可以在编译期间启用的安全功能。这些功能有助于保护应用程序免受常见的漏洞(如缓冲区溢出和内存泄漏)的攻击。本技术指南介绍如何检查已编译的二进制文件中是否启用了这些功能。
适用于 iOS 的 radare2¶
在 radare2 中,可以使用 i
和 is
命令检查这些编译器提供的安全功能是否存在。
检查 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
...
输出显示 PIE
、ARC
和 Canary
,其值为 True
或 False
。