使用 SandBlaster 提取 iOS 上的沙盒配置文件

2025-02-11 3 0

在2023年8月,Cellebrite推出了一个名为SandBlaster的工具的分支版本。这个工具可以将iOS沙盒配置文件从专有的二进制格式反编译为可读的文本格式。虽然该工具的运行方式很简单,但文档并未解释从哪里或如何获取包含所有沙盒规则的二进制数据。因此,我们希望现在来解决这个问题。

原版的SandBlaster由malus-security开发,仅支持iOS 4到12,而Cellebrite的分支版本增加了对iOS 16.5和17.0测试版的支持。

我们将从沙盒配置文件的背景知识开始,回顾一些历史上用于提取这些二进制数据的工具,最后详细讲解如何从iOS 16.5的内核缓存(kernelcache)中提取二进制数据并使用SandBlaster进行反编译。

沙盒配置文件基础知识(Sandbox Profiles 101)

为了让iOS沙盒能够适当地限制每个进程的行为,沙盒内核扩展中内置了一组以二进制格式存储的配置文件。每个配置文件定义了一组针对各种操作(如文件I/O、IPC、网络、系统调用等)的规则。例如,以下是一个简单的配置文件nointernet.sb

(version 1)
(allow default)
(deny file-write-setugid)
(deny network*
(local ip ":"))
(deny storage-class-map)

这段代码是一个简单的 iOS 沙盒配置文件,定义了一些沙盒规则。我们逐行解析它:


(version 1)
  • 版本声明:指定沙盒配置文件的版本为1

  • 这个字段用于确保沙盒解析器知道如何处理该文件。版本号对不同 iOS 版本可能会有所不同。


(allow default)
  • 默认允许:所有默认的操作行为(不特别被拒绝的行为)被允许。

  • 这是规则的基础行为声明,沙盒会从这里开始定义特定的限制。


(deny file-write-setugid)
  • 禁止文件写入(特定权限)

    • 拒绝写入文件或更改文件属性,特别是setuidsetgid文件。

    • setuidsetgid文件是指可以提升权限的文件(如某些系统进程或程序)。

    • 这条规则是为了防止进程通过修改这些文件获得更高的权限,提升系统安全性。


(deny network*
	(local ip "*:*"))
  • 禁止网络访问

    • 拒绝所有网络相关的操作(network*)。

    • 具体规则限制了网络操作的范围,(local ip "*:*")表示:

      • 限制访问所有本地 IP 地址(*:*是一个通配符,表示所有IP地址和端口)。

    • 这条规则的目的是防止进程通过网络进行通信,确保其在沙盒中隔离。


(deny storage-class-map)
  • 禁止存储类映射

    • 拒绝访问存储类映射功能。

    • 存储类映射可能与存储设备管理或文件系统权限相关,禁用它可以进一步限制进程的存储访问。


沙盒配置文件使用一种基于 Scheme 的变体语言实现,称为 SandBox Profile Language (SBPL)。在 SBPL 中,每条规则以allowdeny开头,后接操作及其参数(例如修饰符和过滤器)。配置文件必须包含一条默认规则(在此例中为allow),这条规则决定了配置文件是从严格模式开始并定义例外,还是从宽松模式开始并定义限制。

在 iOS 16.5 中,共有 274 个沙盒配置文件,范围从非常简单的文件(如nointernet.sb,大小为 113 字节)到极其复杂的文件(如platform.sb,大小为 1.3 MB)。其中,platform.sb实际上是所有进程的默认或基础配置文件,然后再叠加额外或更具体的配置文件。

为了研究这些配置文件以发现弱点或潜在的攻击面,首先需要提取二进制配置文件数据,并将其反编译为可读的格式。


曾经的做法...

过去有一些工具可以自动提取沙盒配置数据,主要包括:

  1. Malus Security提供的iExtractor

  2. Stefan Esser开发的sandbox_toolkit

