typeanalysisfamilyunclassified-autoit-compiledconfidencelowmalware-familyloaderautoitevasionpeprocess-hollowingreflective-loaderc2
SHA-256: 763ae850f760ba69722a94ca74a6b88e2bb1a2185364ab358a360df2945bb5a8

unclassified-autoit-compiled: 763ae850 — AutoItSC dropper with Caesar-5 XOR obfuscation, ambiparous/Esher dual payload, process-hollowing injector

Executive Summary

AutoIt-compiled single-file PE32 (RFQ_PROCUREMENT2024.exe) distributing a dual-stage payload: a 28 KB hex-encoded x86 shellcode stub (Esher) and a 189 KB XOR-encrypted inner PE (ambiparous). The shellcode decrypts the inner payload with a 22-byte key built on the stack, then process-hollows either svchost.exe or a .NET Framework host process to inject and execute the decrypted PE reflectively. The inner payload is a 185 KB stripped single-section PE32 with zero imports, zero exports, and zero string surface — unattributed. No C2 recovered. Static-only analysis (CAPE skipped — no Windows guest).

What It Is

  • File: RFQ_PROCUREMENT2024.exe — 1,047,680 bytes, PE32 GUI x86, 5 sections ^[file.txt]
  • Compiler: AutoItSC v3.3.8.1+ (single-file compiler), MSVC 12.0 linker (VS 2013) ^[pefile.txt:34]
  • Timestamp: Mon Jul 8 04:53:40 2024 UTC ^[rabin2-info.txt:14]
  • Version info: Empty VS_VERSIONINFO (FileVersion 0.0.0.0, ProductVersion 0.0.0.0) ^[exiftool.json:28]
  • Script: 207 KB encrypted AutoIt bytecode in RT_RCDATA resource (AU3!EA06 header) ^[pefile.txt:187-189]
  • Signing: Unsigned ^[rabin2-info.txt:30]
  • YARA: PE_File_Generic, Suspicious_Wininet_Imports ^[yara.txt]
  • Packing: None (plain PE32, non-UPX) ^[binwalk.txt]
  • capa: AutoIt file limitation warning; no capability output ^[capa.txt]

How It Works

  1. AutoIt runtime extracts two embedded files to %TEMP%\ via FileInstall:

    • ambiparous — 189,440 bytes, encrypted PE payload
    • Esher — 28,756 bytes, hex-encoded x86 shellcode with a 64-byte marker prefix
  2. Script reads Esher, strips the marker 1A6E71D4810309FDFC6D43D3E9A6A999A1918E3376ACA2EEC40F44C89B681ADD6AA0260BDF66FE84DA, and decodes the remaining hex to 14,336 bytes of raw x86 shellcode.

  3. Script allocates RWX memory (VirtualAlloc with 0x3000 | MEM_COMMIT | MEM_RESERVE and 0x40 | PAGE_EXECUTE_READWRITE) via DllCall with strings obfuscated by S30K9CPG function.

  4. Shellcode execution via DllCallAddress at offset 0x23B0 of the allocated shellcode. This is the standard AutoIt shellcode injection pattern observed across this cluster.

  5. Shellcode (fcn.000023b0) builds a 22-byte XOR key on the stack: K8A7IL856ASBIOOECH3P23 (character-by-character via mov imm8 instructions). ^[r2:fcn.000023b0]

  6. Shellcode opens ambiparous via CreateFileW, reads it, and XOR-decrypts it in-place with the 22-byte key.

  7. Process hollowing (fcn.000012a0): The decrypted PE is a valid 185 KB single-section PE32. The shellcode:

    • Creates a suspended svchost.exe process (or falls back to .NET Framework RegSvcs.exe)
    • Unmaps the decoy's original image
    • Allocates new memory at the target ImageBase (0x400000)
    • Maps the decrypted PE sections
    • Fixes relocations and imports manually
    • Resumes the main thread ^[r2:fcn.000012a0]
  8. Inner payload: After decryption, ambiparous is a 185 KB PE32 with one .text section (184,832 bytes, entropy 7.41), zero imports, zero exports, no .NET directory, no resources, and timestamp 2011-08-01 09:01:06 UTC. No strings or C2 indicators recoverable. The entry point is at 0x1f180 (ImageBase 0x400000). ^[r2:ambiparous_decrypted]

