华仔解说:Android root 原理

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权限。

  微信关注华清远见,回复“干货”400元电子书相赠,每天下午5点30,精彩内容喂饱你。

时间: 2024-10-10 23:00:14

华仔解说:Android root 原理的相关文章

Android Root原理

概述:通过阅读本文可以深刻理解Android系统中获得Root权限的方法和原理.本文会详细介绍Root的目的,原理和代码层次的具体实现方法. Android Root介绍: 1. Root目的 手机获得Root权限以后,用户就可以完全拥有手机系统的最高权限,在Linux系统中相当于Root账号,在Windows系统中相当于Administrator账号.因为Android系统是基于Linux的,所以叫Root权限. 有了Root权限以后,用户可以自由删除一些系统自带的无用软件,更换开关机铃声,去

Android Root原理和流程分析

预备知识 android手机的内部存储设备分RAM和ROM,RAM是运行内存,掉电就会失去所有内容:ROM中的内容掉电后也不会丢失. 比如一台手机的规格参数里写着"2G RAM,16G ROM".理论上,RAM越大,系统运行越流畅.像大型的3D游戏,运行时需要约300M的内存,那么在内存2G的手机上就可以流畅的运行,在512M内存的手机上几乎跑不起来,跑起来也会卡死.我们可以在"设置-管理应用程序-正在运行"中看到手机目前剩余的RAM,一般2GRAM的手机显示可用R

Android root 原理

linux和类Unix系统的最初设计都是针对多用户的操作系统,对于用户权限的管理很非常严格的,而root用户(超级用户)就是整个系统的唯一管理员,拥有等同于操作系统的所有权限.所以一旦获取到root权限,就可以对整个系统进行访问和修改.而在Android下获取root权限之后就可以自己定制系统,卸载一些预装软件,完全掌控自己的设备. 0x01 setUID 在讨论root的原理之前,有一个非常重要的概念,就是文件的setUID权限.linux下普通的文件权限大家都很清楚,可读,可写,可执行,下图

Android Root原理初探

Root Linux:Root == Windows:Adminstrator Android是Linux系统吗? 操作系统 = 系统内核 + 文件系统 Linux发行版:Linux内核 + 文件系统(ext3/4) Android:Linux内核 + 文件系统(ext3/4) Android 没有本地窗口系统 而Linux是可以脱离X窗口的. Android 没有glibc library Android并不包括一整套标准的Linux应用程序 而Linux也是可以脱离这两点的. Android

Android的Root原理

前言 一直很好奇Android Root的原理,恰好最近碰到了一个跟Android默认带Root权限的问题,这里顺便记录一下Android系统root的原理. 原理 Android是基于Llinux内核的开源操作系统,与Ubuntu系统类似,所以在Android里获取root权限其实和在Linux系统下获取root权限是一回事.在Linux系统下获取root权限的方法是在命令行执行sudo或者su,接下来输入提权密码就可以获取root权限了.Android系统其实也是这样,例如应用层程序开发,在

安卓一键ROOT, android root api sdk 服务支持

android 一键root sdk已经开发完毕,支持PC 及手机端: 鉴于现在手机端的需求比较大,特提供SDK外放服务:以及ROOT技术支持: 商务合作  ROOT后您可以: 1.删除系统应用,定制个性化系统 2.各种暗扣(当然现在国内环境不行,但是您有渠道还是可以的) 3.静默安装各种推广APP 4.打压竞争对手APP 5.后台静默刷流量 6.完全控制他人手机 7.等等等 安卓一键root sdk 服务,安卓root技术支持, android root sdk, android root a

(转载)Android显示原理简介

Android应用程序显示的过程:Android应用程序调用SurfaceFlinger服务把经过测量.布局和绘制后的Surface渲染到显示屏幕上. 名词解释 SurfaceFlinger:Android系统服务,负责管理Android系统的帧缓冲区,即显示屏幕. Surface:Android应用的每个窗口对应一个画布(Canvas),即Surface,可以理解为Android应用程序的一个窗口. Android应用程序的显示过程包含了两个部分(应用侧绘制.系统侧渲染).两个机制(进程间通讯

android ioctl fuzz,android 本地提权漏洞 android root

目前正在研究android 三方设备驱动 fuzzer , 也就是下图所说的 ioctl fuzzing, 下图是由keen team nforest 大神发布: 欢迎正在研究此方面的人联系我共同交流进步!Email:  Blind Fuzz Smart Fuzz android 内核栈溢出android slab/slub 类堆溢出android 数组越界导致的复写内核中的重要数据android 内核信息泄漏android null pointer deference 空指针引用android

介绍使用Android JSBridge原理与实现

JSBridge 在Android中,JSBridge已经不是什么新鲜的事物了,各家的实现方式也略有差异.大多数人都知道WebView存在一个漏洞,见WebView中接口隐患与手机挂马利用,虽然该漏洞已经在Android 4.2上修复了,即使用@JavascriptInterface代替addJavascriptInterface,但是由于兼容性和安全性问题,基本上我们不会再利用Android系统为我们提供的addJavascriptInterface方法或者@JavascriptInterfa