シングルステップ・スナイパー:TrapFlagForSyscallingでEDRフックを回避する

TrapFlagForSyscalling:トラップフラグによるシステムコール改ざんでユーザーランドフックを回避

トラップフラグ(TF)は、CPUのEFLAGSレジスタにある特殊なビットで、プロセッサに対して各命令の後にシングルステップ例外を生成させます。この挙動は、プログラムの流れを命令単位で追跡するデバッグで一般的に利用されます。

どのように動作するのか?

  • 対象となるシステムコールのアドレスを特定します。例:NtAllocateVirtualMemory
  • GetThreadContextSetThreadContextを使用して、現在のスレッドでトラップフラグを有効化します。
  • ランダムなダミーパラメータでNtAllocateVirtualMemoryのシステムコールを呼び出します。実行がsyscall命令に到達すると、VEHがNtAllocateVirtualMemoryのシステムコール番号を捕捉します。
  • ホワイトリスト化されたシステムコールのアドレスを取得します。これらはセキュリティソフトウェアに監視されにくいシステムコールで、例えばNtDrawTextなどです。
  • NtAllocateVirtualMemory向けの元のパラメータを用いてNtDrawTextを呼び出します。ここでVEHは、syscall命令に到達した際に、NtDrawTextのシステムコール番号をNtAllocateVirtualMemoryのものに置き換えます。

この手法は、NtAllocateVirtualMemoryに配置されたユーザーランドフックを回避しつつ、それをフックしているセキュリティソフトウェアには無効でランダムなパラメータを与えます。

使用方法

以下を渡してINVOKE_SYSCALLマクロを使用します:

  • dwSyscallHash – 対象システムコールのMurmur Hash
  • STATUS – システムコールから返された結果を保持するNTSTATUS変数。
  • ...dwSyscallHashで特定されるシステムコールに渡す実際のパラメータ。

ダウンロード

翻訳元: https://meterpreter.org/the-single-step-sniper-bypassing-edr-hooks-with-trapflagforsyscalling/

ソース: meterpreter.org