跳过内容

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 代码。结果从内存中访问,就像程序在真实设备上执行一样。这个案例是一个很好的例子,说明了二进制分析框架使我们能够对二进制文件进行全面的分析,即使在没有运行它所需的专用设备的情况下也是如此。