首页
社区
课程
招聘
[原创]iOS赛区第二题
发表于: 2015-10-18 20:07 2957

[原创]iOS赛区第二题

2015-10-18 20:07
2957
kernelcache.bin
拿到cache ,IDA 分析
题目:
环境:iPhone5C(A1529) iOS 8.4 kernelcache ,解密后的kernelcache见附件

求得下列地址(减去kaslr):
(1)设备/dev/random,对应结构体cdevsw中d_read, d_write, d_ioctl在题目给出kernelcache中的地址。
(2)设备/dev/pf,对应结构体cdevsw中d_read, d_write, d_ioctl在题目给出kernelcache中的地址。
(3)设备/dev/ptmx,对应结构体cdevsw中d_read, d_write, d_ioctl在题目给出kernelcache中的地址。

假设上述地址的结果是:
/dev/random
d_read:0x80001231
d_write:0x80001253
d_ioctl:0x80001275
/dev/pf
d_read:0x80201297
d_write:0x802012b9
d_ioctl:0x801012db
/dev/ptmx
d_read:0x802012ed
d_write:0x802012ff
d_ioctl:0x80201211

那么答案的格式应该是:(用#号分隔)
0x80001231#0x80001253#0x80001275#0x80201297#0x802012b9#0x801012db#0x802012ed#0x802012ff#0x80201211

首先了解cdevsw结构体是啥样子的,下载开源的XNU代码
然后搜索代码 cdevsw 结构体,搜索到如下图

随便打开一个搜索,如下图

猜测不同设备的cdevsw名称为 xxx_cdevsw
然后再次搜索,发现 random_cdevsw 这个结构体在/xnu/bsd/dev/random/randomdev.c 中,然后寻找引用如下图

发现关键 函数cdevsw_add 这个函数,然后搜索它。
发现引用有5次,如下图

然后依次找对应的类似函数,找结构体指针


d_read, d_write, d_ioctl  三个函数指针也就是 800C0EA0+1,800C0E38+1,800C0E04+1

用同样方法找出   /dev/pf  ,/dev/ptmx  对应的d_read, d_write, d_ioctl  三个函数指针
xnu/bsd/net/pf_ioctl.c ,如下图



对应d_read, d_write, d_ioctl  三个函数指针也就是 _enodev+1(也就是802873AC+1),_enodev+1(也就是802873AC+1),80149D18+1

再用同样方法找出   /dev/ptmx  ,/dev/ptmx  对应的d_read, d_write, d_ioctl  三个函数指针
xnu/bsd/kern/tty_ptmx.c,如下图



对应d_read, d_write, d_ioctl  三个函数指针也就是 80292250+1,80292660+1,8029298C+1
python 脚本:
a="0x800c0ea1"
b="0x800c0e39"
c="0x800c0e05"

a2="0x802873ad"
b2="0x802873ad"
c2="0x80149d19"

a3="0x80292251"
b3="0x80292661"
c3="0x8029298d"

str="%s#%s#%s#%s#%s#%s#%s#%s#%s" % (a,b,c,a2,b2,c2,a3,b3,c3)
print str

0x800c0ea1#0x800c0e39#0x800c0e05#0x802873ad#0x802873ad#0x80149d19#0x80292251#0x80292661#0x8029298d

回顾:
很坑爹的是“d_read, d_write, d_ioctl在题目给出kernelcache中的地址” 这句话,应该理解为函数指针的地址。
开始理解为指针的地址,花了很多时间,然后又忘记+1,又浪费时间了。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//