手机端基础知识.docx

上传人:b****5 文档编号:14888389 上传时间:2023-06-28 格式:DOCX 页数:22 大小:72.23KB
下载 相关 举报
手机端基础知识.docx_第1页
第1页 / 共22页
手机端基础知识.docx_第2页
第2页 / 共22页
手机端基础知识.docx_第3页
第3页 / 共22页
手机端基础知识.docx_第4页
第4页 / 共22页
手机端基础知识.docx_第5页
第5页 / 共22页
手机端基础知识.docx_第6页
第6页 / 共22页
手机端基础知识.docx_第7页
第7页 / 共22页
手机端基础知识.docx_第8页
第8页 / 共22页
手机端基础知识.docx_第9页
第9页 / 共22页
手机端基础知识.docx_第10页
第10页 / 共22页
手机端基础知识.docx_第11页
第11页 / 共22页
手机端基础知识.docx_第12页
第12页 / 共22页
手机端基础知识.docx_第13页
第13页 / 共22页
手机端基础知识.docx_第14页
第14页 / 共22页
手机端基础知识.docx_第15页
第15页 / 共22页
手机端基础知识.docx_第16页
第16页 / 共22页
手机端基础知识.docx_第17页
第17页 / 共22页
手机端基础知识.docx_第18页
第18页 / 共22页
手机端基础知识.docx_第19页
第19页 / 共22页
手机端基础知识.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

手机端基础知识.docx

《手机端基础知识.docx》由会员分享,可在线阅读,更多相关《手机端基础知识.docx(22页珍藏版)》请在冰点文库上搜索。

手机端基础知识.docx

手机端基础知识

AndroidRoot原理和流程分析

预备知识

android手机的内部存储设备分RAM和ROM,RAM是运行内存,掉电就会失去所有内容;ROM中的内容掉电后也不会丢失。

比如一台手机的规格参数里写着“2GRAM,16GROM”。

理论上,RAM越大,系统运行越流畅。

像大型的3D游戏,运行时需要约300M的内存,那么在内存2G的手机上就可以流畅的运行,在512M内存的手机上几乎跑不起来,跑起来也会卡死。

我们可以在“设置-管理应用程序-正在运行”中看到手机目前剩余的RAM,一般2GRAM的手机显示可用RAM只有1G多点,因为Android系统本身的运行也会消耗一定内存。

RAM存取速度很快,但价格昂贵,所以手机里的RAM不会特别大。

Rom的大小与手机卡不卡几乎没什么关系,可以把它当成一张内置的SD卡(它事实上也确实就是一张内置的SD卡)。

它上面的内容分成两大块:

系统数据,用户文件(也就是我们的照片、歌曲、视频等等)。

系统数据只占据比较小的一部分,大概不到1G,剩下的就由用户随意的放照片、视频等。

我们使用MTP(媒体连接模式)将手机连接电脑时,可以在电脑上看到多出来的Phone盘符,在里面可以查看我们自己的文件。

如果16G的ROM,连到电脑上就会发现没有这么大,原因就是有一部分放了系统数据。

内存中的系统数据分区是非常重要的——可以说整个Android系统都在上面。

那么系统分区里到底存放了哪些内容呢?

粗略的讲,包括以下内容:

/system

/boot

/cache

/data

/recovery

/misc

其中/system就是android系统,里面存放了所有的系统应用、支持这些应用运行的framework、系统工具等等。

如果把它删了,你就进不来android系统了,也没法打电话发短信了,更不能玩游戏了,因为Android系统已经从你的手机上消失了。

/data就是用户数据(注意与上面的用户文件是不同的),你的短信、通话记录、联系人等;你用浏览器时浏览的网页、输入的用户名密码、保存的设置,都是你的用户数据。

如果把它删了,你的手机就相当于“恢复出厂设置”,你的短信、你装的应用等统统不见了。

/boot主管手机的正常启动。

比如你按开机键会先见到开机动画,然后顺利的进入android系统;你开机时按住音量键和开机键会进入recovery,这些都是/boot来控制的。

