使用 ptrace 读取进程内存,但有限制

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

我有一个带有初始化全局变量的简单程序,我正在尝试使用 ptrace 读取其数据部分。

限制: 我没有给小精灵许可。 我没有root权限,所以对目标程序的/proc/PID/maps没有r权限。

我的尝试: 我知道文本部分的大小。 运行

LD_SHOW_AUXV=1 ./target
告诉我该程序有aslr。 我又写了一个片段来看看程序开头的 $rip 是否与其基址相同

//from target program
    printf("base: %lx\n", getauxval(AT_BASE));

//from tracer program
        ptrace( PTRACE_GETREGS, my_pid, NULL, &regs );
        printf("rip: %lx\n", regs.rip);

我得到了

rip: 7fa86c82b140
base: 7fa86c811000

/proc/PID/maps 和 auxv 都只能被目标程序访问,$rip 不能直接使用。现在做什么?我想过注入指令来访问 auxv,但目标程序没有 库。

c linux memory x86-64 ptrace
1个回答
0
投票

通常,ELF 标头作为第一页映射到进程的内存中,位于

.text
以及其他代码和数据部分的下方。由于 RIP 很可能指向
.text
内的某个位置,因此您可以从该地址开始向后进行二分搜索,查找映射的第一页。您可以通过查看
PTRACE_PEEKTEXT
(或
PEEKDATA
,实际上是相同的)是否成功来判断页面是否映射。 (请注意,您无法从返回值确定成功或失败;您必须在调用之前设置
errno = 0
,然后查看它之后是否保持为零。)作为检查,该页面应该将
\x7f E L F
作为其前四个字节(即第一个双字为
0x464c457f
)。

找到该标头后,您可以解析它以找到

.data
部分的偏移量。

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