
Gargoyle の x64 向け派生版。ROP と PIC のみを使用してメモリアーティファクトを隠します。
Gargoyle の x64 向けバリアント。ROP と PIC のみを使用してメモリアーティファクトを隠蔽します。
@waldoirc 氏がこのテクニックの大部分を自身の ブログ で文書化してくれたことに多大なる感謝を。
本実装は APC を一切使用せず、完全に PIC として実装されている点が異なります。
x64 において Gargoyle のようなテクニックを使ってメモリアーティファクトを回避する方法をより深く理解するために作成しました。 基本的なアイデアは、VirtualProtect() -> Sleep() -> VirtualProtect() を呼び出す ROPChain をセットアップし、Sleep 中に自身のページを N/A にマークすることです。
Gargoyle や他の Gargoyle 系実装とは異なり、私は完全に ROP に依存し、APC を一切キューしません。 DeepSleep 自体は完全 PIC として実装されているため、スキャナーから隠蔽すべきメモリページを列挙するのが容易です。
スレッドがアクティブな間は MessageBox が表示され、DeepSleep のページは実行可能としてマークされます。Sleep 中はページが N/A にマークされます。
これにより、執筆時点では、DeepSleep が注入され、実行スレッドのベースアドレスがプライベートコミットメモリを指していない場合、Moneta を効果的にバイパスできます。
このことは、Earlybird 注入テクニックを使用して DeepSleep.bin を notepad.exe に注入することで確認しました。

Mingw を使用:
make と入力すると、見事な DeepSleep.bin が現れます。
または、プリコンパイル済みの DeepSleep.bin を利用してください :-)
CS やその他の C2 エージェント用のローダーをリリースするかもしれません。YouMayPasser と同様に、そのローダーは HW ブレークポイントを使用して Sleep をフックし、kernel32.dll の疑わしい改変を回避します。
以下でテスト済み: 10.0.19044 N/A Build 19044
私が依存している ROPgadget は、他のバージョンの Windows の ntdll.dll には存在しない可能性があります。 より小さく汎用的な ROPgadget を利用し、ntdll.dll 以外の DLL でも gadget を列挙することをお勧めします。
DelayExecution 状態にあるスレッドのコールスタックには、未知または改変されたメモリ領域が含まれ、さらに VirtualProtect() のアドレスも含まれます。Hunt-Sleeping-Beacons がこれを検出します。
この指標を、コールバック間の待機に別のテクニックを使用する他の C2 にも適用できる可能性があります。

@waldoirc 氏 – テクニックの大部分を こちら で文書化
@forrest Orr 氏 – Moneta
Josh Lospinoso 氏 – オリジナルの Gargoyle technique