不要以为这是无关紧要的工作,开机前android系统是磁盘上的0和1,开机后它变成了一个可以运行的系统,这都是/boot的功劳。

/cache就是系统当前的缓存,你浏览的网页正处在第15行的位置,你玩的游戏正停留在这个画面上,都是/cache来记录的。

/recovery平时一般用不到,它是一个小型的手机系统,就像android系统一样。

它的作用是可以刷入新的rom,进行系统更新,备份用户数据等。

(具体功能可以安装一个clockworkmod看看)

android启动时会执行/boot下的代码,将android系统从磁盘上读出来,挂载到/system目录下。

注意这里的/system与前文中说的磁盘上的/system分区不是一个概念:

/system分区是存储设备中的数据,是0和1。

而/system目录是文件系统中的目录。

/system目录是/system分区的挂载点。

挂载完成后,就可以通过/system目录访问到/system分区,并对其进行读写操作(需要root权限)。

Root原理与流程

那么,什么是root权限?

怎样才算root?

表现上:

su文件在/system/xbin文件夹下,并具有rwsr-sr-x权限,就说明手机获得了root权限。

实际上:

在*nix系统(android的内核是linux系统)下,一切皆文件。

如磁盘、媒体、输入输出……等等。

像磁盘,就是/dev下的一些文件;进程,也是通过/proc下的各种文件来描述的。

在一切皆文件的*nix系统中,对所有文件随意操作的自由,就是最大限度的自由。

这种自由,就叫“root”权限。

可见,root权限的自由非常大,如果被恶意利用,会使整个系统处于危险之中(你的短信、联系人,你的账号密码,你的照片视频等等)。

所以手机厂商和android系统都不会主动开放root授权的。

要获取root权限只能通过非正常手段。

所以现有的获取root权限的方法思路其实只有一个,就是利用漏洞,破坏规则:

1.         利用android源码中的漏洞来进行提权(比如RAGEAGAINSTTHECAGE漏洞,通过大量创建子进程让adbd进程降级失败,从而获取root权限)

2.         先刷入自定义的recovery,然后利用修改过的recovery将su刷入/system分区

3.         从SD卡进行boot,从而修改/system分区(只有少部分机型有此功能)

利用源码的漏洞,有几个有名的案例。

比如RageAgainstTheCage漏洞,有人把它称为setuid提权漏洞。

代码通过将adbd后台服务子进程耗尽迫使adbd重启,adbd在重启的时候具有root权限,正常情况下这时adbd会调用setuid将权限降到shell,但是由于rageagainstthecage让adbd的僵尸进程充斥着整个系统,这时候setuid会调用失败,最后adbd就被保留了root权限运行,从而完成root提权。

Android手机一键Root原理分析

 (2013-08-0121:

24:

00)

标签:

 

android

 

安卓

 

it

一直以来,刷机与Root是Android手机爱好者最热衷的事情。

即使国行手机的用户也不惜冒着失去保修的风险对Root手机乐此不疲。

就在前天晚上,一年一度的GoogleI/O大会拉开了帷幕,最新的Android4.1系统成为了大会的热点,经过短短的几个小时后,网上就有人泄露了JellyBean的下载地址,再然后就有了Android4.1带Root的完整刷机包,真是强大的人们!

Root的由来

       什么是Root?

Root本身是指Linux系统的root帐户,该帐户拥有整个系统至高无上的权利,系统中的所有对象它都可以操作,对于Android手机用户来说的Root是指拥有Root权限,一般情况下,手机厂商出于安全考虑会关闭手机的Root权限,手机系统是运行在普通用户权限下的,用户是无法操作系统中的文件与数据的。

       Root与刷机本身是有很多关联的,而且随着刷机工具的便利与刷机原理的变化,两者的关系更加是模糊不清了。

不同厂商针对获取Root权限设置了不同的要塞。

首先从刷机说起,如HTC手机在刷机前需要保证S-OFF,S-OFF代表什么呢?

