IT技術互(hu)動交流平台

福彩快三官网

來(lai)源︰IT165收(shou)集  發布日期︰2020-02-24 14:06:21

福彩快三官网

作(zuo)者(zhe)︰Aditya Gupta

譯者(zhe)︰飛(fei)龍

協議︰CC BY-NC-SA 4.0

在本章中(zhong),我們將了si)ARM 處理器的(de)基礎(chu)知(zhi)識,和 ARM 世界中(zhong)存在的(de)不同類(lei)型的(de)漏洞(dong)。 我們甚至(zhi)會繼(ji)續(xu)利用這(zhe)些(xie)漏洞(dong),以(yi)便對整個場(chang)景有個清晰地了si)狻此外,我們將研究不同的(de) Android root 攻擊和它們在漏洞(dong)利用中(zhong)的(de)基本漏洞(dong)。 考(kao)慮到目前大多數 Android 智(zhi)能手機都(du)使用基于 ARM 的(de)處理器,對za)諫覆(fu)饈勻嗽崩lai)說,了si)ARM 及其(qi)附(fu)帶的(de)安(an)全風險至(zhi)關重要。

8.1 ARM 架構導論(lun)

ARM 是基于精簡指令集(RISC)的(de)架構,這(zhe)意味(wei)著其(qi)指令比(bi)基于復雜(za)指令集(CISC)的(de)機器少得多。 ARM 處理器幾乎遍布我們周圍的(de)所有設備,如智(zhi)能手機,電視,電子書閱讀器和更多的(de)嵌(qian)入(ru)式設備。

ARM 總共有 16 個可見(jian)的(de)通用寄存器,為 R0-R15。 在這(zhe) 16 個中(zhong),有 5 個用于特(te)殊目的(de)。 以(yi)下是這(zhe)五個寄存器及其(qi)名稱︰

R11: 幀(zheng)指針 (FP) R12: 過程內寄存器 (IP) R13: 棧指針 (SP) R14: 鏈接(jie)寄存器 (LR) R15: 程序計數器 (PC)

下面(mian)的(de)圖展示(shi)了 ARM 架構︰

在五個里面(mian),我們會特(te)別(bie)專注于這(zhe)三個,它們是︰

堆棧指針(SP)︰這(zhe)是保存指向(xiang)堆棧頂(ding)部(bu)的(de)指針的(de)寄存器 鏈接(jie)寄存器(LR)︰當程序進入(ru)子過程時存儲返回地址(zhi) 程序計數器(PC)︰存儲要執行的(de)下一條指令

注意

這(zhe)里要注意的(de)一點(dian)是,PC 將總是指向(xiang)要執行的(de)指令,而不是簡單地指向(xiang)下一條指令。 這(zhe)是由于被稱為流水線(xian)的(de)概念,指令按照zhao)韻濾承蠆僮zuo)︰提取,解碼和執行。 為了控制程序流,我們需要控制 PC 或 LR 中(zhong)的(de)值(後者(zhe)最(zui)終zhao)嘉頤強?PC)。

福彩快三官网

ARM 有兩種不同的(de)執行模式︰

ARM 模式︰在 ARM 模式下,所有指令的(de)大小為 32 位 Thumb 模式︰在 Thumb 模式下,指令大部(bu)分(fen)為 16 位

執行模式jie)CPSR 寄存器中(zhong)的(de)狀態決(jue)定。 還存在第三模式,即 Thumb-2 模式,它僅僅是 ARM 模式和 Thumb 模式的(de)混(hun)合。 我們在本章不會深入(ru)了si)ARM 和 Thumb 模式之間的(de)區別(bie),因為它超出了本書的(de)範(fan)duan)?/p>

8.2 建(jian)立環境

在開始(shi)利用 ARM 平台的(de)漏洞(dong)之前,建(jian)議你建(jian)立環境chang)即使 Android SDK 中(zhong)的(de)模擬器可以(yi)通過模擬 ARM 平台來(lai)運行,大多數智(zhi)能手機也是基于 ARM 的(de),我們將通過配置(zhi) QEMU(它是qie)桓隹 從(cong)布檳食湍D餛鰨┘ shi) ARM 漏洞(dong)利用。

為了在 Android 模擬器/設備上執行以(yi)下所有步(bu)驟,我們需要下載 Android NDK 並(bing)使用 Android NDK 中(zhong)提供的(de)工具(ju)為 Android 平台編譯我們的(de)二進制文件。 但是,如果(guo)你使用 Mac 環境,安(an)裝 QEMU 相對容(rong)易,可以(yi)通過鍵入(ru)brew install qemu來(lai)完成。 現在讓我們在 Ubuntu 系統上配置(zhi) QEMU。 遵循以(yi)下步(bu)驟︰

第一步(bu)是通過安(an)裝依賴來(lai)下載並(bing)安(an)裝 QEMU,如圖所示(shi)︰

