首页
社区
课程
招聘
[原创]通过PongoOS打内核补丁禁用ASLR
发表于: 2025-7-29 20:11 3421

[原创]通过PongoOS打内核补丁禁用ASLR

2025-7-29 20:11
3421

最近在研究PongoOS的时候看到一个函数 xnu_pf_maskmatch, 于是就拿ASLR练练手。

ASLR 的全称是 Address Space Layout Randomization(地址空间布局随机化),通俗一点讲就是类似WINDOWS下的随机基址,默认情况下每次模块被加载到内存中的基址都是不一样的

要想修改ASLR首先要知道这个值是怎么计算的,刚好XNU是开源的,下载对应版本的源码,搜索load_machofile 可以找到赋值的地方

dyld_aslr_page_offset计算的方式是通过随机数与ASLR slide page计算得来的,如果能在内核中定位到这段代码就可以修改这这个值,有了代码还需要对应的 kernelcache 文件

IOS的kernelcacheke可以从ipsw中提取,比如 IOS15.8.4的是 kernelcache.release.n66
使用ida加载这个文件,打开后选择kernel only, 我们不需要分析 kexts
图片描述

kernelcache本身是没有符号的,通过查看XNU源码可以发现搜索字符串"Mach-o Binary"能定位到函数load_machofile

图片描述

图片描述

通过对比源码可以确定 v27 就是 dyld_aslr_page_offset, 剩下的只需要找到内核中的位置修改汇编将 LSL X8, X8, X10 改为 mov x8, #0即可
图片描述

由于checkra1n不支持IOS15.8.4,所以选择palera1n刷入PongoOS, 在官网下载palera1n-macos-arm64 执行 -p, -p 代表 Boots to PongoOS shell

palera1n-macos-arm64 -p

然后神奇的又发现一个错误,

PongoOS image is too large: must be at most 0x7fe00, have 0xa5060

因为我的是IOS15系统,解决这个错误需要自己编译PongoOS的IOS15分支
图片描述

编译PongoOS 比较简单,直接 make all 就行,编译后再执行

./palera1n-macos-arm64 -k /Users/cmg/Desktop/PongoOs/checkra1n/PongoOS/build/Pongo.bin -p

然后根据提示进入DFU,成功的话会出现 PongoOS 界面,要登陆PongoOS 使用

./PongoOS/scripts/pongoterm

如果一切顺利可以看到

最后就可以愉快的编写代码了,

回调函数如下,0xd2800008 对应的就是 mov x8, #0

编写完代码直接make,然后将编译后的 kext bundle 文件上传到PongoOS,文件这么大是因为我把capstone也编译进去了

在修改之前可以先打印看看内存

修改完后再看看效果,可以看到0x4042fd660已经修改成功了

最后一步就是完成之前的越狱操作,由于命令太多直接放到txt中,图中的几个bin文件通过解密palera1n获取,也就是抓USB包,网上也有人分享
图片描述
最后执行

./PongoOS/scripts/pongoterm < ./jail.txt

手机重启后,编写一个简单的函数试试效果

使用scp上传到手机直接运行,正常情况下这个地址每次运行都不是固定的
图片描述

