linux 如何在64位进程中使用ptrace修改32位进程中的寄存器并使其执行系统调用?

myzjeezk  于 2023-01-20  发布在  Linux
关注(0)|答案(1)|浏览(191)

我正在编写一个程序,需要让一个32位进程调用系统调用。我希望保持我的程序架构独立,但目标总是32位的。
为了设置寄存器,我使用了ptracePTRACE_SETREGSPTRACE_SETREGS将regs结构指针作为其数据参数。
x86_64和x86对struct user_regs_struct有不同的定义,因此我尝试简单地使用x86_64,它正确地传递了系统调用号,但没有传递任何参数。我通过传递1(x86上的__NR_exit)作为系统调用号和21作为第一个参数来验证这一点,但进程仅以0退出。
我还尝试过复制struct user_regs_struct的x86定义,这样只会导致segfaults。
由于struct的两个定义使用完全不同的数据类型(x86_64上的unsigned long long int和x86上的long int),我怀疑它是否隐式访问了正确的数据,但它似乎没有像x86_64那样使用相同的寄存器来访问参数(rdi、rsi、rdx、r10、r8和r9)。

ut6juiuv

ut6juiuv1#

幸运的是,我好几天都想不出来,但你一问这个问题,你就意识到你应该做什么。
你只需要使用寄存器的x86_64等价物,例如,eaxebxecxedxesiediedp变成了raxrbxrcxrdxrsirdirdp

相关问题