首页
社区
课程
招聘
[原创]关于手机ROOT后破解各种保护!!
发表于: 2017-2-8 16:18 14973

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

2017-2-8 16:18
14973

前言:
        最近一直木有发帖了,比较忙,前段时候一直在艹传说中的脏牛(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,或者留言!!
        


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

上传的附件:
收藏
免费 3
支持
分享
最新回复 (40)
雪    币: 416
活跃值: (117)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
自己抢个沙发!!!!
2017-2-8 16:21
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
3
write_at_address_pipe(0xC112907C, &zero, sizeof(zero));  这个写内核代码区,什么环境下成功的?
2017-2-8 16:42
0
雪    币: 341
活跃值: (138)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
厉害厉害。最后一句咋不加红色字体
2017-2-8 18:01
0
雪    币: 82
活跃值: (104)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
牛逼!思路清晰,结构完整,表演大方,能聊聊刨牛的过程就更好了!
2017-2-8 18:17
0
雪    币: 18
活跃值: (561)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
楼主,楼下是什么鬼。。。。
2017-2-9 09:34
0
雪    币: 416
活跃值: (117)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
代码里面有,,这是在把进程改成ROOT以后,limmit等于-1以后调用的
2017-2-9 09:57
0
雪    币: 416
活跃值: (117)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8
施主好眼力。。。嘿嘿嘿
2017-2-9 10:00
0
雪    币: 416
活跃值: (117)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
9

如果跟帖对牛牛感兴趣的人超过50就写一个吧。。。
你算第一个了。。嘿嘿!!!
2017-2-9 10:02
0
雪    币: 90
活跃值: (173)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
手动点赞
2017-2-9 10:26
0
雪    币: 115
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
刨牛 +1
2017-2-9 10:29
0
雪    币: 35
活跃值: (139)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
牛逼,很详细的文章,学习了
2017-2-9 19:03
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mark
2017-2-9 22:40
0
雪    币: 59
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
之前也碰到过root以后mount  rw /system 失败,后来mount rw /就解决了
2017-2-9 23:20
2
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢楼主分享,UP+
2017-2-9 23:56
0
雪    币: 41
活跃值: (823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
来见识见识大牛
2017-2-10 08:38
0
雪    币: 210
活跃值: (636)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
17
刨牛+1
2017-2-10 09:24
0
雪    币: 47
活跃值: (418)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
18
赞赞赞,思路好清晰
2017-2-10 09:50
0
雪    币: 347
活跃值: (1951)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
膜拜大神。赶紧学习
2017-2-10 22:46
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
传说部分厂商的system保护可以用adb解决
2017-2-12 18:46
0
雪    币: 416
活跃值: (117)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
21
adb 怎么解决? 求科普!!!
2017-2-13 09:59
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
刨牛 +1
2017-2-13 11:07
0
雪    币: 6
活跃值: (1141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
感觉这种科普性的文章不多见了,特别是做anroid root相关的,要么就是丢个cve源码,要么就是翻译下老外的文章,版主给他加个精好了
2017-2-13 12:24
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
mark!!!!!!
2017-2-13 14:47
0
雪    币: 1887
活跃值: (2766)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
25
小伙子,你的关注点很特别。
上传的附件:
2017-2-13 14:56
0
游客
登录 | 注册 方可回帖
返回
//