欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Android系統(tǒng)中的root權(quán)限獲得原理

 更新時(shí)間:2015年08月04日 12:18:50   作者:zinss26914  
這篇文章主要介紹了詳解Android系統(tǒng)中的Root權(quán)限獲得原理,安卓基于Linux,所以原理也相當(dāng)于Linux中的root用戶,需要的朋友可以參考下

前言
一直很好奇Android Root的原理,恰好最近碰到了一個(gè)跟Android默認(rèn)帶Root權(quán)限的問題,這里順便記錄一下Android系統(tǒng)root的原理。

原理
Android是基于Llinux內(nèi)核的開源操作系統(tǒng),與Ubuntu系統(tǒng)類似,所以在Android里獲取root權(quán)限其實(shí)和在Linux系統(tǒng)下獲取root權(quán)限是一回事。在Linux系統(tǒng)下獲取root權(quán)限的方法是在命令行執(zhí)行sudo或者su,接下來輸入提權(quán)密碼就可以獲取root權(quán)限了。Android系統(tǒng)其實(shí)也是這樣,例如應(yīng)用層程序開發(fā),在root過的手機(jī)上運(yùn)行root權(quán)限的代碼如下所示:

  Process process = Runtime.getRuntime().exec("su"); 
  DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
  ...... 
  os.writeBytes("HelloWorld!\n"); 
  os.flush(); 

我們可以看到,Android應(yīng)用程序獲取root權(quán)限也是需要執(zhí)行su命令,因此Android能夠root的密碼都在su程序上。但是,Android本身是不想讓你獲取root權(quán)限的,因此大部分手機(jī)出廠都是user版本,默認(rèn)是不帶su這個(gè)二進(jìn)制程序的。所以你想獲取Android的root權(quán)限,第一步就是要把編譯好的su文件拷貝到Android手機(jī)的/system/bin或/system/xbin目錄下(為什么要拷貝到/system目錄下,是因?yàn)檫@個(gè)分區(qū)是沒有nosuid限制的,同時(shí)/system/bin和/system/xbin又都是系統(tǒng)環(huán)境變量PATH里的路徑,可以直接執(zhí)行su)。我們先假設(shè)你可以把編譯好的su程序放在xbin或者bin目錄下,接下來你可以在Android手機(jī)的adb shell或者串口下輸入su提權(quán)了。
Linux命令行下輸入su之后,是需要輸入root密碼才能夠提權(quán)的,但是Android里的su和Linux里的su是不一樣的,Android里的su是不靠驗(yàn)證密碼的,而且需要驗(yàn)證你之前的權(quán)限是什么。意思是,如果你是root用戶,那你可以通過su切換到別的用戶,比如shell、wifi、audio等。但是如果你是root之外的其他用戶,就不能切換到root了,會(huì)提示你permission denied。也就是說,用root運(yùn)行su才有用,但是這個(gè)時(shí)候我沒還有root權(quán)限怎么辦?這就是接下來要討論的問題。
我們?cè)赨buntu下查看/usr/bin/passwd文件的權(quán)限,如下圖所示:

201584121826750.jpg (611×46)

這個(gè)文件的權(quán)限比較特殊,Linux用戶一般都知道文件分為r、w、x權(quán)限,那這個(gè)s是神馬意思呢?這里回答一下,s代表當(dāng)任何一個(gè)用戶執(zhí)行該文件的時(shí)候都擁有文件所有者的權(quán)限,這文件所有者是root。簡(jiǎn)單來說,就是不管誰執(zhí)行這個(gè)文件,他執(zhí)行的時(shí)候都是以root身份來執(zhí)行的。
看到這里,大家是不是都有思路了,也就是說,即使我不是root用戶也可能以root用戶的身份來執(zhí)行程序,那么我把一個(gè)所有者是root的su程序權(quán)限標(biāo)志位設(shè)置為-rwsr-xr-x,那么不管是誰執(zhí)行它,都是以root身份執(zhí)行。這就牛逼了,su果斷可以執(zhí)行成功,那你也就可以順利的獲取root權(quán)限了。

破解
原理都清楚了,那root的過程其實(shí)就是分兩步:
1. 把一個(gè)所有者是root的su拷貝到Android手機(jī)上。
2. 把su的權(quán)限標(biāo)志位設(shè)置成-rwsr-xr-x。
寫成代碼大概如下所示:

  cp /sdcard/su /system/xbin/ 
  chown root:root /system/xbin/su 
  chmod 4755 /system/xbin/su 

