Android x86 核心中的 vDSO 文件路徑
我正在學校對 Dirty CoW 進行研究(如果您不知道它是什麼並且您認為實施可能與我的問題有關,請參閱下面的 PS)。
我找到了一些使用 Dirty CoW 將一些 shellcode 注入 vDSO 的解決方案(即https://github.com/scumjr/dirtycow-vdso )。連結中的一個適用於桌面 Linux,但也有適用於 Android 的解決方案(基本相同,除了一些更改)。
我正在嘗試分析現有的解決方案,但遇到了一個問題 - vDSO 儲存在 Android 中的什麼位置?
手冊頁(http://man7.org/linux/man-pages/man7/vdso.7.html)說,您可以使用
find arch/$ARCH/ -name '*vdso*.so*' -o -name '*gate*.so*'
通過在我的 Ubuntu 64 位 ( ) 上執行類似的命令,
find / -name '*vdso*' -o -name '*gate*.*so'
輸出中會出現以下行:/lib/modules/4.13.0-32-generic/vdso /lib/modules/4.13.0-32-generic/vdso/vdsox32.so /lib/modules/4.13.0-32-generic/vdso/vdso32.so /lib/modules/4.13.0-32-generic/vdso/vdso64.so /lib/modules/4.13.0-21-generic/vdso /lib/modules/4.13.0-21-generic/vdso/vdsox32.so /lib/modules/4.13.0-21-generic/vdso/vdso32.so /lib/modules/4.13.0-21-generic/vdso/vdso64.so
通過在其中一個上使用
objdump
和hexdump
,我可以看到它是映射到記憶體中的那個(我編寫了一個程序,找到它並將其轉儲到文件中)。但是,當我跑步時
adb root adb shell find -name '*vdso*' -o -name '*gate*.so*'
在我的 Android 4.4-r4 x86 上,唯一的輸出是
/proc/sys/vm/vdso_enabled
(並且文件內容是1
)。我知道程序的記憶體中有 vDSO,我也為此編寫了一個從 ADB 執行的轉儲程序。我還調整了 Dirty CoW 漏洞利用,將我的 shellcode 注入 vDSO。我可以從我編寫的應用程序以及我之前提到的轉儲程序中看到 shellcode 在 vDSO 中。我的 shellcode 只存在於 vDSO 中,直到我重新啟動設備。
vDSO 如何在 Android 中工作?是否有儲存它的文件?似乎不是,因為如果它在那裡,注入的程式碼在重啟後也會在那裡。但是 shellcode 是如何傳播到其他程序的呢?
我非常感謝您的回答。
PS: Dirty CoW 是 Linux 核心的一個漏洞,通過導致兩個執行緒的競爭條件,您可以寫入只讀文件(或任何可以映射到記憶體中的文件)——第一個執行緒有一個循環,它正在寫入任何文本進入記憶體(進入/
proc/self/mem
或使用ptrace
usingmmap
找到正確的位置),另一個告訴系統(也在循環中)不再需要相同的記憶體部分(使用madvise(MADV_DONTNEED)
)。
vDSO不儲存在磁碟上的單獨文件中,它是核心的一部分,並由核心映射到每個程序的地址空間。您找到的
.so
文件僅用於調試目的。文件中的find
命令以建構核心時為例,在核心建構樹中查找生成的vDSO;沒有要求單獨.so
的 s 出現在/lib/modules
這個問題上或其他任何地方。您正在處理的漏洞利用注入的 shellcode 會傳播,因為記憶體中有 vDSO 的單個副本,因此任何成功的寫入都會顯示在所有目前和未來程序的 vDSO 映射中……