在 Jonathan Levin 的书《macOS 和 iOS 内部原理,第 III 卷:安全与不安全》中提到,他的工具 joker能够提取并反编译沙盒配置文件,但他仍然推荐使用 SandBlaster,因此我们没有测试该工具。据观察,joker已被 jtool2替代,但后者似乎并不支持这一功能(除非功能隐藏得非常深)。

在早期,所需信息被分散存储在用户空间(/usr/libexec/sandboxd)和内核(com.apple.security.sandboxkext)中,因此 Stefan Esser 的工具extract_sbprofiles通过解析sandboxd二进制文件来完成提取。然而,将如此关键的任务交给用户空间进程显然存在一些缺陷。因此,在现代系统中,所有配置文件都被存储在内核扩展中,并通过 KTRR(内核文本只读保护机制)加以保护,防止恶意篡改。
使用 SandBlaster 提取 iOS 上的沙盒配置文件插图

由于这些工具无法在当前版本上使用,我们需要进行一些逆向工程,自己找出提取这些二进制数据的方法。

iOS 16.5 的沙盒剖析(Sandboxectomy)

幸运的是,argp 在其出色的沙盒主题演讲中提供了一张“藏宝图”,虽然这个“岛屿”已经被稍微“改造”了一些。这张幻灯片展示了一个大致的思路:
使用 SandBlaster 提取 iOS 上的沙盒配置文件插图1

这段内容中提到的kext(内核扩展)是com.apple.security.sandbox,因此我们首先需要获取它的副本。在这个示例中,我们将使用 iPhone XS 上的 iOS 16.5 作为研究目标,需要使用其kernelcache文件。Blacktop提供的ipsw工具非常适合此任务,因为它可以智能地仅下载内核,而无需获取整个 iOS 固件镜像:

$ ipsw download ipsw -d "iPhone11,2" -b "20F66" --kernel
   • Parsing remote IPSW       build=20F66 device=iPhone11,2 signed=false version=16.5
   • Extracting remote kernelcache
      • Created 20F66__iPhone11,2/kernelcache.release.iPhone11,2_4_6
$

随后,可以提取出沙盒内核扩展(kext):

$ ipsw kernel extract 20F66__iPhone11,2/kernelcache.release.iPhone11,2_4_6 com.apple.security.sandbox
   • Created 20F66__iPhone11,2/com.apple.security.sandbox
$ file 20F66__iPhone11,2/com.apple.security.sandbox
20F66__iPhone11,2/com.apple.security.sandbox: Mach-O 64-bit kext bundle arm64e
$

需要注意的是,提取的内核扩展不会解析其所有导入/依赖项,因此逆向工程会有一定复杂性。幸运的是,对于本次过程来说,单独的kext文件已经足够,但如果需要更深入的分析,最好将整个kernelcache文件导入到你选择的反汇编工具中。

将提取的com.apple.security.sandboxkext 文件加载到 Binary Ninja(或类似工具)后,搜索字符串 “builtin collection”,然后定位到第一个条目。


代码解析

第一部分:下载内核缓存

$ ipsw download ipsw -d "iPhone11,2" -b "20F66" --kernel
  • ipsw工具:用于从苹果服务器下载 iOS 固件或内核文件。

  • 参数说明

    • -d "iPhone11,2":指定目标设备型号(iPhone XS 的标识符)。

    • -b "20F66":指定固件的版本号(iOS 16.5 的内部标识)。

    • --kernel:仅下载内核缓存(kernelcache),避免下载整个固件文件,节省时间和空间。

  • 输出

    • 提取的内核缓存文件保存在路径20F66__iPhone11,2/kernelcache.release.iPhone11,2_4_6


第二部分:提取沙盒内核扩展

$ ipsw kernel extract 20F66__iPhone11,2/kernelcache.release.iPhone11,2_4_6 com.apple.security.sandbox
  • 目的:从内核缓存中提取特定的com.apple.security.sandbox内核扩展(kext)。

  • 工具行为

    • 在指定的内核缓存中定位com.apple.security.sandbox,并提取为独立文件。

    • 输出路径为20F66__iPhone11,2/com.apple.security.sandbox


