4.6より前のカーネルはアセンブリスタブを使用して、重要なシステムコール(フォーク、レプリケーション、実行など)のフックを強制します。特にexecveの場合、次のコードスニペットはカーネル 4.5execveのエントリスタブを表示:
ENTRY(stub_execve)
call sys_execve
return_from_execve:
...
END(stub_execve)
システム通貨テーブルこのスタブのアドレスを含み、このスタブは元のexecveをさらに呼び出します。したがって、この環境でexecveをフックするには、フックcall sys_execve
ルーチンでスタブをパッチし、必要な操作を完了した後に元のexecveを呼び出す必要があります。みんなアクションで見ることができますプログラムの実行、Linux用のプロセス実行監視ユーティリティ。カーネル4.4を使用して、Ubuntu 16.04でexecmonが正常に実行されることをテストしました。
カーネル 4.6 以降、重要な通貨保護の上位システムが変更されました。今スタブは次のようになります。
ENTRY(ptregs_\func)
leaq \func(%rip), %rax
jmp stub_ptregs_64
END(ptregs_\func)
execve呼び出し\func
に展開される場所。sys_execve
システムについて話しましょう通貨テーブルこのスタブは含まれており、このスタブは元のexecveを呼び出しますが、これを実行するのではなく、より安全な方法で、call sys_execve
この最新のスタブは呼び出された関数のアドレスをRAX
レジスタに保存し、以下のように別のスタブにジャンプします(説明を削除)。
ENTRY(stub_ptregs_64)
cmpq $.Lentry_SYSCALL_64_after_fastpath_call, (%rsp)
jne 1f
DISABLE_INTERRUPTS(CLBR_NONE)
TRACE_IRQS_OFF
popq %rax
jmp entry_SYSCALL64_slow_path
1:
jmp *%rax /* called from C */
END(stub_ptregs_64)
これを見てくださいこれこのスタブのコメントやその他の参照タグを確認してください。
私はこの保護を克服し、元の呼び出しをフック機能にパッチするためにいくつかのロジックを思い出すために一生懸命働きましたが、まだ成功していません。私と一緒に助けてくれる人ですか?