S代表SecurityLock安全锁,保护锁的意思,S-OFF就是关掉锁保护。

然后是Motorola的手机,这个厂商对于不同型号的手机设置是不同的,很多Motorola型号的手机将BootLoader是锁住的,因此,在刷机前需要先解锁BootLoader。

还有中兴手机,这厂商更是变态,一次次的版本升级只是为了锁住用户不让用户升级,也就导致了同一型号的手机由于版本不同有的型号带Recovery,有的又不带。

三星的手机现在可以说是最好卖的,一方面是出色的硬件配置与外观,另一方面是有众多的Rom包可以刷。

三星的好几款手机是Google源码的测试样机,而且三星手机在出厂时对用户的限制相比其它品牌是较少的,这也是广大Android开发者对它青睐有加的原因。

早先的Android手机要想获取Root权限可以有以下几种方式:

1.            使用本地提权漏洞利用工具来直接Root,这是最原始最纯洁的方式。

随着厂商对Rom的升级,这些内核的漏洞随时都可能被修补,因此,这种Root方法在时间与空间上都有着很大的局限性。

2.            由于手机厂商对硬件的封闭,加上内核补丁修补很完全,这个时候获取Root权限就更难了,这个时候刷机与Root就联合起来了,由于不能从系统内部通过Exploits来获取Root权限,只能通过修改Rom包来达到Root的目的,这也是目前很多第三方Rom包自带了Root的原因,然而手机厂商也不是吃干饭的,手机厂商在OTA升级时使用Recovery对包签名进行验证来防止用户刷入修改过的包。

对于这种变态的厂商,只能通过FastBoot来线刷了,这里内容就不再展开了。

3.            当然,还有一部分厂商,为了吸引更多用户购买他们的手机,还是在手机中偷偷的留了后门的,比如不锁BootLoader,让用户刷第三方的Recovery,又或是干脆留个以前的漏洞不补,让用户自己来Exploits等等。

Root漏洞的历史

Root漏洞不是与生俱来的,这是全世界优秀的计算机黑客不懈努力的成果。

也许那个你在夜店喝酒的夜晚,他们正寻找着系统的漏洞,一次次的测试,一次次的失败,最终在你醉得不省人事的时候,他们获取到了系统的最高控制权。

他们欢呼,他们嚎叫,他们是全天下是聪明的人!

也许你对他们的事迹不屑一顾,但我相信你对他们的研究成果是饶有兴趣的。

下来由我来带领大家,看看这一路走来,都出现过哪里牛人,他们又为我们带来了哪些惊喜。

 

CVE-2009-2692

       我无法知道Android提权漏洞是从哪个开始的,但我在我印象中,它是最早的。

这个漏洞的发现者是Zinx,他是探索Android安全之路的先驱。

现在每个Root后的手机中肯定有SuperUser.apk软件,而Zinx就是早先SuperUser的作者,现在SuperUser由ChainsDD来负责更新了,Zinx前辈常年混迹于国外xda论坛,不过现在好像很少露面了。

       这个洞是09年的,现在早已经修补了。

从Zinx提供的android-root-20090816.tar.gz压缩包时间来看,这个Exploit是在AndroidNDKr1发布后近两个月公布的,可见Zinx研究Android的时间是多么的早!

这个洞的原作者并不是Znix,Znix只是将洞移植到了Android上,这个洞的作者在Exploit中给出的协议驱动程序包括pppox,bluetooth,appletalk,ipx,sctp,Znix改写的Android版本使用的buletooth协议。

这个漏洞的起因是sock_sendpage()的空指针解引用。

因为sock_sendpage没有对socket_file_ops结构的sendpage字段做指针检查,有些模块不具备sendpage功能,初始时赋为NULL,这样,没有做检查的sock_sendpage有可能直接调用空指针而导致出错并提升权限!

       接着,sendfile(fdout,fdin,NULL,PAGE_SIZE);的调用使得该洞被触发,最终执行以下代码获取到Root权限:

