
C++のシェルコードインジェクション技術。XOR暗号化とUUID文字列変換を用いてWindows Defenderを回避し、関数呼び出しの難読化、VirtualAllocとEnumChildWindowsによるメモリ実行を実現。
C++ を使用した別のシェルコードインジェクション手法で、XOR 暗号の魔術と UUID 文字列の 狂気 を使って Windows Defender を回避しようと試みます :)。
まず、バイナリ形式でペイロードを生成します(Havoc、CobaltStrike、msfvenom のいずれかを使用)。例えば msfvenom では以下のように行います(使用しているペイロードは 説明用 です。任意のペイロードを使用できます):
msfvenom -p windows/messagebox -f raw -o shellcode.bin
次に、Python3 スクリプト bin_to_uuid.py を使用して、シェルコード(バイナリ/生形式)を UUID 文字列形式に変換します。
./bin_to_uuid.py -p shellcode.bin -o uuid.txt
Python3 スクリプト xor_encryptor.py を使用して、uuid.txt 内の UUID 文字列を xor 暗号化します。
./xor_encryptor.py uuid.txt > xor_crypted_out.txt
ファイル xor_crypted_out.txt 内の C スタイル 配列をコピーし、C++ ファイル内で unsigned char の配列として貼り付けます。つまり unsigned char payload[]{xor_crypted_out.txt からの出力} です。
このシェルコードインジェクション手法は、以下の一連のステップで構成されています。
VirtualAlloc を使用してペイロードの実行と常駐のための仮想メモリを割り当てます。xor キー値を使用してペイロードを xor 復号化します。UuidFromStringA を使用して UUID 文字列をバイナリ表現に変換し、以前に割り当てられたメモリに格納します。これにより、WriteProcessMemory や memcpy のような疑わしい API の使用を回避します。EnumChildWindows を使用して、ステップ 1 でメモリに読み込まれたペイロードを実行します。memcpy や WriteProcessMemory のような、AV/EDR に警告を発することが知られている標準的な関数を使用しません。このプログラムは、UuidFromStringA という Windows API 関数を使用します。この関数はデータのデコードとメモリへの書き込みの両方に使用できます(素晴らしいと思いませんか? そして「NO!」と言わないでくださいね :))。xor キー(85行目)をお好みの値に変更する必要があります。これは ./xor_encryptor.py の Python3 スクリプトでも、KEY 変数を変更して行う必要があります。キーは一致している必要があります!実行可能ファイル名 の値(90行目)をファイル名に変更する必要があります。mingw を使用しましたが、お好みのコンパイラを使用しても構いません。make


バイナリは antiscan.me を使用して 2022年8月1日にスキャンされました。

https://research.nccgroup.com/2021/01/23/rift-analysing-a-lazarus-shellcode-execution-method/