MTK相机内核驱动缺陷导致的权限提升,poc原理分析
2015-07-21 14:34
821 查看
由于工作需要,实现对hongmi手机的root。因此,逆向了某国内知名root软件的提权方案。有进一步分析了其root原理,简单跟大家分享下。
/*
转载请注明出处:http://blog.csdn.net/jinangl_vsnake/article/details/46985425
如有交流,发送至邮箱jinangl@163.com
*/
根据逆向结果,搜索漏洞,再乌云上找到一篇文章"MTK相机内核驱动缺陷导致的权限提升"(http://www.wooyun.org/bugs/wooyun-2010-021778),比较契合。其漏洞为MTK相机驱动未检查用户参数,导致用户能够修改任意内存。
首先,打开camera-isp设备文件。
fd = open("/dev/camera-isp",
0x802/* O_RDWR|O_NONBLOCK|O_LARGEFILE 0x802 */
);
然后将其映射到进程空间,起始线性地址为0x20000000U,映射长度为2G,偏移为0x10000000U。
mmapAddr = (unsigned int)mmap((void*)0x20000000U,
0x80000000U,//0x80000000U
0x3,
0x11,
fd,
0x10000000U); //0x30010000U
之所以映射2G的内存大小,是因为内核代码段与camera-isp的距离为0x80000000-0x15000000=0x6B000000,接近2G
15000000-1500e000 : camera-isp.0
15000000-1500e000 : camera-isp
80000000-bbffffff : System RAM
80008000-807f1fff : Kernel code
8082c000-80b532e7 : Kernel data
根据计算得知,内核代码段和数据段在0x80000000-0x1000000开始,因此可以对任意内核代码和数据进行读写。
下面,说一个实现root提权思路:
通过在映射到进程空间的内核代码段和数据段进行搜索,可以查找系统调用表,然后修改linux内核无用的系统调用(如0x10F系统调用项)项为自己定义的一个回调函数void callback();。
通过syscall(0x10F);触发系统调用。
在callback()函数中实现提权的目的即可。
/*
转载请注明出处:http://blog.csdn.net/jinangl_vsnake/article/details/46985425
如有交流,发送至邮箱jinangl@163.com
*/
根据逆向结果,搜索漏洞,再乌云上找到一篇文章"MTK相机内核驱动缺陷导致的权限提升"(http://www.wooyun.org/bugs/wooyun-2010-021778),比较契合。其漏洞为MTK相机驱动未检查用户参数,导致用户能够修改任意内存。
首先,打开camera-isp设备文件。
fd = open("/dev/camera-isp",
0x802/* O_RDWR|O_NONBLOCK|O_LARGEFILE 0x802 */
);
然后将其映射到进程空间,起始线性地址为0x20000000U,映射长度为2G,偏移为0x10000000U。
mmapAddr = (unsigned int)mmap((void*)0x20000000U,
0x80000000U,//0x80000000U
0x3,
0x11,
fd,
0x10000000U); //0x30010000U
之所以映射2G的内存大小,是因为内核代码段与camera-isp的距离为0x80000000-0x15000000=0x6B000000,接近2G
15000000-1500e000 : camera-isp.0
15000000-1500e000 : camera-isp
80000000-bbffffff : System RAM
80008000-807f1fff : Kernel code
8082c000-80b532e7 : Kernel data
根据计算得知,内核代码段和数据段在0x80000000-0x1000000开始,因此可以对任意内核代码和数据进行读写。
下面,说一个实现root提权思路:
通过在映射到进程空间的内核代码段和数据段进行搜索,可以查找系统调用表,然后修改linux内核无用的系统调用(如0x10F系统调用项)项为自己定义的一个回调函数void callback();。
通过syscall(0x10F);触发系统调用。
在callback()函数中实现提权的目的即可。
相关文章推荐
- ProgressBar自定义
- 232 Implement Queue using Stacks
- 猎头是这样看简历的,你知道吗?
- 线段树总结
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第20讲:一个IP绑定多个域名
- 正则表达式入门浅析
- 微信公众平台开发之模板消息(Java)
- Visual C++ 在windows 7 上预编译头错误unexpected precompiled header error, simply rerunning the compiler migh
- Set Matrix Zeroes
- nslookup 通往dns的桥梁
- [错误] scp 时 ssh Connection refused
- DirectX11 常量缓存
- 包装类简介
- Android验证码倒计时的处理
- object-c 属性列表上的各个常用属性值及其含义
- android 点击listview 展开和闭合 效果
- Hibernate中 对象 的三种状态
- Java多线程--售票代码
- ios NSDateComponents 时间计算方法
- Qt QLabel::setBuddy函数