-
-
[原创]iOS赛区第二题
-
发表于: 2015-10-18 20:07 2954
-
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,又浪费时间了。
拿到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,又浪费时间了。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- [原创]iOS赛区第二题 2955
- [原创]iOS赛区第一题 2881
- [求助]XP R0shellcode执行后不成功 4026
- [讨论]头脑一热发现了一个保护IE的方法 3877
- [求助]ProSSHD 1.2怎么创建账户 密码 3054
谁下载
谁下载
谁下载
谁下载
谁下载
谁下载
谁下载
看原图
赞赏
雪币:
留言: