學了Linux Kernel Pwn之後我終於可以解開AIS3 Pre-exam 2024 : EBH了好耶好耶
Last updated on 2025-05-19 11:20:57 +08:00
Challenge
https://github.com/Curious-Lucifer/My_CTF_Challenges/tree/master/AIS3_Pre-Exam_2024/Pwn-EBH
Flag在/flag,只有root可以讀取到
本題沒有開啟kaslr(內核的東西位址都固定)
本題有開啟smep跟smap,內核態不可訪問/執行用戶空間的數據
1 | |
Unintended Solution
最終目標是修改modprobe_path,執行自己的腳本去改/flag的權限,這樣就可以拿到flag了
用write_to_address()可以達到這個目的,但是modprobe_path的位址是0xffffffff82444620,顯然無法通過data.target < (void *)0xffffffff00000001
1 | |
在peek_physical(),給定物理記憶體位址data.phyaddr,function會使用ioremap_nocache()將那個位址的物理記憶體映射到虛擬記憶體上,到function結束也不會拿掉這個映射,所以後面我們可以利用這個新映射出來的虛擬記憶體位址。
經過測試,給modprobe_path的物理記憶體位址,每次都會映射到虛擬記憶體位址0xffffc90000045620,也可以通過上面write_to_address()的檢查
1 | |
獲取modprobe_path物理記憶體位址,可以透過get_physical(),給一個虛擬記憶體位址,就會回傳映射到這個位址上的物理記憶體的位址。
1 | |
總結起來就是:
- 用
get_physical()獲取modprobe_path的物理記憶體位址 - 用
peek_physical()讓modprobe_path的物理記憶體映射到另一個虛擬記憶體位址上(位址固定0xffffc90000045620) - 用
write_to_address()修改虛擬記憶體位址0xffffc90000045620的資料,由於這個位址也是映射到modprobe_path,就可以達成目的
Exploit
1 | |
Flag:
AIS3{Oh_n0_1_fOrg37_%O_`iounmap`,_T_Wi|l_r3m*MbEr_i7_Ne/t_t1m#_QAQ}