Introduction
Another shellcode injection technique using C++ that attempts to bypass Windows Defender using XOR encryption sorcery and UUID strings madness :).
Shellcode generation
Firstly, generate a payload in binary format( using either
CobaltStrikeormsfvenom) 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.binThen convert the shellcode( in binary/raw format ) into a
UUIDstring format using the Python3 script,bin_to_uuid.py:./bin_to_uuid.py -p shellcode.bin > uuid.txtxorencrypt theUUIDstrings in theuuid.txtusing the Python3 script,xor_encryptor.py../xor_encryptor.py uuid.txt > xor_crypted_out.txtCopy the
C-stylearray in the file,xor_crypted_out.txt, and paste it in the C++ file as an array ofunsigned chari.e.unsigned char payload[]{your_output_from_xor_crypted_out.txt}
Execution
This shellcode injection technique comprises the following subsequent steps:
- First things first, it allocates virtual memory for payload execution and residence via
VirtualAlloc - It
xordecrypts the payload using thexorkey value - Uses
UuidFromStringAto convertUUIDstrings into their binary representation and store them in the previously allocated memory. This is used to avoid the usage of suspicious APIs likeWriteProcessMemoryormemcpy. - Use
EnumChildWindowsto execute the payload previously loaded into memory( in step 1 )
- It doesn’t use standard functions like
memcpyorWriteProcessMemorywhich are known to raise alarms to AVs/EDRs, this program uses the Windows API function calledUuidFromStringAwhich 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
xorkey(row 86) to what you wish. This can be done in the./xor_encryptor.pypython3 script by changing theKEYvariable. - You have to change the default
executable filenamevalue(row 90) to your filename. - The command for compiling is provided in the C++ file( around the top ). NB:
mingwwas used but you can use whichever compiler you prefer. 🙂
Compile
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/
Source : KitPloit – PenTest Tools!