int__attribute__((section(".null")))root_sendpage(void*sk,void*page,intoffset,size_tsize,intflags)

{

       current->uid=current->euid=0;

       current->gid=current->egid=0;

       got_root=1;

       return-ECONNREFUSED;

}

CVE-2010-EASY

       这个漏洞是由“TheAndroidExploidCrew”小组发现的。

在公布的代码中,提供了多达三种的提权方法!

分别是exploid.c、exploid2.c、rageagainstthecage.c三个文件。

exploid.c与属于exploid2.c同一类Exploit,这个洞的形成是由于udev对热插拔消息检测不严导致的,用户通过发送恶意信息让内核加载自定义的恶意程序从而取得root权限。

在代码中,两者都是通过NET_LINK来完成通信,只是在处理“geteuid()==0”时代码不同而以,程序发送伪热插拔消息,让内核执行自身代码,而内核由于没有检查消息发送者是内核还是用户,就匆忙的执行了,这时“geteuid()==0”条件成立,接下来只需开个sh就完成了Root工作。

创建Socket并发送消息的代码如下:

if((sock=socket(PF_NETLINK,SOCK_DGRAM,NETLINK_KOBJECT_UEVENT))<0)

              die("[-]socket");

 

       close(creat("loading",0666));

       if((ofd=creat("hotplug",0644))<0)

              die("[-]creat");

       if(write(ofd,path,strlen(path))<0)

              die("[-]write");

       close(ofd);

       symlink("/proc/sys/kernel/hotplug","data");

       snprintf(buf,sizeof(buf),"ACTION=add�EVPATH=/..%s%c"

               "SUBSYSTEM=firmware%c"

               "FIRMWARE=../../..%s/hotplug%c",0,basedir,0,0,basedir,0);

       printf("[+]sendingaddmessage...\n");

       if(sendmsg(sock,&msg,0)<0)

              die("[-]sendmsg");

       close(sock);

rageagainstthecage.c这个洞有人把它称为setuid提权漏洞,这个漏洞的形成过程我个人感觉只能用“巧妙”来形容!

代码通过将adbd后台服务子进程耗尽迫使adbd重启,adbd在重启的时候具有root权限,正常情况下这时adbd会调用setuid将权限降到shell,但是由于rageagainstthecage让adbd的僵尸进程充斥着整个系统,这时候setuid会调用失败,最后adbd就被保留了root权限运行,从而完成root提权。

核心代码如下:

     1        if(fork()>0)

     2                 exit(0);

     3

     4        setsid();

     5        pipe(pepe);

     6

     7        if(fork()==0){

     8                 close(pepe[0]);

     9                for(;;){

    10                         if((p=fork())==0){

    11                                 exit(0);

    12                         }elseif(p<0){

    13                                 if(new_pids){

    14                                         printf("\n[+]Forked%dchilds.\n",pids);

    15                                        new_pids=0;

    16                                        write(pepe[1],&c,1);

    17                                        close(pepe[1]);

    18                                 }

    19                         }else{

    20                                 ++pids;

    21                         }

    22                 }

    23        }

       24                 close(pepe[1]);

       25                 read(pepe[0],&c,1);

第1-3行代码fork子进程后退出,第4-6行子进程独立并创建两支管道同来同步进程,具体是由第8行与第25行是一关一读来实现的,第10-11行是不停的创建子进程,然后不停退出,这时僵尸产生了!

直到最后p<0输出创建的子进程数目。

在这段代码执行完后会重启adb进程,adb进程重启会执行setgid(AID_SHELL)与setuid(AID_SHELL)两行代码来降权,可是这时候由于进程数达到上限setuid执行失败,这就使得adb进程以Root权限继续执行下去了。

GingerBreak

       GingerBreak本身不是Linux内核漏洞,因此它没有正规的漏洞编号。

