
[英]Why does ptrace show a 32-bit execve system call having EAX = 59, the 64-bit call number? How do 32-bit system calls work on x86-64?
[英]How to use ptrace in 64 bit process to modify registers in a 32-bit process and make it do a system-call?
我正在开发一个需要让 32 位进程调用系统调用的程序。 我希望保持我的程序架构独立,但目标始终是 32 位。
要设置寄存器,我将ptrace
与PTRACE_SETREGS
使用,它将 regs 结构指针作为其数据参数。
x86_64 和 x86 对struct user_regs_struct
user_regs_struct 有不同的定义,所以我尝试简单地使用 x86_64 on,它正确传递了系统调用号,但没有传递 arguments,我已经通过传递1
(x86 上的 __NR_exit)作为系统调用号和21
来验证这一点作为第一个参数,但进程仅以 0 退出。
我还尝试复制struct user_regs_struct
的 x86 定义,这只会导致段错误。
由于结构的两个定义使用完全不同的数据类型(x86_64 上的unsigned long long int
和 x86 上的long int
)我怀疑它隐式访问正确的数据,但它似乎没有使用与 x86_64 相同的寄存器arguments(rdi、rsi、rdx、r10、r8 和 r9)。
幸运的是,我好几天都想不通,但一旦你问出这个问题,你就会意识到你应该做什么。
您只需要使用寄存器的 x86_64 等价物。 因此,例如eax
、 ebx
、 ecx
、 edx
、 esi
、 edi
、 rbx
变成rax
、 edp
、 rcx
、 rdx
、 rsi
、 rdi
、 rdp
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.