我正在学校进行关于 Dirty CoW 的研究(如果您不知道它是什么并且您认为该实现可能与我的问题相关,请参阅下面的 PS)。
我找到了一些解决方案(即https://github.com/scumjr/dirtycow-vdso)使用 Dirty CoW 将一些 shellcode 注入 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 如何传播到其他进程呢?
我非常感谢您的回答。
附:Dirty CoW 是 Linux 内核的一个漏洞,它允许您通过引起两个线程的竞争条件来写入只读文件(或可以映射到内存中的任何内容) - 第一个线程有一个循环,它将任何文本写入内存(进入 /proc/self/mem
或使用ptrace
usingmmap
来找到正确的位置),另一个是告诉系统(也在循环中)不再需要内存的同一部分(使用madvise(MADV_DONTNEED)
)。
答案1
这虚拟DSO不存储在磁盘上的单独文件中,它是内核的一部分,并由内核映射到每个进程的地址空间。您找到的文件.so
仅用于调试目的。文档中的命令find
以构建内核时为例,在内核构建树中查找生成的vDSO;就此事而言,不要求单独的.so
s 出现在或其他任何地方。/lib/modules
您正在处理的漏洞利用注入的 shellcode 会传播,因为内存中只有 vDSO 的单个副本,因此对它的任何成功写入都会显示在 vDSO 的所有当前和未来进程的映射中......