与上面的漏洞同样的是,GingerBreak也是由“TheAndroidExploidCrew”小组“发明”的,它的工作原理与Hook类似,通过代码修改/system/bin/vold程序的GOT表项,将strcmp()、atoi()等函数的地址为system()函数的地址,然后触发调用strcmp()或atoi()来达到执行system()的目的,而后者真正被执行后会为我们来带久违的RootShell,修改函数地址的代码片断如下:

       vold.pid=found;

       vold.found=1;

       if(vold.system)

              return;

       ptr=find_symbol("system");

       vold.system=(uint32_t)ptr;

       在修改完函数地址后,就要考虑如何来触发了,“TheAndroidExploidCrew”小组再一次使用了NET_LINK进行通信,通过发送热插拔消息让void中的strcmp()或atoi()被调用!

但不同的Android系统版本可能操作起来有所不同,于是,需要手工构造消息,然后发送:

       

       if(honeycomb){

              n=snprintf(buf,sizeof(buf),"@/foo�CTION=add%cSUBSYSTEM=block%c"

                               "SEQNUM=%s�EVPATH=%s%c"

                                 "MAJOR=%s%cMINOR=%s�EVTYPE=%s%cPARTN=1",

                                 0,0,0,bsh,0,bsh,0,bsh,0,bsh,0,bsh,0);

       }elseif(froyo){

              n=snprintf(buf,sizeof(buf),"@/foo�CTION=add%cSUBSYSTEM=block%c"

                                "DEVPATH=%s%c"

                                 "MAJOR=179%cMINOR=%d�EVTYPE=harder%cPARTN=1",

                                 0,0,0,bsh,0,0,vold.system,0,0);

       }else{

              n=snprintf(buf,sizeof(buf),"%s;@%s�CTION=%s%cSUBSYSTEM=%s%c"

                               "SEQNUM=%s�EVPATH=%s%c"

                                 "MAJOR=179%cMINOR=%d�EVTYPE=harder%cPARTN=1",

                                 bsh,bsh,0,bsh,0,bsh,0,bsh,0,bsh,0,0,vold.system,0,0);

       }

       可以看到,代码的适用范围是froyo到honeycomb,仔细看一下代码的注释部分,代码的作者真的卡哇伊呢!

zergRush

       同GingerBreak一样,zergRush也不属于内核漏洞。

这个漏洞是大名鼎鼎的Revolutionary工具开发小组公布的,这个小组开发的Revolutionary解锁工具对于HTC的用户应该不陌生吧!

这个漏洞的原理是由于libsysutils.so库中的FrameworkListener:

:

dispatchCommand函数的一个栈变量引起的,栈变量argv[FrameworkListener:

:

CMD_ARGS_MAX]由于允许的最大下标为16,如果我们特意传送超过16个空格分割的字符串,函数就会溢出。

       整个溢出工具的代码框架与GingerBreak是一样的,我估计是在GingerBreak代码基础上加工的,嘿嘿,整个代码的核心部分在do_fault函数中,代码设计十分巧妙,经过精心的构造最终执行安排的Shellcode,整个过程通过代码阅读很难在大脑中建立模型结构,建议还是手动调试好。

       以上介绍的几个漏洞代码都是优秀的,无可挑剔的,它们目前在全球各地以各种名称与形式存在着。

CVE-2012-0056

2012年1月23日,正当我们与家人聚在一起吃团年饭的时候,国外的小伙zx2c4在自己的主页上公布了此漏洞,随后,xda上的网友saurik对其编写了Android版本的Exploit。

这个漏洞的原理是利用系统中具体s属性的程序通过自修改程序的内存,执行Shellcode达到获得Root权限的目的。

完成修改进程内存的动作前需要解决两个问题:

1.     系统只允许$pid进程或者$pid的调试进程对/proc/$pid/mem文件进行写入。

2.     系统会检查打开/poc/$pid/mem的程序的self_exec_id是否与当前运行的程序相同,一个进程使用exec()后self_exec_id会自动加一,以此来保护内存不会被别的程序修改。

解决第一个问题很简单,可以直接

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2