欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]关于手机ROOT后破解各种保护!!

[原创]关于手机ROOT后破解各种保护!!

前言:
        最近一直木有发帖了,比较忙,前段时候一直在艹传说中的脏牛(CVE-2016-5195),
已经弄的七七八八,三星S7(安卓6.0)都可以支持,而且漏洞还不涉及到PXN(不用硬编码,
对于安卓5.0和6.0有通杀效果),结论就是这个漏洞确实很牛逼!!!好了,吹了这么多牛逼,
然并卵,今天聊的并不是这个漏洞,嘿嘿。。.
干货:
       
        ROOT手机的时候,经常遇到一个问题,漏洞成功了,权限也拿到了,/data分区也
可以写文件了。。但却不能挂载/system分区,提示权限不够,
例如我手上的这台富士通机器,机器信息如下:
====================================================
shell@android:/data/local/tmp $ getprop |grep manufacturer
getprop |grep manufacturer
[ro.product.manufacturer]: [FUJITSU]
shell@android:/data/local/tmp # getprop |grep model
getprop |grep model
[ro.build.model.id]: [HDS]
[ro.product.model]: [301F]
shell@android:/data/local/tmp # cat /proc/version
cat /proc/version
Linux version 3.4.0 (build@PRIMERGY010) (gcc version 4.6.x-google 20120106
(prerelease) (GCC) ) #2 SMP PREEMPT Wed May 13 12:29:13 JST 2015
====================================================
执行漏洞成功
shell@android:/data/local/tmp # id
id
uid=0(root) gid=0(root) groups=1003(graphics),1004(input),1007(log),1009(mount)
,1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),
3003(inet),3006(net_bw_stats)
shell@android:/data/local/tmp # mount -o rw,remount /system
mount -o rw,remount /system
mount: Operation not permitted
255|shell@android:/data/local/tmp # mkdir /data/z
mkdir /data/z
shell@android:/data # ls -al |grep z
ls -al |grep z
drwxrwxrwx root     root              2013-01-01 00:35 z
====================================================
上面一切都很顺利
shell@android:/data # mount -o remount,rw /system
mount -o remount,rw /system
mount: Operation not permitted
下一秒就日了狗了,还是提示权限不足。但是/data分区确实有权限写文件了丫!!
====================================================

        /(ㄒoㄒ)/~~  这是为虾米呢,其实我也不会弄了。。大家都散了吧!!!!!
楼下:
        这样真的好么!!!
*****************************************************************
*****************************************************************
*****************************************************************
既然你诚心诚意的指教了,
我们就大发慈悲的告诉你:
为了防止世界被破坏,
为了守护世界的和平,
贯彻爱与真实的邪恶,
可爱又迷人的反派角色,
武藏!
小次郎!
我们是穿梭在银河中的火箭队,
白洞、白色的明天正等著我们!
*****************************************************************
*****************************************************************
*****************************************************************
分析思路:
一:
        首先我们看看 mount -o remount,rw /system 到底是个什么东西?
====================================================
shell@android:/system/bin # ll mount
ll mount
lrwxr-xr-x root     shell             2013-11-07 12:41 mount -> toolbox
shell@android:/system/bin # ll toolbox
ll toolbox
-rwxr-xr-x root     shell      134912 2013-11-07 12:41 toolbox
====================================================
通过分析发现,其实是一个命令集合的bin文件,toolbox提供了很多的命令,而最终会调用
mount函数(这里注意一下,mount命令和mount函数的区别)
mount函数是一个系统调用,mount函数会直接进入内核,关于这个函数就不详续了,
网上有很多资料。
大概看一下mount的函数调用逻辑:
        (用户态)       
        int mount(const char *source, const char *target,
                   const char *filesystemtype, unsigned long mountflags,
                const void *data);
        (内核态)
        ->       
        SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
                char __user *, type, unsigned long, flags, void __user *, data)
        ->
        long do_mount(char *dev_name, char *dir_name, char *type_page,  
          unsigned long flags, void *data_page)  
        ->
        static int do_remount(struct path *path, int flags, int mnt_flags,
                      void *data)
