我有一个学校项目,在x86_64 OpenSUSE上重新编码类似strace的命令。 (Intell i7)
为此,我们当然使用ptrace系统调用,但禁止使用PTRACE_SYSCALL。由于PTRACE_PEEKTEXT和对应于系统调用指令的操作码(int0x80为0x80CD,系统调用为0x050F,sysenter为0x340F),我们必须使用PTRACE_SINGLESTEP并检测系统调用。
直到那里,我很好。但是接下来我们必须获取系统调用的参数。对于syscall和intx80来说,这很容易,我查看rax以了解它是哪个系统调用,然后我查看rdi,rsi,rdx等。
但是对于sysenter我找不到它是如何工作的。所以我尝试编写一个小程序集程序来测试这3条指令。
BITS 64
global main
section .text
main:
push rbp
mov rbp, rsp
mov rdi, 1
mov rsi, FormatStr
mov rdx, 30
mov rax, 1
syscall
leave
ret
section .rodata
FormatStr db 'Hello World ! Sysenter Test !',0Ah,0
哪种方法完美无缺!
现在对于int 0x80版本,我只是将rax中系统调用的编号从1更改为4.(在32中,为什么系统调用数字不相同)
BITS 64
global main
section .text
main:
push rbp
mov rbp, rsp
mov rdi, 1
mov rsi, FormatStr
mov rdx, 30
mov rax, 4
int 0x80
leave
ret
section .rodata
FormatStr db 'Hello World ! Sysenter Test !',0Ah,0
其中50%有效。显示一个字符串,但它是垃圾。
现在如果我放了一个sysenter,我会得到一个SIGILL信号。我在rax中试过1和4。
我的项目必须在我的计算机上运行,但我必须能够检测和分析使用sysenter的二进制文件
有人可以对这些事情进行一些解释吗?
谢谢!
Ps:抱歉我的英文不好