sudo apt-get build-dep qemuwget http://wiki.qemu-project.org/download/qemu-1.7.0.tar.bz2

接(jie)下來(lai),我們只需要配置(zhi)QEMU,指定目標(biao)為 ARM,最(zui)後充分(fen)利用它。 因此,我們將簡單地解壓縮歸檔(dang)文件,訪問該目錄並(bing)執行以(yi)下命令︰

./configure --target-list=arm-softmmumake && make install

一旦QEMU成功安(an)裝,我們可以(yi)下載 ARM 平台的(de) Debian 鏡(jing)像來(lai)進行利用練習(xi)。 所需下載列表(biao)位于http://people.debian.org/~aurel32/qemu/armel/。

這(zhe)里我們將下載格(ge)式為qcow2的(de)磁pai)逃誠瘢 腔QEMU 的(de)操作(zuo)系統映像格(ge)式,也就是我們的(de)操作(zuo)系統為debian_squeeze_armel_standard.qcow2。 內核文件應該是vmlinuz-2.6.32-5-versatile,RAM 磁pai)濤募Ω檬nitrd.img-2.6.32-versatile。 一旦我們下載了所有必要的(de)文件,我們可以(yi)通過執行以(yi)下命令來(lai)啟(qi)動 QEMU 實例︰

qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile -hda debian_squeeze_armel_standard.qcow2 -append 'root=/dev/sda1' --redir tcp:2222::22 

redir命令只是在登錄遠(yuan)程系統時使用端口 2222 啟(qi)用 ssh。
一旦配置(zhi)完成,我們可以(yi)使用以(yi)下命令登錄到 Debian 的(de) QEMU 實例︰

ssh root@[ip address of Qemu] -p 2222

登錄時會要求輸入(ru)用戶名和密(mi)碼,默認憑據是root:root。一旦我們成功登錄,我們將看(kan)到類(lei)似如下所示(shi)jing)鈉ping)幕截(jie)圖︰

8.3 基于棧的(de)簡單緩沖區溢(yi)出

簡單來(lai)說,緩沖區是存儲任何類(lei)型的(de)數據的(de)地方。 當緩沖區中(zhong)的(de)數據超過緩沖區本身的(de)大小時,會發生溢(yi)出。 然後攻擊者(zhe)可以(yi)執行溢(yi)出攻擊,來(lai)獲得對程序的(de)控制和執行惡(e)意載荷。

讓我們使用一個簡單程序的(de)例子,看(kan)看(kan)我們如何利用它。 在下面(mian)的(de)截(jie)圖中(zhong),我們有一個簡單的(de)程序,有三個函數︰weak,ShouldNotBeCalled和main。 以(yi)下是我們試圖利用的(de)程序︰

在整個程序運行期間,從(cong)不調用ShouldNotBeCalled函數。

漏洞(dong)函數簡單地?http://www.it165.net/design/wrss/" target="_blank" class="keylink">rss7K/bi01sa1vcP7zqpidWZmtcS7urPlx/ijrLTz0KHOqiAxMCDX1r3aoaM8L3A+CjxwPtK7tanO0sPHzeqzybPM0PKx4NC0o6zO0sPHv8nS1Mq508NnY2Ox4NLry/yjrMjnz8LSu7j2w/zB7sv5yr6hoyC0y83io6zO0sPHvavU2tXiwO+9+9PDtdjWt7/VvOSyvL7Wy+a7+ruvo6hBU0xSo6mjrNa7ysfOqsHLyrmzob6wydTOorzytaXSu9CpoaMgQVNMUiDKx9PJIE9TIMq1z9a1xLCyyKu8vMr1o6zAtLfA1rm5pbv31d/T0NCntdjIt7ao1Ni6ybXEtdjWt7Ki1rTQ0Lbx0uLWuMHuoaMg1NogQW5kcm9pZCDW0KOsQVNMUiC1xMq1z9bKvNPaIDQuMKGjIMTjv8nS1LfDzspodHRwOi8vd3d3LmR1b3NlY3VyaXR5LmNvbS9ibG9nL2V4cGxvaXQtbWl0aWdhdGlvbnMtaW4tYW5kcm9pZC1qZWxseS1iZWFuLTQtMcHLveLL+dPQIEFuZHJvaWQgsLLIq8q1yqmhozwvcD4KPHByZSBjbGFzcz0="brush:java;">echo 0 > /proc/sys/kernel/randomize_va_spacegcc -g buffer_overflow.c -o buffer_overflow

接(jie)下來(lai),我們可以(yi)簡單將二進制文件加載到 GNU 調試器,簡稱 GDB,然後開始(shi)調試它,如下面(mian)的(de)命令所示(shi)︰

gdb -q buffer_overflow

