-
-
[原创]一个内核驱动的数组越界访问漏洞
-
发表于:
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期)