欢迎转载,转载请注明出处:http://www.cnblogs.com/lanrenxinxin/p/5572640.html

0x00 关于root

 linux和类Unix系统的最初设计都是针对多用户的操作系统,对于用户权限的管理很非常严格的,而root用户(超级用户)就是整个系统的唯一管理员,拥有等同于操作系统的所有权限。所以一旦获取到root权限,就可以对整个系统进行访问和修改。而在Android下获取root权限之后就可以自己定制系统,卸载一些预装软件,完全掌控自己的设备。

0x01 setUID

在讨论root的原理之前,有一个非常重要的概念,就是文件的setUID权限。linux下普通的文件权限大家都很清楚,可读,可写,可执行,下图很清楚的一个普通的可执行文件root的权限,r(可读),w(可写),x(可执行)。

 但是,要考虑一种情况,比如说,一个用户是有权修改自己的密码的,但是记录密码的文件/etc/shadow只有root用户才是可写的,那普通用户如何才能修改自己的密码呢?这一切都要归功于setUID的设置,修改密码时使用的命令passwd对应的二进制程序是/usr/bin/passwd

可以看到passwd的二进制文件的权限位中不仅仅是rwx了,多了一个s权限,而这个s权限就是我们的主角,setUID权限

由于passwd有setUID权限,所以linux系统可以临时把这个文件的所有者(root)身份角色赋给普通用户,以达到让普通用户可以修改自己密码的目的。

那如何设置setUID权限呢?

平常使用的普通文件权限位是由3、3、3共9位的二进制数字组成 ---|---|---,分别对应文件所有者,文件所有者同一用户组权限和其他用户权限。最开始的名为root的可执行文件的权限为rwxrwxr-x,所对应的二进制位就是111 111 101 ,然后每三位对应421换算成16进制,就是775。而新增的setUID权限是在前面新增了三位,分别表示setGID、setUID、stick bit权限,而我们现在只关心setUID权限。因此加上setUID权限之后,文件的权限应该由4位数字组成,例如之前的root文件加上setUID权限就是4755。而修改密码的passwd文件对应的权限位就是4755。

可以通过一个小例子来直观的感受一下,平常使用的cat命令对应的二进制文件是没有setUID权限的:

可以在普通用户下尝试使用cat去读取/etc/shadow文件的内容:

提示权限不够,再给cat加上setUID权限之后再去读取/etc/shadow的内容:

是可以读出来的,但是/etc/shadow中的内容都经过加密处理。

0x02 Linux 下的root

平常使用的linux发行版,需要切换到root用户时,直接使用su命令,然后输入su用户的密码就可以切换到root用户了。

0x03 Android 的root

但是在未root的Android设备上是没有su的二进制文件,直接执行su命令会提示"su not found"。

再进入已经root过的设备上查看,平常在adb shell中用的命令对应的二进制文件都是在/system/bin目录下,是存在su文件的:

可以看到这里的su只是一个指向/system/xbin/的一个链接。

可以看到这里的su是有setUID权限位的。

而要在系统分区 /system/xbin 中添加文件本身就是需要root权限,而且设置su文件的所有者为root用户也是需要root权限的,设置setUID权限同样也需要root权限。

这就进入到了一个死循环当中,要利用su,首先要有root权限。因此这时就需要利用到Android存在的漏洞,Android系统本身存在着很多以root权限运行的原生进程,而这些root进程中如果存在可以利用的漏洞,就可以利用进程的root身份:

  1. 拷贝su文件到/system/xbin系统分区;
  2. 设置su文件所有者为root用户;
  3. 设置su文件的setUID权限,便于自己的进程执行su命令获取root权限。

0x04 Android4.3 之后

以上方法在Android4.3之前可行,也就是Android还未引入SELinux的版本。从Android4.3开始引入SELinux之后,加上system分区多被挂载为nosuid,也就是SetUid位无效。所以都采用的是 C/S 结构来进行root。

