.
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 : 下手な英語でごめんなさい