首页
社区
课程
招聘
[原创]一个内核驱动的数组越界访问漏洞
发表于: 2018-6-4 09:24 7390

[原创]一个内核驱动的数组越界访问漏洞

2018-6-4 09:24
7390

昨天弄了下这个驱动,写了个文章,可能水平不高,想了想还是拿出来分享下吧,大佬们别笑我。。。

我想给大家介绍一个安卓内核驱动的数组访问越界漏洞。关于如何搭建漏洞环境可以看我的相关博文,里面介绍了如何获得相关源码以及模拟器内核等的环境设置。

http://xdshao.com/2018/04/10/Android-exploitation-Kernel-stack-buffer-overflow/

你也可以看我其他的博文,有关于如何编译内核模块的,可以帮你更好地完成实验。

同时,我也录了一个视频,如果不想看文章的朋友可以直接看视频。

https://youtu.be/4N8f1A0N6Mc

好了,先让我来看看那个杂项驱动的源码。

我这里就不介绍杂项设备了,网上有不少资料。这里的漏洞就是我们调用

handlers[handler_index].runHandler();

时,代码没有检测我们输入的handler_index,我们就可以访问数组外的地址,从而有可能使其调到我们指定的位置执行代码。这里有张图很好,可以看下。



基本的想法就是这里我们输入0的话,它会访问handlers[0]所指向的函数,这里就是0xC00C1000。 如果我们输入4,它就会访问0xDEADBEEF处的函数了。

让我们看下solution的源码。里面有这个get_sysmbol函数。

这个函数就是为了获得commit_creds 和 prepare_kernel_cred的地址,从而在shellcode里面运行commit_creds(prepare_kernel_cred)从而变成root id。Main函数也非常简单。

这里首先mmap了一段内存,然后清空了内存,在内存最后面复制上我们的shellcode。这保证了我们jump到指定地址后可以一路通过nop指令滑到我们那个shellcode。好了,大致原理就是这个,听起来很简单吧,但是实际操作起来却又会有不少问题。

好了,让我们动手吧。

首先,改变一下驱动源代码。


这里我们打印出array后面200个地址内存的数值,从中选择一个合理的基地址mmap。这里因为只是用这个介绍漏洞所以我们偷下懒。实际上我们需要一个个去试index直到我们找到合适的mmap地址为止。我有尝试写一个脚本自动化选择那个基址,但是因为涉及到多线程什么的,还要考虑那个脚本里面启动模拟器等等问题,最终没弄成,所以直接偷懒找了个基址。有兴趣的朋友也可以自己去写下脚本。

好了,我们看下加载驱动时它打印出来的那些地址。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 2694
活跃值: (80)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
2018-6-8 07:59
0
雪    币: 1432
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢分享!!!!
2018-6-8 08:43
0
雪    币: 104
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
谢谢分享,请问一下您的博客现在是什么,原来的链接打不开了
2019-10-15 14:55
0
雪    币: 85
活跃值: (101)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
让利润奔跑 谢谢分享,请问一下您的博客现在是什么,原来的链接打不开了
博客挂了。。现在的是https://qiushui777.github.io/,不过很少分享安全内容了。。后期可能会再做些安卓研究
2019-11-18 11:43
0
雪    币: 277
活跃值: (485)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢楼主分享,想请教楼主一个问题,open驱动文件后,mmap出来的内存却是空的,但通过ioctl操作这内存确实可以的,楼主可以指导下我嘛,非常感谢
2021-5-29 16:12
0
游客
登录 | 注册 方可回帖
返回
//