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