这里就是整个mount函数的调用顺序。
二:
        在继续分析之前,我们还需要3样东西:1是内核的源代码(直接下载),
        2是手机的内核二进制文件,3是手机的kallsyms符号表(2.3的提取,
        坛里朋友已经有很详细的说明了,我就不详续了)
        弄清楚mount在干什么了以后,我们就可以来慢慢的排除,问题到底出在哪里了,,
        用ida打开提取的二进制文件,定位到do_mount(c0269f7c T do_mount)函数
        通过二进制文件和源代码的比较,,发现一处比较可疑的函数调用
====================================================
           v9 = sub_C0344D80(v7, &v51, v6, v5);
            if ( v9 )
                      goto LABEL_125;                返回失败
       
        函数调用失败,直接返回,不会继续下面流程
        继续分析函数
        signed int __fastcall sub_C0348544(int a1, int a2, int a3, char a4)
        {
                if ( !sub_C038350C(v9, (_BYTE *)"/dev/block/mmcblk0p21") )               
                //sub_C038350C比较函数,mmcblk0p21实际上也就是system分区       
                {
                              if ( !sub_C038350C(v7, (_BYTE *)"/system/") )                       
                        //这里其实是在比较是不是/system分区,很可疑了
                              {
                                v14 = MEMORY[0xC112907C] - 1;
                                v15 = MEMORY[0xC112907C] >= 5u;
                                v16 = MEMORY[0xC112907C] == 5;
                                if ( MEMORY[0xC112907C] != 5 )
                                {
                                          v15 = v14 >= 1;
                                          v16 = v14 == 1;
                                }
                                if ( v16 || !v15 || MEMORY[0xC112907C] == 3
                                        || v6 & 1 )       
                                0xC112907C==3直接返回成功,可以想办法然条件成立
                                          goto LABEL_48;
shell@android:/system/bin # ll /dev/block/platform/msm_sdcc.1/by-name
ll /dev/block/platform/msm_sdcc.1/by-name
lrwxrwxrwx root     root       1970-07-06 09:44 system -> /dev/block/mmcblk0p21
我们想办法让这个函数返回0,这样 if ( v9 ) 就会不成立。
OK 写代码测试
====================================================
三:
        写代码测试:
        int zero = 3;
               
        write_at_address_pipe(0xC112907C, &zero, sizeof(zero));
测试通过
====================================================
root@android:/data/local/tmp # id
id
uid=0(root) gid=0(root) groups=1003(graphics),1004(input),1007(log),1009(mount)
,1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt)
,3003(inet),3006(net_bw_stats)
root@android:/data/local/tmp # mount -o rw,remount /system
mount -o rw,remount /system
root@android:/data/local/tmp # mount |grep /system
mount |grep /system
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 rw,relatime
,discard,data=ordered 0 0
调用成功,而且/system分区现在已经是可读可写了。
root@android:/system # mkdir z
mkdir z
mkdir failed for z, Operation not permitted
====================================================
四:
        1.其实绕过的思路有很多种,我选择了比较小改动的方法,还可以比如直接修改内核
代码把函数直接RET返回0,或者直接在内核里面实现一部分mount函数。自己怎么开心怎么玩。
同理,比如写入保护,删除保护,基本都是这样的原理!!
        2.漏洞代码是用的iovyroot(CVE-2015-1805)这份代码,网上直接可以下载到,这个
漏洞的原理,我以前的文章也有详细介绍过,这份代码附件里面我也会提供下载
        3.关于其他厂商的保护,其实思路都差不多,希望能达到授人以渔的效果。当然如果
有更好的思路,求大神分享
        4.如果有什么疑惑或错误的地方,可以加我QQ,或者留言!!
        

上传的附件 jni.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功