Another shellcode injection technique using C++ that attempts to bypass Windows Defender using XOR encryption sorcery and UUID strings madness :).
-
Firstly, generate a payload in binary format( using either
CobaltStrike
ormsfvenom
) for instance, inmsfvenom
, you can do it like so( the payload I'm using is for illustration purposes, you can use whatever payload you want ):msfvenom -p windows/messagebox -f raw -o shellcode.bin
-
Then convert the shellcode( in binary/raw format ) into a
UUID
string format using the Python3 script,bin_to_uuid.py
:./bin_to_uuid.py -p shellcode.bin > uuid.txt
-
xor
encrypt theUUID
strings in theuuid.txt
using the Python3 script,xor_encryptor.py
../xor_encryptor.py uuid.txt > xor_crypted_out.txt
-
Copy the
C-style
array in the file,xor_crypted_out.txt
, and paste it in the C++ file as an array ofunsigned char
i.e.unsigned char payload[]{your_output_from_xor_crypted_out.txt}
This shellcode injection technique comprises the following subsequent steps:
- First things first, it allocates virtual memory for payload execution and residence via
VirtualAlloc
- It
xor
decrypts the payload using thexor
key value - Uses
UuidFromStringA
to convertUUID
strings into their binary representation and store them in the previously allocated memory. This is used to avoid the usage of suspicious APIs likeWriteProcessMemory
ormemcpy
. - Use
EnumChildWindows
to execute the payload previously loaded into memory( in step 1 )
- It doesn't use standard functions like
memcpy
orWriteProcessMemory
which are known to raise alarms to AVs/EDRs, this program uses the Windows API function calledUuidFromStringA
which can be used to decode data as well as write it to memory( Isn't that great folks? And please don't say "NO!" :) ). - It uses the function call obfuscation trick to call the Windows API functions
- Lastly, because it looks unique :) ( Isn't it? :) )
- You have to change the
xor
key(line 85) to what you wish. This also has to be done in the./xor_encryptor.py
python3 script by changing theKEY
variable. The keys have to match! - You have to change the default
executable filename
value(row 90) to your filename. mingw
was used but you can use whichever compiler you prefer. :)
- Simply run this at your terminal/shell:
make
The binary was scanned using antiscan.me on 01/08/2022.
https://research.nccgroup.com/2021/01/23/rift-analysing-a-lazarus-shellcode-execution-method/