bogus在Linux x86_64上为32位进程报告了第一个syscall参数?

时间:2013-03-28 21:05:22

标签: linux-kernel

在Linux x86_64系统上(至少RHEL 6.4运行2.6.32),/proc/pid/syscall报告的32位进程的第一个系统调用参数似乎是假的......我想确定原因。< / p>

例如,如果进程被阻止进行openat(AT_FDCWD,...),我在/proc/pid/syscall中看到以下内容......

64位:

257 0xffffffffffffff9c ...

32位:

295 0xffffffff810495c0 ...

AT_FD_CWD == -100 == 0xffffffffffffff9c,所以64位的情况看起来正确,但是32位的值似乎已被破坏(其他参数看起来正确)。

我知道我可以在堆栈顶部找到一个struct pt_regs,我可以通过...找到它。

#define task_pt_regs(tsk)       ((struct pt_regs *)(tsk)->thread.sp0 - 1)

我看到了伪造的价值。

然而......即使在32位情况下,strace似乎能够找到第一个参数的正确值。它确实是ptrace(PTRACE_PEEKUSER),AFAIK只是查看相同的struct pt_regs。

我必须遗漏一些东西... strace允许它通过PTRACE_PEEKUSER看到有效的寄存器值会发生什么魔力?通过/proc/pid/syscall看到的第一个参数会发生什么?

0 个答案:

没有答案