由于我的IOS系统版本是15.8.4,使用的是palera1n + IOS15 PongoOS,checkra1n需要你自己测试,PongoOS里面应该可以做很多事情,刚好最近失业了可以好好研究一下 :(

github

if (!(imgp->ip_flags & IMGPF_DISABLE_ASLR)) {
    vm_map_get_max_aslr_slide_section(map, &aslr_section_offset, &aslr_section_size);
    aslr_section_offset = (random() % aslr_section_offset) * aslr_section_size;
 
    aslr_page_offset = random();
    aslr_page_offset = (aslr_page_offset % (vm_map_get_max_aslr_slide_pages(map) - 1)) + 1;
    aslr_page_offset <<= vm_map_page_shift(map);
 
    dyld_aslr_page_offset = random();
    dyld_aslr_page_offset = (dyld_aslr_page_offset %
        (vm_map_get_max_loader_aslr_slide_pages(map) - 1)) + 1;
    dyld_aslr_page_offset <<= vm_map_page_shift(map);
 
    aslr_page_offset += aslr_section_offset;
}
if (!(imgp->ip_flags & IMGPF_DISABLE_ASLR)) {
    vm_map_get_max_aslr_slide_section(map, &aslr_section_offset, &aslr_section_size);
    aslr_section_offset = (random() % aslr_section_offset) * aslr_section_size;
 
    aslr_page_offset = random();
    aslr_page_offset = (aslr_page_offset % (vm_map_get_max_aslr_slide_pages(map) - 1)) + 1;
    aslr_page_offset <<= vm_map_page_shift(map);
 
    dyld_aslr_page_offset = random();
    dyld_aslr_page_offset = (dyld_aslr_page_offset %
        (vm_map_get_max_loader_aslr_slide_pages(map) - 1)) + 1;
    dyld_aslr_page_offset <<= vm_map_page_shift(map);
 
    aslr_page_offset += aslr_section_offset;
}
lret = load_machfile(imgp, mach_header, thread, &map, &load_result);
lret = load_machfile(imgp, mach_header, thread, &map, &load_result);
➜  PongoOs ./PongoOS/scripts/pongoterm
[Connected]
 
#==================
#
# pongoOS 2.6.3-cc532fac
#
# 2ffK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0K9r3g2U0K9%4u0S2i4K6u0W2K9h3^5`.
#
#==================
Booted by: iBoot-7459.140.15
Built with: Clang 14.0.3 (clang-1403.0.22.14.1)
Running on: Apple A9 (S8003, TSMC)
pongoOS>
➜  PongoOs ./PongoOS/scripts/pongoterm
[Connected]
 
#==================
#
# pongoOS 2.6.3-cc532fac
#
# fddK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0K9r3g2U0K9%4u0S2i4K6u0W2K9h3^5`.
#
#==================
Booted by: iBoot-7459.140.15
Built with: Clang 14.0.3 (clang-1403.0.22.14.1)
Running on: Apple A9 (S8003, TSMC)
pongoOS>
void module_entry(){
    command_register("dis", "disassemble", disassemble);
    command_register("kfind", "kfind", kfind);
    command_register("hd", "hexdump", hexdump0);
    command_register("mpp", "mem patch", mem_patch);
    return;
}
void module_entry(){
    command_register("dis", "disassemble", disassemble);
    command_register("kfind", "kfind", kfind);
    command_register("hd", "hexdump", hexdump0);
    command_register("mpp", "mem patch", mem_patch);
    return;
}
uint64_t matches[] = {
    0x1b0ba188,
    0x11000508
    0x9aca2108
};
uint64_t masks[] = {
    0x1b0ba188,
    0x11000508
    0x9aca2108
     
};
xnu_pf_patchset_t *text_exec_patchset = xnu_pf_patchset_create(XNU_PF_ACCESS_32BIT);
 
struct mach_header_64* hdr = xnu_header();
xnu_pf_range_t* text_exec_range = xnu_pf_section(hdr, "__TEXT_EXEC", "__text");
// printf("aslr %llx\n", text_exec_range->device_base + 0x4C56E4);
 
xnu_pf_maskmatch(text_exec_patchset, "disable_aslr", matches, masks,
               sizeof(matches) / sizeof(uint64_t), false,
               (void *)aslr_callback);
 
xnu_pf_emit(text_exec_patchset);
xnu_pf_apply(text_exec_range, text_exec_patchset);
xnu_pf_patchset_destroy(text_exec_patchset);
uint64_t matches[] = {
    0x1b0ba188,
    0x11000508
    0x9aca2108
};
uint64_t masks[] = {
    0x1b0ba188,
    0x11000508
    0x9aca2108
     
};
xnu_pf_patchset_t *text_exec_patchset = xnu_pf_patchset_create(XNU_PF_ACCESS_32BIT);
 
struct mach_header_64* hdr = xnu_header();

[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

最后于 2025-7-31 17:57 被just赋予编辑 ,原因: 添加 github
收藏
免费 29
支持
分享
最新回复 (23)
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2025-7-30 08:45
0
雪    币: 105
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
666
2025-7-30 10:26
0
雪    币: 8842
活跃值: (6692)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2025-7-30 10:37
0
雪    币: 0
活跃值: (196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
6666
2025-7-30 15:27
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
666
2025-7-30 17:38
0
雪    币: 38
活跃值: (2869)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
感谢大佬分享
2025-7-31 23:06
0
雪    币: 1373
活跃值: (2095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
tql
2025-7-31 23:09
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
2025-8-1 13:51
0
雪    币: 209
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
666
2025-8-1 15:50
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
777
2025-8-4 14:21
0
雪    币: 230
活跃值: (1576)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
7
2025-8-6 14:30
0
雪    币: 0
活跃值: (479)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
666
2025-8-7 10:50
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
666
2025-9-8 23:34
0
雪    币: 144
活跃值: (2153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
666666
2025-9-9 00:26
0
雪    币: 334
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
感谢大佬
2025-9-9 07:02
0
雪    币: 225
活跃值: (83)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
666
2025-9-26 09:06
0
雪    币: 603
活跃值: (1679)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
123
2025-9-26 09:18
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
66
2025-9-30 11:34
0
雪    币: 69
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
2025-9-30 23:34
0
雪    币: 5659
活跃值: (3762)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
21
mark
2025-12-5 20:02
0
雪    币: 178
活跃值: (1929)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
66
2025-12-9 14:42
0
雪    币: 6
活跃值: (485)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
6666
2026-1-6 23:41
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
66666
2026-1-14 21:33
0
游客
登录 | 注册 方可回帖
返回