[转] Android root 原理的更多相关文章

  1. Android root 原理

    Android root 原理 0x00 关于root linux和类Unix系统的最初设计都是针对多用户的操作系统,对于用户权限的管理很非常严格的,而root用户(超级用户)就是整个系统的唯一管理员 ...

  2. Android Root原理

    概述:通过阅读本文可以深刻理解Android系统中获得Root权限的方法和原理.本文会详细介绍Root的目的,原理和代码层次的具体实现方法. Android Root介绍: 1. Root目的 手机获 ...

  3. Android Root原理初探

    Root Linux:Root == Windows:Adminstrator Android是Linux系统吗? 操作系统 = 系统内核 + 文件系统 Linux发行版:Linux内核 + 文件系统 ...

  4. Android root检测方法小结

    转载目的,之前主要应用这里的原理解决了,手机被某个APP检测为root过的手机的问题,记录后续可能参考. 出于安全原因,我们的应用程序不建议在已经root的设备上运行,所以需要检测是否设备已经root ...

  5. [Android Pro] android root权限破解分析

    许 多机友新购来的Android机器没有破解过Root权限,无法使用一些需要高权限的软件,以及进行一些高权限的操作,其实破解手机Root权限是比较简 单及安全的,破解Root权限的原理就是在手机的/s ...

  6. Android ADB原理及常用命令

    Android调试桥(ADB, Android Debug Bridge)是一个Android命令行工具,包含在SDK 平台工具包中,adb可以用于连接Android设备,或者模拟器,实现对设备的控制 ...

  7. NFC(6)NFC编程的几个重要类,NFC硬件启动android应用原理

    用于NFC编程的几个重要类 Tag NFC 标签 NfcAdapter Nfc 的适配类 NdefMessage 描述NDEF格式的信息 NdefRecord 描述NDEF信息的一个信息段,类似tab ...

  8. android的原理,为什么不需要手动关闭程序

    转自android的原理,为什么不需要手动关闭程序 不用在意剩余内存的大小,其实很多人都是把使用其他系统的习惯带过来来了. Andoird大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制 ...

  9. 【转】Android Activity原理以及其子类描述,androidactivity

        Android Activity原理以及其子类描述,androidactivity 简介 Activity是Android应用程序组件,实现一个用户交互窗口,我们可以实现布局填充屏幕,也可以实 ...

随机推荐

  1. 高反差保留滤镜学习OpenCV:滤镜系列(11)——高反差保留

    这几周笔者几篇文章介绍了改高反差保留滤镜的文章. 关联文章的地址 高反差保留就是高通滤波 r=(pix[x,y]-avg(R))/128 pix[x,y]*r+128*(1-r) #include & ...

  2. jquery表格提交验证

    在表格中的验证 1.body中的内容 <form action="http://www.qq.com" id="form1"><table w ...

  3. MVC源码解析 - Http Pipeline 解析(上)

    IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context); 上一篇说到了创建 ...

  4. ADO.NET初学习

    ①System.Data  → DataTable,DataSet,DataRow,DataColumn,DataRelation,Constraint,DataColumnMapping,DataT ...

  5. 为什么说2017全球云计算大会中国站 (Cloud Connect China 2017)不得不参加?

    2017全球云计算大会中国站将继续关注全球云计算产业现状及最热门的领域,设立主题论坛.2017全球云计算大会中国站将于2017年9月5-7日在上海世博展览馆.正如去年9月活动现场所预告的,2017年除 ...

  6. Zabbix-agent使用自带模板监控 MySQL

    1.rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm 2.yum ...

  7. class.forname()方法的学习(转)

    Class.forName(xxx.xx.xx) 返回的是一个类 首先你要明白在java里面任何class都要装载在虚拟机上才能运行.这句话就是装载类用的(和new 不一样,要分清楚). 至于什么时候 ...

  8. js数组操作-数组去重

    第一个和第二个,都是对新数组或新json进行操作,而第三个是对原数组本身进行indexOf.第一个是用新数组的indexOf来判断是否有重复元素,而第二个是通过nHash[item]来判断是否存在. ...

  9. IOS Android支持中文与本地文件的读取写入

    转自http://www.xuanyusong.com/archives/1069 和http://www.benmutou.com/archives/2094 前几天有个朋友问我为什么在IOS平台中 ...

  10. Memcache(1)

    一.缓存套路 原文地址:http://coolshell.cn/articles/17416.html Scaling Memcached at Facebook 好些人在写更新缓存数据代码时,先删除 ...