MASTG-TECH-0089: 符号执行
您可以在* Android动态分析*中找到使用二进制分析框架进行二进制分析的介绍。我们建议您重新访问该内容并刷新关于这个主题的概念。
对于 Android,我们使用 Angr 的符号执行引擎来解决一个挑战。在本节中,我们将首先使用 Unicorn 来解决 * iOS UnCrackable L1* 挑战,然后我们将重新访问 Angr 二进制分析框架来分析这个挑战,但不是使用符号执行,而是使用它的具体执行(或动态执行)功能。
Angr¶
* Angr* 是一个非常通用的工具,提供了多种技术来促进二进制分析,同时支持各种文件格式和硬件指令集。
Angr 中的 Mach-O 后端支持不是很好,但是对于我们的情况来说,它运行得很好。
在手动分析* 审查反汇编的本机代码*中的代码时,我们到达了一个手动分析变得繁琐的点。偏移量0x1000080d4
处的函数被确定为包含秘密字符串的最终目标。
如果我们重新访问该函数,我们可以看到它涉及多个子函数调用,有趣的是,这些函数都不依赖于其他库调用或系统调用。这是使用 Angr 的具体执行引擎的一个完美案例。按照以下步骤解决此挑战
- 运行
lipo -thin arm64 <app_binary> -output uncrackable.arm64
获取二进制文件的 ARM64 版本(也可以使用 ARMv7)。 - 通过加载上面的二进制文件来创建一个 Angr
Project
。 - 通过传递要执行的函数的地址来获取一个
callable
对象。从 Angr 文档中:“Callable 是二进制文件中函数的表示,可以像原生 python 函数一样与之交互。”。 - 将上面的
callable
对象传递给具体执行引擎,在本例中是claripy.backends.concrete
。 - 访问内存并从上述函数返回的指针中提取字符串。
import angr
import claripy
def solve():
# Load the binary by creating angr project.
project = angr.Project('uncrackable.arm64')
# Pass the address of the function to the callable
func = project.factory.callable(0x1000080d4)
# Get the return value of the function
ptr_secret_string = claripy.backends.concrete.convert(func()).value
print("Address of the pointer to the secret string: " + hex(ptr_secret_string))
# Extract the value from the pointer to the secret string
secret_string = func.result_state.mem[ptr_secret_string].string.concrete
print(f"Secret String: {secret_string}")
solve()
上面,Angr 在其具体执行引擎之一提供的执行环境中执行了 ARM64 代码。结果从内存中访问,就像程序在真实设备上执行一样。这个案例是一个很好的例子,说明了二进制分析框架使我们能够对二进制文件进行全面的分析,即使在没有运行它所需的专用设备的情况下也是如此。