ITPub博客

首页 > > > Android root破解原理(二)

Android root破解原理(二)

作者:dapan 时间:2018-10-25 16:54:00 0 删除 编辑

从上一篇文章之后

嵌入式Linux:Android Adb 源码分析​zhuanlan.zhihu.com图标

这篇文章讲解root破解原理,讲的不好不要拍砖,请留言点赞,关注【嵌入式Linux】微信公众号

1、了解Android ROOT安全性

Android系统本质就是一个Linux 系统,Linux系统的强大在于多用户管理,对于不同的用户给不同的权限,Linux系统里面有一个超级用户,叫做su,如果你能获取su用户执行的命令,那你就获得了超级用户权限。


超级用户可以干什么?

回答,超级用户可以在你的手机里干任何事情,他可以直接rm -rf *

举个例子

普通用户user模式下,ls命令都执行不了

如果我切换到超级用户su就可以执行ls命令


还有其他功能,比如安装软件,读取短信等

所以说,想保证手机安全和不被病毒入侵,一定不要root了,被别人摩擦屁股了都不知道


2、如何破解手机增加root权限


你想在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示你输入root用户的密码,密码正确就获得root权限了。Android本身就不想让你获得Root权限,大部分手机出厂的时候根本就没有su这个程序,直接把su可执行程序删除掉,所以你想获得Android的root权限,第一步就是要把编译好的su文件拷贝到Android手机的/system/bin或者/system/xbin/目录下。我们先假设你可以把su放在xbin下,接下来你可以在Android手机的adb shell或者串口下输入su了。


Linux下su以后输入密码就可以root了,但Android里的su和Linux里的su是不一样的,Android里的su不是靠验证密码的,而是看你原来的权限是什么。意思就是如果你是root,那你可以通过su切换到别的用户,比如说shell,wifi,audio什么的。但如果你是root之外的其他用户,就不能切换回root了,会提示你permission denied。


所以Android root 无非做了两个操作

1、给android手机的system/bin/目录增加 su命令

2、安装一个super.apk用来给其他应用授权权限


问题都清楚了,就是你需要把一个所有者是root的su拷贝到Android手机上,并且把su的权限标志位置成-rwsr-xr-x。能把这个事情搞定你就成功root了一个手机。

cp /data/tmp/su /system/bin/ #copy su 到/system/分区
chown root:root su #su的所有者置成root
chmod 4775 /system/bin/su #把su置成-rwsr-xr-x

然而,执行上面的每一行代码都需要root权限才能成功。


意思就是说,你只有有root权限的情况下才能执行上面两行代码,而这两行代码就是为了让你获得root权限的,这是一个逻辑闭环,那么如何打破这个逻辑闭环呢?


一个办法就是找一个本身已经有root权限的进程来启动我上面的两行代码,那我这两行代码一启动就是root权限,就可以顺利执行了。但是已经有root权限的进程都是出厂时候就装到手机上的,代码写死了,你没法控制它执行你自己的代码啊。这个时候就需要你找漏洞了,比如用来破解Android2.3 root权限的zergRush漏洞就是利用一个拥有root权限的进程栈溢出漏洞。

很多破解的方法都是从adb入手,因为adb刚出生的时候就是root权限

因为下面两行代码让他变成了shell用户

drop_privileges函数就是改变权限的,关键代码如下

 if (should_drop_privileges()) { //should_drop_privileges返回值决定权限
        drop_capabilities_bounding_set_if_needed();

        minijail_change_gid(jail.get(), AID_SHELL);
        minijail_change_uid(jail.get(), AID_SHELL);
        // minijail_enter() will abort if any priv-dropping step fails.
        minijail_enter(jail.get());

        D("Local port disabled");
    } else {


最初的破解方式就是让adb代码里面从root用户降级到shell用户失败,间接让adb保持root权限,随着android升级后,这部分做了优化,最初的代码是

   /* then switch user and group to "shell" */
   setgid(AID_SHELL);
   setuid(AID_SHELL);

代码之前都是root权限,只有执行这两句之后才变成shell权限的。


这样我们就可以引出root破解过程中获得root权限的方法了,那就是让以上面setgid和setuid函数执行失败,也就是降级失败,那就继续在root权限下面运行了。


这其实利用了一个RageAgainstTheCage漏洞,具体分析请参考《 Android adb setuid提权漏洞的分析》。

这时重新用adb连接设备,则adb将会运行在root权限下面了。


3、其他的root方法

su这个执行打包在boot.img里面,如果获取手机厂商的烧录工具和源码,编译一个boot.img重新烧录是最直接的,如果开发人员如破解者合作,破解手机的机密不是不可能。



4、参考

Android8.0 user版本使用adb root(且不用授权adb key)​blog.csdn.net
Android adb setuid提权漏洞的分析​blog.claudxiao.net

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-08-07

  • 博文量
    4504
  • 访问量
    87236