在禁用 ASLR 的情况下对固定地址进行探测

问题描述 投票:0回答:1

我想使用安装在

/sys/kernel/tracing
处的tracefs在通常与ASLR一起运行的特定PIE二进制文件的内存映射内的特定地址上设置uprobe。据我了解,PIE 二进制文件的通常方法是使用相对地址(如
echo 'p:test /test.elf:0xabcd %ip' > /sys/kernel/tracing/uprobe_events
)来设置探测器。 然而,就我而言,当使用
mmap
运行二进制文件以暂时禁用 ASLR 时,我希望将探测器放置在通过
0x155555551000
返回的内存页面上的已知位置(例如,
linux64 -R /test.elf
)。

我尝试使用二进制页面和映射页面之间的相对偏移量,但是

echo 1 > /sys/kernel/tracing/events/uprobes/test/enable
失败并显示“无法启用事件”。

这可以实现吗? 谢谢!

linux-kernel uprobe
1个回答
0
投票

不幸的是,你不能用 uprobes 来做到这一点。 Uprobes 有效地“绑定”到您想要跟踪的程序的 inode(其路径是在写入

/sys/kernel/tracing/uprobe_events
时指定的),并且只允许您跟踪位于映射该 inode 的 VMA 中的代码。

启用 uprobe 后,将扫描给定 inode 的每个当前活动映射,并为与请求的 inode 和偏移量匹配的 VMA 安装探测器(此处代码)。对于未来的映射,会在

mmap
期间进行检查,以确定是否应安装任何 uprobe(此处代码)。

在您的情况下,当您添加 uprobe 时,您不会看到任何问题,因为内核只进行一些被动验证。但是,启用它稍后会失败,因为您尝试跟踪的地址不属于映射您最初指定的文件的 inode 的 VMA。

如果您尝试跟踪的代码是文件支持(非匿名)

mmap
调用的结果,您可以添加 uprobe 来指定正在映射的文件的路径,而不是映射它的可执行文件,以及正确的偏移量。但是,如果(正如我怀疑的那样)您尝试跟踪的是包含某些代码的匿名映射(例如,JIT 编译器会执行的操作),则您不能使用 uprobes。您最好使用
ptrace(2)
或像 GDB 这样的实际用户空间调试器。


参考资料:Quarkslab 博客上的 Célian Glénaz 的击败 eBPF Uprobe 监控

© www.soinside.com 2019 - 2024. All rights reserved.