2

.

我有一个学校项目,在 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:对不起我的英语不好

4

0 回答 0