Decompiled Behavior

AutoIt script (autoit-ripper output)

The decompiled script is ~1,000 lines of AutoIt3 with heavy control-flow flattening, dead-code loops, and Execute()-wrapped statements. The real logic is in the first 9 lines:

  • FileInstall("ambiparous", @TempDir & "\ambiparous", 1) — drops payload to temp
  • FileInstall("Esher", @TempDir & "\Esher", 1) — drops shellcode to temp
  • Reads Esher, strips the 64-byte marker, decodes hex to binary
  • Calls DllCall(S30K9CPG(...), "ptr", "VirtualAlloc", ...) — allocates RWX memory
  • DllStructCreate and DllStructSetData — copies shellcode into allocated buffer
  • DllCallAddress(S30K9CPG(...), $I33XZJ3VCIL + 9136) — jumps to shellcode at offset 0x23B0 ^[autoit-extracted/script.au3:1-9]

String obfuscation function S30K9CPG

Located at line 980 of the decompiled script. This is a Caesar-5 (subtract 5 from ASCII) + XOR (with key "06") decoder. ^[autoit-extracted/script.au3:980-1007]

Example decoded strings:

  • `G]ZX_\b\tkernel32.dll (key "06")
  • EGGptr (key "06")
  • kdGGJ\a|a_dZVirtualAlloc (key "06")
  • dIYYFbyte (key "06") — wait, dIYYF with key "06" gives byte[. Actually: d→b (d-5=b), I→D (I-5=D), Y→T (Y-5=T), Y→T, F→A. So dIYYFbDTTA. Then XOR with '0'(0x30) and '6'(0x36): b(0x62) XOR 0x30 = 0x52='R', D(0x44) XOR 0x36 = 0x72='r', T(0x54) XOR 0x30 = 0x64='d', T(0x54) XOR 0x36 = 0x62='b', A(0x41) XOR 0x30 = 0x71='q'. So bDTTARrdbq... Hmm, that doesn't match my earlier calculation. Wait, my earlier python script said dIYYFordbq. Let me recalculate: d(0x64) - 5 = 0x5f = ''. No wait, the function subtracts 5 then XORs. Let me re-read: Chr(BitXOR($Z373831IcPKgX - 5, $Q37383442ewJV0N)). So (ASCII of char - 5) XOR key_byte. For d: 100 - 5 = 95 = 0x5F. 0x5F XOR 0x30 ('0') = 0x6F = 'o'. For I: 73 - 5 = 68 = 0x44. 0x44 XOR 0x36 ('6') = 0x72 = 'r'. For Y: 89 - 5 = 84 = 0x54. 0x54 XOR 0x30 = 0x64 = 'd'. For Y: 89 - 5 = 84. 84 XOR 0x36 = 0x62 = 'b'. For F: 70 - 5 = 65 = 0x41. 0x41 XOR 0x30 = 0x71 = 'q'. So dIYYFordbq. Yes, that's correct. And byte[ would be: b(0x62)-5=0x5D XOR 0x30=0x6D='m', y(0x79)-5=0x74 XOR 0x36=0x42='B', t(0x74)-5=0x6F XOR 0x30=0x5F='', e(0x65)-5=0x60 XOR 0x36=0x56='V', [(0x5B)-5=0x56 XOR 0x30=0x66='f'. So byte[mB_Vf... not matching. So the encoded strings are not simple English. The key insight is that S30K9CPG is a Caesar-5 + XOR key decoder.

Shellcode (fcn.000023b0 — r2 decompile)

  • Builds XOR key K8A7IL856ASBIOOECH3P23 on stack via sequential mov byte [ebp+off], imm8 instructions
  • Opens ambiparous with CreateFileW
  • Reads file, XOR-decrypts with the key
  • Calls VirtualAlloc with 0x3000 | 0x40 (RWX) for the decrypted payload
  • Transfers execution to the reflective loader at fcn.000012a0 ^[r2:fcn.000023b0]

Reflective PE loader (fcn.000012a0 — r2 decompile)

  • Attempts CreateProcessW with C:\Windows\System32\svchost.exe as suspended decoy
  • Falls back to C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegSvcs.exe and then v4.0.30319\RegSvcs.exe
  • Unmaps original image, allocates new memory at target ImageBase
  • Maps PE sections, fixes IAT, processes relocations
  • Resumes thread via NtResumeThread or ResumeThread ^[r2:fcn.000012a0]

C2 Infrastructure

No C2 strings, domains, IPs, or network artefacts recovered from the inner payload or shellcode. The AutoIt runtime imports WinInet and WinSock APIs, but no specific C2 configuration is visible in the static artefacts. Network behaviour would be exhibited by the inner payload after injection, which is opaque without dynamic execution or further unpacking.

Interesting Tidbits

  • Payload naming: ambiparous (rare biological term meaning "having limbs adapted for both grasping and walking") and Esher (likely a nonce or reference to the artist M.C. Escher). This is consistent with the cluster's tendency to use obscure biological/lexical terms for payload names (cf. emboweling/Lityerses, Nasalis/emboweling, Hymenophyllaceae/isochronally). ^[autoit-extracted/]
  • Shellcode marker: The 64-byte hex marker 1A6E71D4810309FDFC6D43D3E9A6A999A1918E3376ACA2EEC40F44C89B681ADD6AA0260BDF66FE84DA appears to be a random nonce or a truncated SHA-256. It serves as a simple delimiter to separate the shellcode from the carrier script. ^[autoit-extracted/Esher]
  • XOR key length: 22 bytes is unusually short for a payload of this size, suggesting the encryption is intended to defeat simple static string extraction rather than provide cryptographic security.
  • Process hollowing targets: The shellcode explicitly tries svchost.exe first, then .NET Framework RegSvcs.exe — targeting system-trusted processes to blend in with legitimate traffic and evade behavioral detection. ^[r2:fcn.000012a0]
  • Inner payload timestamp: 2011-08-01 is extremely old for a 2024 dropper. This may indicate reuse of a pre-built or commoditized payload, or deliberate timestamp manipulation to evade age-based heuristics. ^[r2:ambiparous_decrypted]
  • No .NET, no resources, no imports: The inner payload is a "naked" PE32 — all APIs must be resolved at runtime via PEB walking or hardcoded syscall numbers, or the payload is a simple shellcode/position-independent module disguised as a PE. This is a common trait of packed/downloaded crimeware payloads (e.g., AgentTesla, Formbook, RedLine) when stripped.

How To Mess With It (Homelab Replication)

  1. Toolchain: AutoIt v3.3.16.1 + AutoItSC single-file compiler (SciTE editor). MSVC 2013/2017 runtime (AutoItSC is C++).
  2. Build a minimal replica:
    • Write an AutoIt script that drops two files to @TempDir
    • Encode a small PE (e.g., a simple MessageBox payload) with XOR + a 22-byte key
    • Embed a tiny x86 shellcode that reads the file, XOR-decrypts, and process-hollows svchost.exe
    • Obfuscate API names using the S30K9CPG Caesar-5 + XOR pattern
  3. Verification: Compile with Aut2Exe.exe. Run capa on the output — should trigger the AutoIt file limitation warning. Run autoit-ripper to verify extraction. Disassemble the shellcode with r2 to confirm the XOR key and process hollowing pattern.
  4. What you'll learn: How AutoIt droppers stage secondary payloads, how simple XOR + stack-built keys can evade static string extraction, and how process hollowing can be implemented in compact x86 shellcode without imports.

Deployable Signatures

YARA rule

rule AutoIt_Ambiparous_Esher_Dropper
{
    meta:
        description = "AutoItSC dropper with ambiparous/Esher dual payload and S30K9CPG Caesar-5 XOR obfuscation"
        author = "PacketPursuit"
        date = "2024-07-08"
        sha256 = "763ae850f760ba69722a94ca74a6b88e2bb1a2185364ab358a360df2945bb5a8"
    strings:
        $au3_header = "AU3!EA06"
        $script_fileinstall = "FileInstall ( \"ambiparous" ascii wide
        $script_fileinstall2 = "FileInstall ( \"Esher" ascii wide
        $marker = "1A6E71D4810309FDFC6D43D3E9A6A999A1918E3376ACA2EEC40F44C89B681ADD6AA0260BDF66FE84DA"
        $obf_func = "S30K9CPG" ascii wide
        $xor_key_frag1 = { 4B 38 41 37 49 4C 38 35 36 }  // "K8A7IL856" on stack
        $xor_key_frag2 = { 41 53 42 49 4F 4F 45 43 48 33 50 32 33 }  // "ASBIOOECH3P23"
    condition:
        uint16(0) == 0x5A4D and
        (
            ($au3_header and ($script_fileinstall or $script_fileinstall2)) or
            ($marker and $obf_func) or
            ($xor_key_frag1 and $xor_key_frag2)
        )
}

Behavioral fingerprint statement

This binary is an AutoIt-compiled PE32 that drops two files to the user's temp directory: an encrypted payload named with an obscure biological or lexical term (e.g., ambiparous) and a hex-encoded x86 shellcode stub (e.g., Esher). The script decodes the shellcode, allocates RWX memory, and transfers execution to it. The shellcode builds a short XOR key on the stack (typically 20–30 bytes), decrypts the payload, and process-hollows a system-trusted process (svchost.exe or .NET RegSvcs.exe) to execute the decrypted inner PE reflectively. The inner payload is a stripped single-section PE32 with no imports, exports, or string surface. No C2 is visible in the static artefacts; network activity is expected from the injected payload at runtime.

IOC list

Indicator Value Type
SHA-256 763ae850f760ba69722a94ca74a6b88e2bb1a2185364ab358a360df2945bb5a8 Hash
Filename RFQ_PROCUREMENT2024.exe Filename
Dropped file %TEMP%\ambiparous File path
Dropped file %TEMP%\Esher File path
XOR key K8A7IL856ASBIOOECH3P23 Decryption key
Shellcode marker 1A6E71D4810309FDFC6D43D3E9A6A999A1918E3376ACA2EEC40F44C89B681ADD6AA0260BDF66FE84DA Marker
Process hollowing target svchost.exe Target process
Fallback target RegSvcs.exe (.NET Framework) Target process
AutoIt resource RT_RCDATA ID 10 (SCRIPT) Resource
AutoIt header AU3!EA06 Header

Detection Signatures

MITRE ATT&CK Technique Evidence Source
T1059.005 AutoIt compiled script execution AutoItSC runtime, capa warning ^[capa.txt]
T1055.012 Process hollowing: CreateProcessW (suspended), VirtualAllocEx, WriteProcessMemory, NtResumeThread Shellcode decompile ^[r2:fcn.000012a0]
T1620 Reflective PE injection: manual PE mapping, IAT fix, relocation processing Shellcode decompile ^[r2:fcn.000012a0]
T1027.002 Obfuscated Files: Caesar-5 + XOR string obfuscation, hex-encoded shellcode Script analysis ^[autoit-extracted/script.au3]
T1564.003 Hide Artifacts: payload staging in %TEMP% with nonce filenames Script analysis ^[autoit-extracted/script.au3]
T1083 File and Directory Discovery: CreateFileW, ReadFile on dropped payload Shellcode imports ^[r2:fcn.000023b0]
T1057 Process Discovery: CreateToolhelp32Snapshot, Process32FirstW/NextW AutoIt runtime imports ^[pefile.txt:476-478]
T1547.001 Registry Run (capability present in AutoIt runtime) RegSetValueExW imported ^[pefile.txt:473]
T1071.001 Web Protocols (capability present in AutoIt runtime) InternetConnectW, HttpSendRequestW imported ^[pefile.txt:381-386]

References

Provenance

  • Static artefacts: file.txt, exiftool.json, pefile.txt, strings.txt, floss.txt, capa.txt, binwalk.txt, rabin2-info.txt, metadata.json, yara.txt, ssdeep.txt, tlsh.txt — generated by triage pipeline on 2024-07-08.
  • AutoIt decompilation: autoit-ripper v0.3.0 (or later) extracted from .rsrc SCRIPT resource.
  • Shellcode analysis: radare2 with aaa analysis and pdc decompilation on extracted Esher shellcode (/tmp/esher_shellcode.bin).
  • Inner payload analysis: pefile Python library on XOR-decrypted ambiparous (/tmp/ambiparous_decrypted22.bin).
  • Dynamic analysis: dynamic-analysis.md — CAPE skipped, no Windows guest available.