.
我有一个学校项目,在 x86_64 OpenSUSE 上重新编码类似 strace 的命令。(英特尔 i7)
为此,我们当然使用 ptrace 系统调用,但禁止使用 PTRACE_SYSCALL。由于 PTRACE_PEEKTEXT 和与系统调用指令相对应的操作码(0x80CD 用于 int0x80,0x050F 用于 syscall,0x340F 用于 sysenter),我们必须使用 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:对不起我的英语不好