第三部分:验证文件

$ file 20F66__iPhone11,2/com.apple.security.sandbox
  • 功能:检查提取的文件格式。

  • 输出:文件是Mach-O 64-bit kext bundle,架构为arm64e(苹果的 ARM64 扩展指令集)。


注意点

  1. 提取的 kext 文件独立存在,其导入或依赖项未被解析,因此逆向分析时会增加难度。

  2. 如果需要全面分析整个依赖关系,建议将完整的kernelcache文件加载到反汇编工具中(如 IDA Pro、Ghidra 或 Binary Ninja)。


后续操作

  1. 将提取的com.apple.security.sandboxkext 文件加载到 Binary Ninja。

  2. 搜索字符串 “builtin collection”

  3. 定位到第一个出现的位置,开始分析其相关代码和数据结构。


通过这些步骤,逆向工程师可以深入研究沙盒的实现细节,从而发现潜在的攻击面或弱点。

使用 SandBlaster 提取 iOS 上的沙盒配置文件插图2

该字符串有两个交叉引用:

使用 SandBlaster 提取 iOS 上的沙盒配置文件插图3

被调用的函数很可能是_profile_create(尽管其参数可能已经发生了一些变化),而其所在的函数则很可能是幻灯片中提到的_hook_policy_init函数。以下是函数调用在 Binary Ninja中的伪C代码:

x0_34 = _profile_create(&data_fffffff007cfb768, "builtin collection", &data_fffffff0076d6be0, 0xcf8c3, &data_fffffff009f93fa8);
  • arg4看起来可能是一个大小(size)。

  • arg3指向__const段中的一个数据块,其内容以以下形式开始:


代码解析

函数调用分析

x0_34 = _profile_create(&data_fffffff007cfb768, "builtin collection", &data_fffffff0076d6be0, 0xcf8c3, &data_fffffff009f93fa8);
  1. _profile_create:

    • 很可能是一个用于创建沙盒配置文件的内部函数。

    • 从调用方式来看,该函数接受多个参数,并返回一个结果(存储在变量x0_34中)。

  2. 参数分析

    • arg1(&data_fffffff007cfb768):

      • 指向一个数据结构,可能是配置文件的目标地址或存储位置。

    • arg2("builtin collection"):

      • 一个字符串常量,可能用于标识配置文件的类型或用途(如内置集合)。

    • arg3(&data_fffffff0076d6be0):

      • 指向__const段中的数据块,可能是沙盒规则的原始二进制数据。

    • arg4(0xcf8c3):

      • 看起来像是一个大小参数,可能表示arg3数据块的大小。

    • arg5(&data_fffffff009f93fa8):

      • 指向另一个数据结构,可能是一个输出参数,用于存储函数执行后的元信息或结果。


arg3的数据结构

arg3指向__const段中的数据块。__const段通常包含只读的静态数据,比如字符串、常量数组或特定规则的序列化数据。

该数据块的起始内容看起来是沙盒规则的定义部分,可能包括:

  • 沙盒配置文件的元数据。

  • 二进制编码的沙盒规则。

具体内容需要进一步解码或分析。


arg4的含义

arg4是一个值为0xcf8c3的数字,看起来是一个大小参数,可能表示:

  • arg3数据块的总大小(以字节为单位)。

  • 或者是沙盒规则的某个子部分的大小限制。

大小参数的存在可能用于:

  • 验证输入数据的完整性。

  • 限制函数对内存区域的访问,避免溢出或其他安全问题。


使用 SandBlaster 提取 iOS 上的沙盒配置文件插图4

与这张幻灯片进行比较后,我们可以看到前几个字节与 iOS 的“版本标识符”(即 0x8000,假设为小端序的 uint16_t)相匹配:

使用 SandBlaster 提取 iOS 上的沙盒配置文件插图5

现在,我们可以通过以下步骤将这个数据块提取到一个二进制文件中:

  1. 选择第一个字节,右键点击,然后选择“Selection->Extend by bytes”。

  2. 输入大小(在本例中是0xcf8c3)。

  3. 再次右键点击并选择“Selection->Save To...”。

  4. 将其保存为collection.bin

回到_hook_policy_init函数并向上滚动一点,可以看到另一次对_profile_create的调用,其字符串为"protobox collection",大小为0x4fe81。重复上述步骤,将其导出为protobox.bin

还有一个数据块需要提取:平台配置文件(platform profile)。至少在当前版本的 iOS 中,它的加载方式略有不同。回到对_profile_create的最初调用,再向下滚动一点,可以看到如下代码片段:

data_fffffff007cfb8f0 = &data_fffffff0076bd1f0;
data_fffffff007cfb8f8 = 0x19389;
data_fffffff007cfb934 = 0;
v0_3 = 0x2c;
*(uint64_t*)((char*)v0_3)[8] = 0x2c;
data_fffffff007cfb920 = v0_3;
data_fffffff007cfb938 = 0;
data_fffffff007cfb93b = 0;
__builtin_memcpy(&data_fffffff007cfb908, "\x2c\x00\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00\x58\xb9\x00\x00\x00\x00\x00\x00", 0x18);
int64_t x0_35 = sub_fffffff009f85ab8(&data_fffffff007cfb8f0, 0x20, 6);

这段代码引起了注意,因为常量0x19389看起来与其他配置文件集合的大小类似。跟踪data_fffffff0076bd1f0,可以看到一个数据块,其格式看起来仍然像是一个编译过的沙盒配置文件。


代码解析

提取配置文件步骤分析

  1. collection.bin提取

    • 通过右键选择和扩展选定字节,将内存中的第一个数据块(collection.bin)导出到文件。

    • 大小由0xcf8c3确定。

  2. protobox.bin提取

    • 另一个调用_profile_create的地方,加载了一个字符串"protobox collection"和大小0x4fe81

    • 重复类似步骤将该数据块导出为protobox.bin

  3. 平台配置文件提取

    • 平台配置文件的加载方式稍有不同。与其他配置文件相比,这里没有直接调用_profile_create

    • 数据块的起点是data_fffffff0076bd1f0,其大小由0x19389定义。


代码段解析

data_fffffff007cfb8f0 = &data_fffffff0076bd1f0;
data_fffffff007cfb8f8 = 0x19389;
data_fffffff007cfb934 = 0;
v0_3 = 0x2c;
*(uint64_t*)((char*)v0_3)[8] = 0x2c;
data_fffffff007cfb920 = v0_3;
data_fffffff007cfb938 = 0;
data_fffffff007cfb93b = 0;
__builtin_memcpy(&data_fffffff007cfb908, "\x2c\x00\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00\x58\xb9\x00\x00\x00\x00\x00\x00", 0x18);
int64_t x0_35 = sub_fffffff009f85ab8(&data_fffffff007cfb8f0, 0x20, 6);
  1. data_fffffff007cfb8f0:

    • 指向沙盒配置文件的起点,地址为data_fffffff0076bd1f0

    • 后续可以进一步分析此地址处的数据内容。

  2. data_fffffff007cfb8f8:

    • 值为0x19389,可能是该配置文件的大小。

  3. __builtin_memcpy调用:

    • 将固定大小的数据块(0x18字节)复制到data_fffffff007cfb908

    • 数据块内容是一个字节数组,可能是某种元数据或标识符。

  4. sub_fffffff009f85ab8函数调用:

    • 传入data_fffffff007cfb8f0和其他参数。

    • 很可能是用于初始化、解析或加载沙盒配置文件的函数。


使用 SandBlaster 提取 iOS 上的沙盒配置文件插图6