現在我們可以(yi)使用disass命令來(lai)反匯編特(te)定的(de)函數,這(zhe)里是ShouldNotBeCalled,如下面(mian)的(de)截(jie)圖所示(shi)︰

正如我們在上面(mian)的(de)截(jie)圖中(zhong)可以(yi)看(kan)到的(de),ShouldNotBeCalled函數從(cong)內存地址(zhi)0x00008408開始(shi)。 如果(guo)我們查看(kan)main函數的(de)反匯編,我們看(kan)到漏洞(dong)函數在0x000084a4被調用並(bing)在0x000084a8返回。 因此,由于程序進入(ru)漏洞(dong)函數並(bing)使用易受攻擊的(de)strcpy,函數不檢查要復制的(de)字zhi)fu)串的(de)大小,並(bing)且(qie)如果(guo)我們能夠在程序進入(ru)漏洞(dong)函數時控制子過程的(de) LR ,我們就能夠控制整個程序流程。

這(zhe)里的(de)目標(biao)是估計何時 LR 被覆(fu)蓋,然後放入(ru)ShouldNotBeCalled的(de)地址(zhi),以(yi)便調用ShouldNotBeCalled函數。 讓我們開始(shi)使用一個長(chang)參數運行程序,如下面(mian)的(de)命令所示(shi),看(kan)看(kan)會發生什麼chu)在此之前,我們還需要在漏洞(dong)函數和strcpy調用的(de)地址(zhi)設置(zhi)斷點(dian)。

b vulnerable b *<address of the strcpy call>

一旦我們設置(zhi)了斷點(dian),我們可以(yi)使用參數AAAABBBBCCCC來(lai)運行我們的(de)程序,看(kan)看(kan)它是如何被覆(fu)蓋的(de)。 我們注意到它在漏洞(dong)函數的(de)調用處命中(zhong)了第一個斷點(dian),之後在strcpy調用處命中(zhong)了下一個斷點(dian)。 一旦它到達斷點(dian),我們可以(yi)使用x命令分(fen)析堆棧,並(bing)指定來(lai)自 SP 的(de)地址(zhi),如下面(mian)的(de)截(jie)圖所示(shi)︰

我們可以(yi)看(kan)到,堆棧已經被我們輸入(ru)的(de)緩沖區覆(fu)蓋(ASCII︰41 代表(biao) A,42 代表(biao) B,等(deng)等(deng))。 從(cong)上面(mian)的(de)截(jie)圖中(zhong),我們看(kan)到,我們仍(reng)然需要四個更多的(de)字節(jie)來(lai)覆(fu)蓋返回地址(zhi),在這(zhe)種zhi)榭魷率x000084a8。

所以(yi),最(zui)後的(de)字zhi)fu)串是 16 字節(jie)的(de)垃圾,然後是ShouldNotBeCalled的(de)地址(zhi),如下面(mian)的(de)命令所示(shi)︰

r `printf 'AAAABBBBCCCCDDDD8?'` 

我們可以(yi)在下面(mian)的(de)截(jie)圖中(zhong)看(kan)到,我們qie)丫 ShouldNeverBeCalled的(de)起始(shi)地址(zhi)添加到了參數中(zhong)︰

請注意,由于這(zhe)里是小端si) 梗 紙jie)以(yi)相反的(de)順序寫入(ru)。 一旦我們運行它,我們可以(yi)看(kan)到程序ShouldNotBeCalled函數被調用,如下面(mian)的(de)截(jie)圖所示(shi)︰

8.4 返回導向(xiang)編程

在大多數情(qing)況下,我們不需要調用程序本身中(zhong)存在的(de)另(ling)一個函數。 相反,我們需要在我們的(de)攻擊向(xiang)量中(zhong)放置(zhi) shellcode,這(zhe)將執行我們在 shellcode 中(zhong)指定的(de)任何wei)褚獠僮zuo)。 但是,在大多數基于 ARM 平台的(de)設備中(zhong),內存中(zhong)的(de)區域是不可執行的(de),這(zhe)會阻止我們放置(zhi)並(bing)執行 shellcode。

因此,攻擊者(zhe)必須依賴于所謂的(de)返回導向(xiang)編程(ROP),它是來(lai)自內存不同部(bu)分(fen)的(de)指令片段(duan)的(de)簡單鏈接(jie),最(zui)終它會執行我們的(de) shellcode。 這(zhe)些(xie)片段(duan)也稱為 ROP gadget。 為了鏈接(jie) ROP gadget,我們需要找(zhao)到存在跳(tiao)轉指令的(de) gadget,這(zhe)將允許(xu)我們跳(tiao)到另(ling)一個位置(zhi)。

例如,如果(guo)我們在執行程序時反匯編seed48(),我們將注意到以(yi)下輸出︰

