在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
看到的第一个参数会发生什么?