2

.

x86_64 OpenSUSE で strace のようなコマンドを再コーディングする学校のプロジェクトがあります。(インテルi7)

もちろん、この目的のために ptrace システム コールを使用していますが、PTRACE_SYSCALL を使用することは禁止されています。PTRACE_SINGLESTEP を使用し、PTRACE_PEEKTEXT とシステム コール命令に対応するオペコード (int0x80 の場合は 0x80CD、syscall の場合は 0x050F、sysenter の場合は 0x340F) のおかげでシステム コールを検出する必要があります。

そこまでは元気です。しかし、システムコールのパラメータを取得する必要があります。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