如果(guo)我們查看(kan)反匯編,我們將注意到它包含(han)一個 ADD 指令,後面(mian)跟(gen)著一個 POP 和 BX 指令,這(zhe)是qie)桓 昝賴de) ROP gadget。 這(zhe)里,攻擊者(zhe)可能會想到,為了si) qi)用作(zuo) ROP gadget,首先跳(tiao)到控制 r4 的(de) POP 指令,然後將比(bi)/bin/sh的(de)地址(zhi)小 6 的(de)值放入(ru) r4 中(zhong),將 ADD 指令的(de)值放入(ru) LR 中(zhong)。 因此,當我們跳(tiao)回到 ADD 也就是R0 = R4 + 6時,我們就擁有了/bin/sh的(de)地址(zhi),然後我們可以(yi)為 R4 指定任何垃圾地址(zhi)並(bing)且(qie)為 LR 指定system()的(de)地址(zhi)。

這(zhe)意味(wei)著我們將最(zui)終跳(tiao)轉到使用參數/bin/sh的(de)system(),這(zhe)將執行 shell。 以(yi)同樣的(de)方式,我們可以(yi)創建(jian)任何 ROP gadget,並(bing)使其(qi)執行我們所需要的(de)任何wei) 鰲由于 ROP 是開發中(zhong)最(zui)復雜(za)的(de)主題(ti)之一,因此強烈建(jian)議你自己嘗試,分(fen)析反匯編代碼並(bing)構建(jian)漏洞(dong)。

8.5 Android root 利用

從(cong)早(zao)期版本jing)Android 開始(shi),Android root 漏洞(dong)開始(shi)出現于每個後續(xu)版本和不同的(de) Android 設備制造商(shang)的(de)版本中(zhong)。 Android root 簡單來(lai)說是獲得對設備的(de)訪問特(te)權,默認情(qing)況下設備制造商(shang)不會將其(qi)授予用戶。 這(zhe)些(xie) root 攻擊利用了 Android 系統中(zhong)存在的(de)各種漏洞(dong)。 以(yi)下是其(qi)中(zhong)一些(xie)的(de)列表(biao),帶有漏洞(dong)利用所基于的(de)思想︰

Exploid︰基于 udev 中(zhong)的(de) CVE-2009-1185 漏洞(dong),它是 Android 負責 USB 連接(jie)的(de)組件,它驗證 Netlink 消息(一種負責將 Linux 內核與用戶連接(jie)的(de)消息)是否源自原始(shi)來(lai)源或是由攻擊者(zhe)偽造。因此,攻擊者(zhe)可以(yi)簡單地從(cong)用戶空間本身發送 udev 消息並(bing)提升權限。 Gingerbreak︰這(zhe)是另(ling)一個漏洞(dong),基于 vold 中(zhong)存在的(de)漏洞(dong),類(lei)似于 Exploid 中(zhong)的(de)漏洞(dong)。 RageAgainstTheCage︰此漏洞(dong)利用基于RLIMIT_NPROC,它指定在調用setuid函數時可為用戶創建(jian)的(de)進程的(de)最(zui)大數目。 adb 守(shou)護程序以(yi) root 身份啟(qi)動;然後它使用setuid()調用來(lai)解除(chu)特(te)權。但是,如果(guo)根據RLIMIT_NPROC達到了最(zui)大進程數,程序將無(wu)法調用setuid()來(lai)解除(chu)特(te)權,adb 將繼(ji)續(xu)以(yi) root 身份運行。 Zimperlich︰使用與 RageAgainstTheCage 的(de)相同概念,但它依賴于 zygote 進程解除(chu) root 權限。 KillingInTheNameOf︰利用了一個稱為ashmem(共享內存管理器)接(jie)口的(de)漏洞(dong),該漏洞(dong)用于更改ro.secure的(de)值,該值deng)範(fan)ㄉ璞傅de) root 狀態。

這(zhe)些(xie)是qie)恍xie)最(zui)知(zhi)名的(de) Android 漏洞(dong)利用,用于 root Android 設備。

總結

在本章中(zhong),我們了si)飭Android 利用和 ARM 利用的(de)不同方式。 希望本章對za)諶魏蝸胍 釗ru)地利用 ARM 的(de)人來(lai)說,都(du)是qie)桓齪玫de)開始(shi)。

在下一章中(zhong),我們將了si)餿綰偽嘈Android 滲透fu)饈員 妗/p>

Tag標(biao)簽︰手冊  第八章  
  • 福彩快三官网

About IT165 - 廣告服務(wu) - 隱私(si)聲明 - 版權申明 - 免(mian)責條款 - 網站jing)贗/a> - 網友投稿 - 聯(lian)系方式
本站內容(rong)來(lai)自za)諢hu)聯(lian)網,僅供用于網絡(luo)技術學(xue)習(xi),學(xue)習(xi)中(zhong)請遵循相關法律法規
福彩快三官网 | 下一页