前几个字节没有0x8000的头部,但第五个字节是0xBA,这与幻灯片中描述的打包的沙盒配置结构相符。另一个提示表明这是平台沙盒文件来源于错误处理部分的代码:

data_fffffff007cfb8f0 = &data_fffffff0076bd1f0;
data_fffffff007cfb8f8 = 0x19389;
data_fffffff007cfb934 = 0;
v0_3 = 0x2c;
*(uint64_t*)((char*)v0_3)[8] = 0x2c;
data_fffffff007cfb920 = v0_3;
data_fffffff007cfb938 = 0;
data_fffffff007cfb93b = 0;
__builtin_memcpy(&data_fffffff007cfb908, "\x2c\x00\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00\x58\xb9\x00\x00\x00\x00\x00\x00", 0x18);
int64_t x0_35 = sub_fffffff009f85ab8(&data_fffffff007cfb8f0, 0x20, 6);

if (x0_35 != 0)
{
label_fffffff009f7c5b8:
	char const* const var_298_1 = "kext.c";
	int64_t var_290_1 = 0x171f;
	int64_t var_2a0_4 = x0_35;
	&data_fffffff00842f504("failed to initialize platform sandbox: %d\" @%s:%d");

因此,可以提取data_fffffff0076bd1f0地址中的0x19389字节,并将其保存为platform.bin

我们已经快要准备好反编译这些数据了!


沙盒操作

我们还需要最后一部分:沙盒操作列表,这只是一个字符串数组。在编译后的配置文件中,每个操作存储为一个整数。例如,在nointernet.sb配置文件中,network*操作映射为整数0x6D(十进制 109)。这些操作在 iOS 的不同版本之间可能会发生变化,因此我们需要为当前版本抓取正确的列表。

最简单的路径可能是在字符串视图中查找"default"


代码解析

关键数据提取分析

  1. 0x19389的含义

    • 在变量data_fffffff007cfb8f8中定义的大小。

    • 确定为平台沙盒文件的大小,可以从地址data_fffffff0076bd1f0开始提取。

  2. 提取数据块的步骤

    • data_fffffff0076bd1f0地址处读取0x19389字节。

    • 通过反编译工具或脚本将该部分保存为二进制文件platform.bin

  3. 错误处理逻辑

    • 如果sub_fffffff009f85ab8返回值x0_35不为0,则会调用错误处理函数。

    • 错误日志会打印failed to initialize platform sandbox,表明初始化平台沙盒失败。

沙盒操作的分析

  1. 操作的存储形式

    • 编译后的沙盒文件中,操作名称被映射为整数(例如network*被映射为0x6D)。

    • 因为这些映射可能在不同 iOS 版本中发生变化,所以需要通过提取当前版本的操作列表来确认具体的映射关系。

  2. 操作列表提取

    • 在反编译工具中,通过搜索"default"字符串,找到沙盒操作列表的起点。

    • 该列表会提供操作名称与其对应整数值的映射关系,用于后续的规则解析。


使用 SandBlaster 提取 iOS 上的沙盒配置文件插图7

以下是一长串的字符串:
使用 SandBlaster 提取 iOS 上的沙盒配置文件插图8


选择整个操作列表(在此例中以xpc-message-send结尾,记得包括末尾的空字节null byte),并将其保存为文件operations.bin

由于 SandBlaster 需要该文件的格式为“一行一个操作”,可以在终端中运行以下命令,将空终止符(\0)替换为换行符(\n):

$ tr '\0' '\n' < operations.bin > operations.txt

运行以下命令,查看前几行内容验证结果:

$ head operations.txt
default
appleevent-send
authorization-right-obtain
boot-arg-set
device*
device-camera
device-microphone
darwin-notification-post
distributed-notification-post
dynamic-code-generation

现在我们已经准备好进行反编译了!


  1. 选择并提取操作列表

    • 操作列表是以null byte作为分隔符的字符串数组(每个操作以\0结尾)。

    • 保存提取的操作列表为operations.bin文件。

  2. 格式转换

    • 使用命令tr '\0' '\n'null byte替换为换行符,使每个操作占据文件的一行。

    • 输出文件为operations.txt

  3. 操作验证

    • 通过命令head operations.txt查看文件的前几行内容,确保格式正确。

    • 示例中展示了部分操作列表,包括defaultappleevent-senddevice-camera等操作。

  4. 操作的用途

    • 每个操作对应沙盒中的特定权限或限制,例如:

      • device-camera:限制对摄像头设备的访问。

      • darwin-notification-post:限制发送 Darwin 通知的能力。

  5. 下一步:反编译

    • 现在已经具备了操作列表文件(operations.txt)和提取的沙盒规则数据(如collection.bin),可以使用 SandBlaster 进行反编译,将二进制沙盒规则文件转为可读的文本格式。


运行 SandBlaster

首先,克隆 Cellebrite 的分支并为其创建一个 Python 虚拟环境:

$ git clone https://github.com/cellebrite-labs/sandblaster.git
$ cd sandblaster
$ python3 -m venv ENV
$ source ENV/bin/activate

SandBlaster 需要tqdmPython 库,所以需要在虚拟环境中安装:

$ pip install tqdm
Collecting tqdm
  Using cached tqdm-4.66.4-py3-none-any.whl.metadata (57 kB)
Using cached tqdm-4.66.4-py3-none-any.whl (78 kB)
Installing collected packages: tqdm
Successfully installed tqdm-4.66.4

进入reverse-sandbox目录并查看帮助:

$ cd reverse-sandbox
$ python reverse_sandbox.py --help
usage: reverse_sandbox.py [-h] -r RELEASE -o OPERATIONS_FILE [-p PROFILE [PROFILE ...]] [-n OPERATION [OPERATION ...]] [-d DIRECTORY] [-psb]
                          [-kbf] [-c] [-m]
                          filename

positional arguments:
  filename              path to the binary sandbox profile

options:
  -h, --help            show this help message and exit
  -r RELEASE, --release RELEASE
                        iOS release version for sandbox profile
  -o OPERATIONS_FILE, --operations_file OPERATIONS_FILE
                        file with list of operations
  -p PROFILE [PROFILE ...], --profile PROFILE [PROFILE ...]
                        profile to reverse (for bundles) (default is to reverse all operations)
  -n OPERATION [OPERATION ...], --operation OPERATION [OPERATION ...]
                        particular operation(s) to reverse (default is to reverse all operations)
  -d DIRECTORY, --directory DIRECTORY
                        directory where to write reversed profiles (default is current directory)
  -psb, --print_sandbox_profiles
                        print sandbox profiles of a given bundle (only for iOS versions 9+)
  -kbf, --keep_builtin_filters
                        keep builtin filters in output
  -c, --c_output        output a C file rather than Scheme
  -m, --macho           generate a reversible Mach-O file (implies --c_output)

代码解析

  1. 克隆 SandBlaster 并创建虚拟环境

    • 使用git clone克隆 SandBlaster 工具。

    • 创建一个 Python 虚拟环境,并激活该环境。

  2. 安装tqdm

    • 使用pip install tqdm安装tqdm,这是 SandBlaster 所依赖的一个库。

  3. 查看reverse_sandbox.py的帮助

    • 进入reverse-sandbox目录并运行python reverse_sandbox.py --help查看该工具的用法。

  4. 命令行参数解析

    • -h, --help:显示帮助信息并退出。

    • -r RELEASE, --release RELEASE:指定 iOS 版本,用于沙盒配置文件。

    • -o OPERATIONS_FILE, --operations_file OPERATIONS_FILE:指定包含操作列表的文件。

    • -p PROFILE [PROFILE ...], --profile PROFILE [PROFILE ...]:指定要反向工程的特定沙盒配置文件。

    • -n OPERATION [OPERATION ...], --operation OPERATION [OPERATION ...]:指定要反向工程的特定操作。

    • -d DIRECTORY, --directory DIRECTORY:指定保存反向工程配置文件的目录。

    • -psb, --print_sandbox_profiles:打印给定捆绑包的沙盒配置文件(仅适用于 iOS 9 及更高版本)。

    • -kbf, --keep_builtin_filters:保留输出中的内置过滤器。

    • -c, --c_output:输出 C 语言文件,而非 Scheme 语言文件。

    • -m, --macho:生成可逆的 Mach-O 文件(这意味着会输出 C 语言文件)。


现在我们可以开始了,首先从平台配置文件开始。一个重要的说明:工具期望输出目录已经存在,所以确保先创建该目录,然后提供 iOS 版本(此案例中为“16”),操作文件的路径,输出目录以及配置文件的路径:

$ mkdir platform
$ python3 reverse_sandbox.py -r 16 -o ../../20F66__iPhone11,2/operations.txt -d platform ../../20F66__iPhone11,2/platform.bin

输出如下:

struct_size: 0xe
                header: 0x0
                op_nodes_count: 0x16f7
                sb_ops_count: 0xba
                vars_count: 0x6
                states_count: 0x0
                num_profiles: 0x0
                re_table_count: 0x9
                entitlements_count: 0x0

                regex_table_offset: 0xe
                pattern_vars_offset: 0x20
                states_offset: 0x2c
                entitlements_offset: 0x2c
                profiles_offset: 0x2c
                profiles_end_offset: 0x2c
                operation_nodes_offset: 0x1a0
                operation_nodes_size: 0xb7b8
                base_adrr: 0xb958

2024-08-03 10:52:17,526 - __main__ - INFO - num_sb_ops: 192
2024-08-03 10:52:17,539 - __main__ - INFO - [['^/private/var/mobile/Library/Safari/Bookmark', '^/private/var/mobile/Library/Safari/com[.]apple[.]Bookmark', '^/private/var/euser[0-9]+/Library/Safari/(com[.]apple[.])?Bookmark', '^/private/var/[-0-9A-F]+/Library/Safari/(com[.]apple[.])?Bookmark', '^/private/var/Users/[^/]+/Library/Safari/(com[.]apple[.])?Bookmark'], ... ]
2024-08-03 10:52:17,539 - __main__ - INFO - 6 global vars at offset 32
2024-08-03 10:52:17,539 - __main__ - INFO - global variables are FRONT_USER_HOME, HOME, ANY_UUID, ENTITLEMENT:com.apple.trial.client, ENTITLEMENT:com.apple.security.exception.iokit-user-client-class, ENTITLEMENT:com.apple.security.iokit-user-client-class
2024-08-03 10:52:17,539 - __main__ - INFO - number of operation nodes: 5879
2024-08-03 10:52:17,546 - __main__ - INFO - operation nodes
2024-08-03 10:52:17,598 - __main__ - INFO - operation nodes after filter conversion
2024-08-03 10:52:17,598 - __main__ - INFO - number of operation nodes: 5879
$ ls -lh platform/
total 4112
-rw-r--r--  1 chris  staff   1.3M Aug  3 10:52 platform.sb
$ head platform/platform.sb
(version 1)
(allow default)
(deny dynamic-code-generation
	(require-not (entitlement-is-bool-true dynamic-codesigning))
	(require-not (process-attribute is-sandboxed))
	(process-attribute is-protoboxed))
(deny file-chroot
	(require-not (require-ancestor-with-entitlement com.apple.private.security.storage-exempt.heritable))
	(require-all
		(require-not (storage-class-extension 0))

代码解析

  1. 创建输出目录并运行 SandBlaster 反向工程

    • 通过mkdir platform创建一个名为platform的目录用于存储结果。

    • 使用python3 reverse_sandbox.py命令来反向工程平台的沙盒配置文件。参数包括:

      • -r 16:指定 iOS 版本为 16。

      • -o ../../20F66__iPhone11,2/operations.txt:指定操作文件路径。

      • -d platform:指定输出目录。

      • ../../20F66__iPhone11,2/platform.bin:指定要反向工程的沙盒配置文件路径。

  2. 工具输出解释

    • 输出提供了配置文件的结构信息,包括沙盒操作节点数、全局变量、状态、操作节点的大小、以及正则表等信息。

    • 这些信息有助于理解沙盒配置文件的内存布局,并为反向工程分析提供了详细的参考数据。

  3. 全局变量

    • 输出中的global variables显示了与沙盒相关的全局变量,包括用户主目录路径、UUID、以及特定的 entitlement(权限)标识符。

  4. 操作节点和过滤转换

    • 沙盒操作节点的数量为 5879,表示沙盒中定义的操作。这些操作会根据不同的过滤条件进行转换和处理。

  5. 生成的配置文件

    • 反向工程后的沙盒配置文件platform.sb被生成在platform/目录下。通过head命令查看文件的前几行,显示了沙盒的规则和限制,例如allow default(允许默认操作)和deny dynamic-code-generation(禁止动态代码生成)。


现在,重复相同的操作,分别处理 protobox 和 collection 配置文件:

$ mkdir 
$ python3 reverse_sandbox.py -r 16 -o ../../20F66__iPhone11,2/operations.txt ../../20F66__iPhone11,2/protobox.bin -d protobox
[snip]
$ python3 reverse_sandbox.py -r 16 -o ../../20F66__iPhone11,2/operations.txt ../../20F66__iPhone11,2/collection.bin -d collection
[snip]
$ ls -l collection | wc -l
274
$ ls -l protobox | wc -l
389

现在,你已经获得了完整的 iOS 16.5 沙盒配置文件,可以进行进一步分析。如果你对阅读 Scheme 不感兴趣,可以尝试使用--macho选项来生成 MachO 文件,这样你可以将文件加载到你选择的反汇编工具中。


  1. 重复反向工程过程

    • 创建输出目录:使用mkdir创建用于存放 protobox 和 collection 配置文件的目录。注意:这里没有指定目录名称,假设是为了后续步骤。

    • 反向工程 protobox 配置文件

      python3 reverse_sandbox.py -r 16 -o ../../20F66__iPhone11,2/operations.txt ../../20F66__iPhone11,2/protobox.bin -d protobox
      
      • -r 16:指定 iOS 版本为 16。

      • -o ../../20F66__iPhone11,2/operations.txt:指定操作文件路径。

      • ../../20F66__iPhone11,2/protobox.bin:指定要反向工程的 protobox 配置文件路径。

      • -d protobox:指定输出目录为protobox

    • 反向工程 collection 配置文件

      python3 reverse_sandbox.py -r 16 -o ../../20F66__iPhone11,2/operations.txt ../../20F66__iPhone11,2/collection.bin -d collection
      

      与 protobox 文件的处理过程类似,只是配置文件不同,输出目录改为collection

  2. 统计文件行数

    • ls -l collection | wc -l:统计collection目录下文件的行数,输出 274 行,表示该目录下有 274 个文件。

    • ls -l protobox | wc -l:统计protobox目录下文件的行数,输出 389 行,表示该目录下有 389 个文件。

  3. 生成 MachO 文件

    • 通过使用--macho选项,可以将沙盒配置文件转换为 MachO 格式。MachO 是 macOS 和 iOS 使用的二进制文件格式,可以被反汇编工具加载进行更深入的分析。


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

通信网络安全防护定级备案 | 划分网元类型&定级
Shiro CVE-2023-46750 重定向到恶意网站
Traceeshark:一款基于Wireshark的Linux运行时安全监控工具
DeepSeek网络攻击的幕后黑手浮出水面
越狱之后的DeepSeek
OpenRelik:一款模块化数字取证调查协作框架

发布评论