受限条件下使用ptrace读取进程内存的技术咨询
问题:无权限限制下用ptrace读取目标进程数据段的方法探讨
背景与目标
我有一个包含初始化全局变量的简单程序,想要通过ptrace读取它的数据段,但面临以下限制:
- 没有目标ELF文件的读权限
- 无root权限,无法访问目标进程的
/proc/PID/maps
已完成的尝试
- 已知text段大小,执行
LD_SHOW_AUXV=1 ./target确认程序启用了ASLR - 验证程序启动时
$rip是否等于基址:- 目标程序代码片段:
// 来自目标程序 printf("base: %lx\n", getauxval(AT_BASE)); - 追踪程序代码片段:
// 来自追踪程序 ptrace( PTRACE_GETREGS, my_pid, NULL, ®s ); printf("rip: %lx\n", regs.rip); - 执行结果:
rip: 7fa86c82b140 base: 7fa86c811000
- 目标程序代码片段:
- 遇到的障碍:
/proc/PID/maps和auxv仅能被目标进程自身访问,$rip无法直接用来定位目标程序基址;曾考虑注入指令访问auxv,但目标程序未引入<sys/auxv.h>库
补充测试(root权限下验证)
为排查内存映射连续性问题,用root权限读取/proc/PID/maps做了补充测试:
- 测试结果:
rip: 7f55e1354140 header: 56214add2040 entry: 56214add3080 /proc/PID/maps内容片段:56214add2000-56214add3000 r--p 00000000 08:01 3145841 /home/kali/Desktop/target 56214add3000-56214add4000 r-xp 00001000 08:01 3145841 /home/kali/Desktop/target ... 7f55e133b000-7f55e1360000 r-xp 00001000 08:01 4202628 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2- 发现:程序启动初期
$rip实际位于链接器(ld-linux)的代码段,而非目标程序的.text段
疑问
- 既然
$rip接近进程内存高端,能否向前搜索读取位于环境变量之后、内存顶部的auxv? - 能否将
LD_SHOW_AUXV=1 ./target的输出管道传输至追踪程序,以此获取auxv信息?
内容的提问来源于stack exchange,提问作者MBS
相关产品推荐
相关产品推荐

