134a00b7f369a8945c928c6956750dca49230d5fa384ff94403ab176e84fd061unattributed: 134a00b7 — Truncated Go PE64+ x64 (262 KB of claimed 2.4 MB image)
Executive Summary
A Go-compiled PE64+ x64 GUI executable arriving truncated: 261,834 bytes on disk presenting a 2.4 MB PE header (7 sections, SizeOfImage=0x258000). Only the DOS/NT headers and the first ~260 KB of .text survived; .rdata, .data, .idata, .reloc, .symtab, and .rsrc are entirely absent. The upstream MalwareBazaar source serves the same 262 KB, confirming source-side corruption. This is the second confirmed sibling (138b53c5 being the first) of a structural pattern: truncated Go PE64+ binaries with identical section layouts but different build IDs and truncation depths. No family attribution, no payload extraction, and no behavioural characterisation possible from the surviving stub.
What It Is
- File:
SecuriteInfo.com.Trojan.GenericKDZ.117992.5647.11801(MalwareBazaar naming) ^[metadata.json] - SHA-256:
134a00b7f369a8945c928c6956750dca49230d5fa384ff94403ab176e84fd061 - Type: PE32+ executable (GUI) x86-64, 7 sections ^[file.txt]
- Size: 261,834 bytes on disk ^[metadata.json]
- Claimed image size: 2,457,600 bytes (
SizeOfImage=0x258000) ^[pefile.txt:100] - Build ID:
lbdBnnyBahB8NB14vyKX/SfPqRAAFe2DICx9s4L-B/I29dyJ_gSnleVnfGA_2i/GI9T5NiJhyV_MslTqwpB^[strings.txt:8] - Toolchain: Go gc (implied by Go build ID string and
.symtabsection name);GOARCH=amd64,GOOS=windows^[strings.txt:8] ^[pefile.txt] - Subsystem: Windows GUI (
0x2) ^[pefile.txt:104] - PE timestamp: Null (
0x0, 1970-01-01) ^[pefile.txt:72] - Stripped: Yes (
IMAGE_FILE_DEBUG_STRIPPED) ^[pefile.txt:77] - ASLR / NX: Enabled (
DYNAMIC_BASE,HIGH_ENTROPY_VA,NX_COMPAT) ^[pefile.txt:111] - Signed: No (security directory at
0x1FD000points past EOF) ^[rabin2-info.txt:34] - Family: unattributed (truncated singleton; second confirmed instance of this pattern after
138b53c5) ^[triage.json]
Section Layout (truncated reality vs. header claims)
| Section | VirtualSize | SizeOfRawData | PtrToRawData | On-disk entropy | Status |
|---|---|---|---|---|---|
| .text | 0x88ED8 | 0x89000 | 0x600 | 6.17 | Partially present (~260 KB valid code, then truncation) |
| .rdata | 0x122220 | 0x122400 | 0x89600 | 0.00 | Absent (pointer past EOF) |
| .data | 0x70AF0 | 0x19000 | 0x1ABA00 | 0.00 | Absent |
| .idata | 0x490 | 0x600 | 0x1C4A00 | 0.00 | Absent |
| .reloc | 0x2B60 | 0x2C00 | 0x1C5000 | 0.00 | Absent |
| .symtab | 0x18F8C | 0x19000 | 0x1C7C00 | 0.00 | Absent |
| .rsrc | 0x1C310 | 0x1C400 | 0x1E0C00 | 0.00 | Absent |
^[pefile.txt:115-253]
Every section after .text has PointerToRawData beyond the 261 KB file boundary. Even .text claims SizeOfRawData=0x89000 (561,152 bytes) starting at 0x600, which would extend to 0x89600 — well past EOF. pefile reports: "Error parsing section N. SizeOfRawData is larger than file" and "AddressOfEntryPoint lies outside the file." ^[pefile.txt:1-36]
The Go build ID at offset 0x600 confirms .text begins there and contains Go runtime code. ^[strings.txt:8]
How It Works
The binary cannot run. The entry point (0x5E380) falls inside .text, which is partially present (the first ~260 KB), but .rdata — containing Go string tables, type descriptors, import stubs, and read-only data — is entirely missing. Execution would fault immediately on the first data access.
Re-fetching the sample directly from MalwareBazaar via mb-fetch.py returned the same 261,834 bytes, confirming upstream corruption. ^[triage.json]
Inferable from the surviving ~260 KB stub:
- Go runtime version: The build ID format matches Go 1.18+ (four-slash build ID). The specific build ID differs from
138b53c5, confirming a distinct compilation. ^[strings.txt:8] - No static strings: No C2 URLs, mutex names, file paths, or registry keys survived in the 114 extracted strings. ^[strings.txt]
- No imports: The import directory RVA (
0x21E000) points into the missing.idatasection. Zero imports recoverable statically. ^[rabin2-info.txt:1-6] - No capa / floss results: capa errored (missing signatures directory); floss received incorrect CLI arguments during triage. Re-running would not change the outcome because the file is truncated. ^[capa.txt] ^[floss.txt]
Decompiled Behavior
radare2 analysis (level 2) found 11 functions in the .text stub: ^[r2:function-list]
| Address | Name | Size (bytes) | Notes |
|---|---|---|---|
0x00401000 |
entry0 |
2 | Minimal jump stub: goto loc_qword [rax] |
0x00401002 |
fcn.00401002 |
158 | Runtime init / stack setup (truncated mid-function) |
0x004010e0 |
fcn.004010e0 |
576 | Larger function (likely fmt/print related) |
0x004016a0 |
fcn.004016a0 |
303 | Data access / table walk |
0x00401f60 |
fcn.00401f60 |
32 | Stub |
0x00401f80 |
fcn.00401f80 |
32 | Stub |
0x00401fa0 |
fcn.00401fa0 |
32 | Stub |
0x00401fc0 |
fcn.00401fc0 |
32 | Stub |
0x00401140 |
fcn.00401140 |
159 | fmt / error formatting |
0x0040169f |
fcn.0040169f |
1 | Data alignment / label |
0x0040113f |
fcn.0040113f |
1 | Data alignment / label |
No import table means all API calls would be resolved via Go syscall package or raw asm inline stubs — standard for CGO_ENABLED=0 Go binaries. No main.main or other user-defined Go functions are visible in the surviving stub; they would reside deeper in .text or in the missing .rdata/.data sections.
The disassembly at 0x00401000 shows standard Go runtime prologue code with stack canary checks. No anti-debug or anti-VM artefacts are present in the surviving stub.
C2 Infrastructure
None recoverable. The .rdata section — where Go binaries store read-only string tables, including any hardcoded C2 URLs — is entirely absent. No network IOCs in strings.txt. No CAPE detonation. ^[strings.txt] ^[dynamic-analysis.md]
Interesting Tidbits
- Clean truncation. The file ends at offset
0x3FF2A(261,834 bytes), mid-instruction inside.text. The final bytes (10 48 8b 4c 24 20 48 8b 54 24) are valid x86-64 instruction stream (MOV RDX, [RSP+0x20]; MOV RDX, [RSP+...]), not padding. This is consistent with an interrupted network download. ^[hexdump] - MalwareBazaar serves the truncated copy. Re-fetch via
mb-fetch.pyon 2026-08-25 returned identical SHA-256 and size. The corruption is upstream. ^[mb-fetch verification] - Sister sample
138b53c5has identical section layout — sameSizeOfImage, sameAddressOfEntryPoint, same section count and names, same VirtualAddresses and VirtualSizes. Only the build ID, the.textcontent hash, and the truncation depth differ. This suggests both samples were uploaded to MalwareBazaar through the same pipeline or by the same uploader, and both suffered the same truncation event. ^[pefile.txt comparison with 138b53c5] - Null PE timestamp is standard for Go binaries built with
-trimpathor viago buildwithout explicit linker timestamp flags. ^[pefile.txt:72] - Seven-section layout (
.text,.rdata,.data,.idata,.reloc,.symtab,.rsrc) is the canonical Go PE layout on Windows amd64. ^[pefile.txt] - Generic AV naming. The MalwareBazaar filename (
SecuriteInfo.com.Trojan.GenericKDZ...) is an auto-generated SecuriteInfo label, not a meaningful family name. ^[metadata.json]
How To Mess With It (Homelab Replication)
Because the file is truncated, replication focuses on recognising the pattern and recovering Go binaries from partial data:
-
Recognise truncated Go PEs: Check if
SizeOfImage>> actual file size. pefile will emitSizeOfRawData is larger than filefor every section beyond the truncation point. Go binaries are especially susceptible to truncation during download because their.rdatasection is typically the largest (hundreds of KB to MB+). -
Verify upstream integrity: Re-fetch from MalwareBazaar (
mb-fetch.py <sha256>). If the size matches, the truncation is source-side. -
Extract the Go build ID: Even from a truncated binary, the build ID at offset
0x600(start of.text) can identify the Go version and module path hash. Usego version -m <file>on a complete binary, or grep forGo build ID:on a partial one. -
Cluster by section layout. When multiple truncated samples share identical
SizeOfImage,AddressOfEntryPoint, section names, and VirtualAddress/VirtualSize tuples but differ in build ID and truncation depth, they likely came from the same upload pipeline or suffered the same ingestion fault. -
What you learn: How to distinguish a corrupted sample from a deliberately minimal stub. In threat-intel pipelines, truncated samples should be flagged for re-ingestion rather than deep analysis.
Deployable Signatures
YARA Rule — Truncated Go PE64 Detection
rule truncated_go_pe64
{
meta:
description = "Detects truncated Go PE64+ binaries where SizeOfImage vastly exceeds file size"
author = "triage"
date = "2026-08-25"
sha256 = "134a00b7f369a8945c928c6956750dca49230d5fa384ff94403ab176e84fd061"
strings:
$go_build_id = "Go build ID: \"" ascii
$mz = { 4D 5A }
$pe = { 50 45 00 00 }
condition:
$mz at 0 and
$pe at uint32(0x3C) and
$go_build_id and
// File size < 300 KB but SizeOfImage > 1 MB
filesize < 300000 and
uint32(uint32(0x3C) + 0x50) > 0x100000
}
Behavioral Fingerprint Statement
This binary is a truncated Go PE64+ x64 GUI executable. On a complete copy, it would exhibit standard Go runtime behaviour: self-contained single binary with no external C runtime dependencies, CGO_ENABLED=0 syscall-based API resolution, and a large .rdata section containing string tables and type descriptors. In its current truncated state it is non-executable — the entry point references memory in the missing .rdata section, causing an immediate access violation. No C2, persistence, or payload behaviour can be inferred from the surviving 260 KB stub. The identical section layout to sample 138b53c5 suggests a common upload pipeline or ingestion fault.
IOC List
| Indicator | Value | Context |
|---|---|---|
| SHA-256 | 134a00b7f369a8945c928c6956750dca49230d5fa384ff94403ab176e84fd061 |
Truncated sample |
| SHA-1 | 75a5f585304f9910a12c4151ea9db82ae710b42a |
.text section only |
| MD5 | 03a1c4bbfe64dadba264802d860d9a7f |
.text section only |
| File size | 261,834 bytes | Truncated |
| Claimed image | 2,457,600 bytes | PE header lie |
| Go build ID | lbdBnnyBahB8NB14vyKX/SfPqRAAFe2DICx9s4L-B/I29dyJ_gSnleVnfGA_2i/GI9T5NiJhyV_MslTqwpB |
Partial build ID |
| Entry point | 0x5E380 |
Inside truncated .text |
| Sister sample | 138b53c5 |
Same structural truncation pattern |
Detection Signatures
No capa results (errored). No dynamic analysis. No behavioural signatures.
Static heuristics for truncated Go PEs:
- File size < 300 KB AND
Go build ID:string present ANDSizeOfImage> 1 MB → high-confidence truncated Go binary. - pefile emits "SizeOfRawData is larger than file" for multiple sections → structural truncation.
- Null PE timestamp + stripped debug info +
GOARCH=amd64build ID → Go compiler fingerprint. - Identical section VirtualAddress/VirtualSize tuples across multiple samples with different build IDs → common upload pipeline or ingestion fault.
References
- MalwareBazaar entry:
SecuriteInfo.com.Trojan.GenericKDZ.117992.5647.11801(sha256:134a00b7...) - unattributed — umbrella entity for singletons and low-confidence samples
- golang-stealer-build-pattern — concept page for Go malware build artefacts
- Sister analysis:
/intel/analyses/138b53c57ec807db6c5a9d5b2930d0909cf34b27b4ad8b72f5d74801fdc6c1cb.html
Provenance
Artifacts generated from:
file(file type)exiftool(PE metadata)pefile/pefile.py(section headers, structural warnings)rabin2(radare2 binary info, function list, string extraction)strings(ASCII string extraction)binwalk(embedded artefact scan — found nothing beyond PE header)- MalwareBazaar re-fetch via
mb-fetch.py(2026-08-25) confirming upstream truncation - CAPE sandbox: skipped (no Windows guest)
- capa: errored (missing signatures directory)
- floss: errored (incorrect CLI arguments during triage)
- radare2 analysis level 2 (11 functions identified in stub)