在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)
-
禁止文件写入(特定权限):
-
拒绝写入文件或更改文件属性,特别是
setuid
和setgid
文件。 -
setuid
和setgid
文件是指可以提升权限的文件(如某些系统进程或程序)。 -
这条规则是为了防止进程通过修改这些文件获得更高的权限,提升系统安全性。
-
(deny network*
(local ip "*:*"))
-
禁止网络访问:
-
拒绝所有网络相关的操作(
network*
)。 -
具体规则限制了网络操作的范围,
(local ip "*:*")
表示:-
限制访问所有本地 IP 地址(
*:*
是一个通配符,表示所有IP地址和端口)。
-
-
这条规则的目的是防止进程通过网络进行通信,确保其在沙盒中隔离。
-
(deny storage-class-map)
-
禁止存储类映射:
-
拒绝访问存储类映射功能。
-
存储类映射可能与存储设备管理或文件系统权限相关,禁用它可以进一步限制进程的存储访问。
-
沙盒配置文件使用一种基于 Scheme 的变体语言实现,称为 SandBox Profile Language (SBPL)。在 SBPL 中,每条规则以allow
或deny
开头,后接操作及其参数(例如修饰符和过滤器)。配置文件必须包含一条默认规则(在此例中为allow
),这条规则决定了配置文件是从严格模式开始并定义例外,还是从宽松模式开始并定义限制。
在 iOS 16.5 中,共有 274 个沙盒配置文件,范围从非常简单的文件(如nointernet.sb
,大小为 113 字节)到极其复杂的文件(如platform.sb
,大小为 1.3 MB)。其中,platform.sb
实际上是所有进程的默认或基础配置文件,然后再叠加额外或更具体的配置文件。
为了研究这些配置文件以发现弱点或潜在的攻击面,首先需要提取二进制配置文件数据,并将其反编译为可读的格式。
曾经的做法...
过去有一些工具可以自动提取沙盒配置数据,主要包括:
-
Malus Security提供的
iExtractor
。 -
Stefan Esser开发的
sandbox_toolkit
。
在 Jonathan Levin 的书《macOS 和 iOS 内部原理,第 III 卷:安全与不安全》中提到,他的工具 joker能够提取并反编译沙盒配置文件,但他仍然推荐使用 SandBlaster,因此我们没有测试该工具。据观察,joker
已被 jtool2替代,但后者似乎并不支持这一功能(除非功能隐藏得非常深)。
在早期,所需信息被分散存储在用户空间(/usr/libexec/sandboxd
)和内核(com.apple.security.sandbox
kext)中,因此 Stefan Esser 的工具extract_sbprofiles
通过解析sandboxd
二进制文件来完成提取。然而,将如此关键的任务交给用户空间进程显然存在一些缺陷。因此,在现代系统中,所有配置文件都被存储在内核扩展中,并通过 KTRR(内核文本只读保护机制)加以保护,防止恶意篡改。
由于这些工具无法在当前版本上使用,我们需要进行一些逆向工程,自己找出提取这些二进制数据的方法。
iOS 16.5 的沙盒剖析(Sandboxectomy)
幸运的是,argp 在其出色的沙盒主题演讲中提供了一张“藏宝图”,虽然这个“岛屿”已经被稍微“改造”了一些。这张幻灯片展示了一个大致的思路:
这段内容中提到的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.sandbox
kext 文件加载到 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 扩展指令集)。
注意点
-
提取的 kext 文件独立存在,其导入或依赖项未被解析,因此逆向分析时会增加难度。
-
如果需要全面分析整个依赖关系,建议将完整的
kernelcache
文件加载到反汇编工具中(如 IDA Pro、Ghidra 或 Binary Ninja)。
后续操作
-
将提取的
com.apple.security.sandbox
kext 文件加载到 Binary Ninja。 -
搜索字符串 “builtin collection”。
-
定位到第一个出现的位置,开始分析其相关代码和数据结构。
通过这些步骤,逆向工程师可以深入研究沙盒的实现细节,从而发现潜在的攻击面或弱点。
该字符串有两个交叉引用:
被调用的函数很可能是_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);
-
_profile_create
:-
很可能是一个用于创建沙盒配置文件的内部函数。
-
从调用方式来看,该函数接受多个参数,并返回一个结果(存储在变量
x0_34
中)。
-
-
参数分析:
-
arg1
(&data_fffffff007cfb768
):-
指向一个数据结构,可能是配置文件的目标地址或存储位置。
-
-
arg2
("builtin collection"
):-
一个字符串常量,可能用于标识配置文件的类型或用途(如内置集合)。
-
-
arg3
(&data_fffffff0076d6be0
):-
指向
__const
段中的数据块,可能是沙盒规则的原始二进制数据。
-
-
arg4
(0xcf8c3
):-
看起来像是一个大小参数,可能表示
arg3
数据块的大小。
-
-
arg5
(&data_fffffff009f93fa8
):-
指向另一个数据结构,可能是一个输出参数,用于存储函数执行后的元信息或结果。
-
-
arg3
的数据结构
arg3
指向__const
段中的数据块。__const
段通常包含只读的静态数据,比如字符串、常量数组或特定规则的序列化数据。
该数据块的起始内容看起来是沙盒规则的定义部分,可能包括:
-
沙盒配置文件的元数据。
-
二进制编码的沙盒规则。
具体内容需要进一步解码或分析。
arg4
的含义
arg4
是一个值为0xcf8c3
的数字,看起来是一个大小参数,可能表示:
-
arg3
数据块的总大小(以字节为单位)。 -
或者是沙盒规则的某个子部分的大小限制。
大小参数的存在可能用于:
-
验证输入数据的完整性。
-
限制函数对内存区域的访问,避免溢出或其他安全问题。
与这张幻灯片进行比较后,我们可以看到前几个字节与 iOS 的“版本标识符”(即 0x8000,假设为小端序的 uint16_t)相匹配:
现在,我们可以通过以下步骤将这个数据块提取到一个二进制文件中:
-
选择第一个字节,右键点击,然后选择“Selection->Extend by bytes”。
-
输入大小(在本例中是
0xcf8c3
)。 -
再次右键点击并选择“Selection->Save To...”。
-
将其保存为
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
,可以看到一个数据块,其格式看起来仍然像是一个编译过的沙盒配置文件。
代码解析
提取配置文件步骤分析
-
collection.bin
提取:-
通过右键选择和扩展选定字节,将内存中的第一个数据块(
collection.bin
)导出到文件。 -
大小由
0xcf8c3
确定。
-
-
protobox.bin
提取:-
另一个调用
_profile_create
的地方,加载了一个字符串"protobox collection"
和大小0x4fe81
。 -
重复类似步骤将该数据块导出为
protobox.bin
。
-
-
平台配置文件提取:
-
平台配置文件的加载方式稍有不同。与其他配置文件相比,这里没有直接调用
_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);
-
data_fffffff007cfb8f0
:-
指向沙盒配置文件的起点,地址为
data_fffffff0076bd1f0
。 -
后续可以进一步分析此地址处的数据内容。
-
-
data_fffffff007cfb8f8
:-
值为
0x19389
,可能是该配置文件的大小。
-
-
__builtin_memcpy
调用:-
将固定大小的数据块(
0x18
字节)复制到data_fffffff007cfb908
。 -
数据块内容是一个字节数组,可能是某种元数据或标识符。
-
-
sub_fffffff009f85ab8
函数调用:-
传入
data_fffffff007cfb8f0
和其他参数。 -
很可能是用于初始化、解析或加载沙盒配置文件的函数。
-
前几个字节没有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"
。
代码解析
关键数据提取分析
-
0x19389
的含义:-
在变量
data_fffffff007cfb8f8
中定义的大小。 -
确定为平台沙盒文件的大小,可以从地址
data_fffffff0076bd1f0
开始提取。
-
-
提取数据块的步骤:
-
从
data_fffffff0076bd1f0
地址处读取0x19389
字节。 -
通过反编译工具或脚本将该部分保存为二进制文件
platform.bin
。
-
-
错误处理逻辑:
-
如果
sub_fffffff009f85ab8
返回值x0_35
不为0
,则会调用错误处理函数。 -
错误日志会打印
failed to initialize platform sandbox
,表明初始化平台沙盒失败。
-
沙盒操作的分析
-
操作的存储形式:
-
编译后的沙盒文件中,操作名称被映射为整数(例如
network*
被映射为0x6D
)。 -
因为这些映射可能在不同 iOS 版本中发生变化,所以需要通过提取当前版本的操作列表来确认具体的映射关系。
-
-
操作列表提取:
-
在反编译工具中,通过搜索
"default"
字符串,找到沙盒操作列表的起点。 -
该列表会提供操作名称与其对应整数值的映射关系,用于后续的规则解析。
-
以下是一长串的字符串:
选择整个操作列表(在此例中以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
现在我们已经准备好进行反编译了!
-
选择并提取操作列表:
-
操作列表是以
null byte
作为分隔符的字符串数组(每个操作以\0
结尾)。 -
保存提取的操作列表为
operations.bin
文件。
-
-
格式转换:
-
使用命令
tr '\0' '\n'
将null byte
替换为换行符,使每个操作占据文件的一行。 -
输出文件为
operations.txt
。
-
-
操作验证:
-
通过命令
head operations.txt
查看文件的前几行内容,确保格式正确。 -
示例中展示了部分操作列表,包括
default
、appleevent-send
、device-camera
等操作。
-
-
操作的用途:
-
每个操作对应沙盒中的特定权限或限制,例如:
-
device-camera
:限制对摄像头设备的访问。 -
darwin-notification-post
:限制发送 Darwin 通知的能力。
-
-
-
下一步:反编译:
-
现在已经具备了操作列表文件(
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 需要tqdm
Python 库,所以需要在虚拟环境中安装:
$ 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)
代码解析
-
克隆 SandBlaster 并创建虚拟环境:
-
使用
git clone
克隆 SandBlaster 工具。 -
创建一个 Python 虚拟环境,并激活该环境。
-
-
安装
tqdm
库:-
使用
pip install tqdm
安装tqdm
,这是 SandBlaster 所依赖的一个库。
-
-
查看
reverse_sandbox.py
的帮助:-
进入
reverse-sandbox
目录并运行python reverse_sandbox.py --help
查看该工具的用法。
-
-
命令行参数解析:
-
-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))
代码解析
-
创建输出目录并运行 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
:指定要反向工程的沙盒配置文件路径。
-
-
-
工具输出解释:
-
输出提供了配置文件的结构信息,包括沙盒操作节点数、全局变量、状态、操作节点的大小、以及正则表等信息。
-
这些信息有助于理解沙盒配置文件的内存布局,并为反向工程分析提供了详细的参考数据。
-
-
全局变量:
-
输出中的
global variables
显示了与沙盒相关的全局变量,包括用户主目录路径、UUID、以及特定的 entitlement(权限)标识符。
-
-
操作节点和过滤转换:
-
沙盒操作节点的数量为 5879,表示沙盒中定义的操作。这些操作会根据不同的过滤条件进行转换和处理。
-
-
生成的配置文件:
-
反向工程后的沙盒配置文件
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 文件,这样你可以将文件加载到你选择的反汇编工具中。
-
重复反向工程过程:
-
创建输出目录:使用
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
。
-
-
统计文件行数:
-
ls -l collection | wc -l
:统计collection
目录下文件的行数,输出 274 行,表示该目录下有 274 个文件。 -
ls -l protobox | wc -l
:统计protobox
目录下文件的行数,输出 389 行,表示该目录下有 389 个文件。
-
-
生成 MachO 文件:
-
通过使用
--macho
选项,可以将沙盒配置文件转换为 MachO 格式。MachO 是 macOS 和 iOS 使用的二进制文件格式,可以被反汇编工具加载进行更深入的分析。
-
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)