昨天弄了下这个驱动,写了个文章,可能水平不高,想了想还是拿出来分享下吧,大佬们别笑我。。。
我想给大家介绍一个安卓内核驱动的数组访问越界漏洞。关于如何搭建漏洞环境可以看我的相关博文,里面介绍了如何获得相关源码以及模拟器内核等的环境设置。
d7fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4S2V1M7$3S2S2L8#2)9J5k6h3y4G2L8g2)9J5c8U0t1H3x3e0S2Q4x3V1j5H3y4q4)9J5c8U0p5H3i4K6u0r3b7h3&6V1M7X3!0A6k6q4)9J5k6r3g2^5M7r3I4G2K9i4c8S2N6r3W2G2L8W2)9J5k6p5E0W2M7X3&6W2L8q4)9J5k6s2y4@1j5h3y4C8i4K6u0V1j5Y4g2X3k6X3g2J5i4K6u0V1L8%4k6W2M7X3k6D9L8%4N6Q4x3V1j5`.
你也可以看我其他的博文,有关于如何编译内核模块的,可以帮你更好地完成实验。
同时,我也录了一个视频,如果不想看文章的朋友可以直接看视频。
1f3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6&6L8%4g2@1N6g2)9J5k6h3u0W2i4K6u0r3y4p5^5^5k6U0q4m8x3p5^5$3e0h3x3`.
好了,先让我来看看那个杂项驱动的源码。
我这里就不介绍杂项设备了,网上有不少资料。这里的漏洞就是我们调用
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地址为止。我有尝试写一个脚本自动化选择那个基址,但是因为涉及到多线程什么的,还要考虑那个脚本里面启动模拟器等等问题,最终没弄成,所以直接偷懒找了个基址。有兴趣的朋友也可以自己去写下脚本。
好了,我们看下加载驱动时它打印出来的那些地址。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
让利润奔跑 谢谢分享,请问一下您的博客现在是什么,原来的链接打不开了