You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

禁用ASLR后在固定地址配置uprobe的可行性咨询

针对禁用ASLR的PIE二进制设置固定地址Uprobe的可行性分析

这种直接绑定进程虚拟地址的配置不可行,内核Uprobe机制的设计逻辑决定了它无法直接关联到进程私有虚拟地址空间的固定地址,以下是具体原因和正确的实现方式:

核心原因

Uprobe是基于二进制文件的磁盘镜像偏移而非进程虚拟地址工作的:

  • 当你指定/test.elf:0xabcd时,内核会解析该ELF文件的段信息,找到偏移0xabcd对应的磁盘位置,之后任何加载该二进制的进程中,内核会自动将这个磁盘偏移映射到进程虚拟地址空间的「加载基址+偏移」位置。
  • 进程的虚拟地址(如0x155555551000)属于进程私有空间,内核Uprobe不支持直接绑定到这类地址——它的定位逻辑是绑定到文件本身,而非单个进程的内存实例。

你尝试的偏移方法失败的可能原因

你计算的「二进制页与mmap页的相对偏移」可能存在错误:

  • PIE格式的ELF文件默认基址为0x0,进程加载时的基址(可通过/proc/<pid>/maps查看)是内核分配的固定值(禁用ASLR后)。正确的偏移应该是「目标虚拟地址 - 进程加载基址」,得到的是ELF文件内部的相对偏移,而非你自行计算的其他偏移值。如果偏移计算错误,内核无法在ELF文件中找到对应位置,自然无法启用探针。

正确的实现步骤

当用linux64 -R禁用ASLR运行二进制时,按以下步骤配置Uprobe:

  1. 启动进程后,通过pidof test.elf获取进程PID,再执行cat /proc/<pid>/maps找到该二进制的加载基址。例如输出中第一行的起始地址:
    0x155555550000-0x155555552000 r-xp 00000000 08:01 123456 /test.elf
    
    这里的加载基址就是0x155555550000。
  2. 计算目标地址的文件偏移:目标虚拟地址 - 加载基址。比如目标地址是0x155555551000,则偏移为0x1000。
  3. 配置Uprobe事件:
    echo 'p:test /test.elf:0x1000 %ip' > /sys/kernel/tracing/uprobe_events
    
  4. 启用事件:
    echo 1 > /sys/kernel/tracing/events/uprobes/test/enable
    

补充说明

  • 即使禁用ASLR,部分系统的PIE加载基址仍可能存在差异,建议每次运行进程后先确认加载基址再计算偏移。
  • 如果仅需针对单个进程设置探针,Uprobe的全局特性(作用于所有加载该二进制的进程)可能不适用,此时可以考虑使用gdb等用户态调试工具,或内核的kretprobe结合进程过滤逻辑实现单进程探针。

内容的提问来源于stack exchange,提问作者Coco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:31:47