代碼看起來很簡(jiǎn)單,但是想真正的運(yùn)行成功,以上代碼每一句都需要root權(quán)限執(zhí)行。我擦,一下回到解放前,跟先有雞還是先有蛋的問題類似,代碼運(yùn)行需要root權(quán)限,而代碼本身的目的就是獲取root權(quán)限,成了一個(gè)封閉的死循環(huán)了。但是所幸Android系統(tǒng)有Bug,因此就給了你打破這個(gè)死循環(huán)的機(jī)會(huì)。
打破的方法就是找一個(gè)本身已經(jīng)有root權(quán)限的進(jìn)程來運(yùn)行這個(gè)3行的shell腳本,這樣腳本就可以順利執(zhí)行了。但是已經(jīng)有root權(quán)限的進(jìn)程都是出廠時(shí)候就裝到手機(jī)上的,代碼寫死了,你沒法控制它執(zhí)行自己的代碼啊,這個(gè)時(shí)候就需要查找漏洞了。例如Android2.3 root權(quán)限的zergRush漏洞就是利用一個(gè)擁有root權(quán)限的進(jìn)程棧溢出漏洞。具體利用漏洞的方法大家就可以自行g(shù)oogle了。

防止root
通過上述分析,我們可以簡(jiǎn)單的理解,解決Android系統(tǒng)能夠su提權(quán)的方法就是把su文件干掉就可以了。

相關(guān)文章

  • 詳解UDP協(xié)議格式及在java中的使用

    詳解UDP協(xié)議格式及在java中的使用

    這篇文章主要介紹了UDP協(xié)議格式及在java中的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Java中map和flatMap的區(qū)別舉例詳解

    Java中map和flatMap的區(qū)別舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java中map和flatMap區(qū)別的相關(guān)資料,在Java中Stream接口有map()和flatmap()方法,兩者都有中間流操作,并返回另一個(gè)流作為方法輸出,需要的朋友可以參考下
    2023-10-10
  • Java中Set&List的迭代器實(shí)現(xiàn)步驟解析

    Java中Set&List的迭代器實(shí)現(xiàn)步驟解析

    這篇文章主要介紹了Java中Set&List的迭代器實(shí)現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java8如何使用Lambda表達(dá)式簡(jiǎn)化代碼詳解

    Java8如何使用Lambda表達(dá)式簡(jiǎn)化代碼詳解

    這篇文章主要給大家介紹了關(guān)于Java8如何使用Lambda表達(dá)式簡(jiǎn)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringBoot如何通過Feign調(diào)用傳遞Header中參數(shù)

    SpringBoot如何通過Feign調(diào)用傳遞Header中參數(shù)

    這篇文章主要介紹了SpringBoot通過Feign調(diào)用傳遞Header中參數(shù),本文給大家分享兩種解決方案給大家詳細(xì)講解,需要的朋友可以參考下
    2023-04-04
  • MyBatis-plus+達(dá)夢(mèng)數(shù)據(jù)庫實(shí)現(xiàn)自動(dòng)生成代碼的示例

    MyBatis-plus+達(dá)夢(mèng)數(shù)據(jù)庫實(shí)現(xiàn)自動(dòng)生成代碼的示例

    這篇文章主要介紹了MyBatis-plus+達(dá)夢(mèng)數(shù)據(jù)庫實(shí)現(xiàn)自動(dòng)生成代碼的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 使用JAXBContext 設(shè)置xml節(jié)點(diǎn)屬性

    使用JAXBContext 設(shè)置xml節(jié)點(diǎn)屬性

    這篇文章主要介紹了使用JAXBContext 設(shè)置xml節(jié)點(diǎn)屬性的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java語法中Lambda表達(dá)式無法拋出異常的解決

    Java語法中Lambda表達(dá)式無法拋出異常的解決

    這篇文章主要介紹了Java語法中Lambda表達(dá)式無法拋出異常的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 遞歸之斐波那契數(shù)列java的3種方法

    遞歸之斐波那契數(shù)列java的3種方法

    這篇文章主要為大家詳細(xì)介紹了遞歸之斐波那契數(shù)列java的3種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java Spring WEB應(yīng)用實(shí)例化如何實(shí)現(xiàn)

    Java Spring WEB應(yīng)用實(shí)例化如何實(shí)現(xiàn)

    這篇文章主要介紹了Java Spring WEB應(yīng)用實(shí)例化如何實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論