2

Linux x86_64 システム (少なくとも 2.6.32 を実行する RHEL 6.4) では、/proc/pid/syscall32 ビット プロセスに対して によって報告される最初の syscall 引数は偽物のようです ... その理由を突き止めたいと思います。

たとえば、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)

そこに偽の値が表示されます。

しかし…straceは32ビットの場合でも第一引数の正しい値を見つけられるようです。これは ptrace(PTRACE_PEEKUSER) を実行しますが、これは私の知る限り、同じ構造体 pt_regs を見るだけです。

私は何かが欠けているに違いありません... PTRACE_PEEKUSER を介して有効なレジスタ値を表示できるようにする strace の魔法は何ですか? 経由で見られるように、最初の引数を上書きするとどうなり/proc/pid/syscallますか?

4

0 に答える 0