最近在研究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 shellpalera1n-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里面应该可以做很多事情,刚好最近失业了可以好好研究一下 :(githubif (!(imgp->ip_flags & IMGPF_DISABLE_ASLR)) {
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287808.htm
[原创]通过PongoOS打内核补丁禁用ASLR
334 浏览
7 回复
感谢分享
感谢分享
感谢大佬分享
tql
好
感谢大佬
mark