Ransomware.YggGuru - Go ransomware targeting Documents

sample source
theZoo
type
Ransomware
family
Ransomware.YggGuru
platform
Windows
architecture
x86-64
bitness
64-bit
format
PE32+
written in
Go
packer
UPX
tools
Detect It Easy, IDA Pro, Ghidra
approach
static only, binary never executed
date
2026-09-21

The sample

The file is a 64-bit Windows executable (PE32+) named update.exe.

Detect It Easy identified the file as packed with UPX 5.11 using LZMA compression. The overall entropy of the packed binary was 7.99.

Triage and unpacking

I unpacked the file using upx -d, which produced update_unpacked.exe.

The overall entropy dropped to 6.27, but Detect It Easy still showed a local peak reaching 8.0 around offset 0x5759b0.

I got curious about the peak. It turned out to be Go's runtime symbol table (pclntab).

Strings and threat intelligence

Running strings produced a large text dump dominated by Go runtime internals, time zone names, and TLS error strings. Filtering through the noise revealed the ransomware artifacts:

The MD5 hash matched an AlienVault OTX pulse named Ransomware.YggGuru - Go-based ransomware with C2 exf.... VirusTotal showed 52 detections out of 71 engines. The binary also contained source path references to /Users/anthony/poc-cyber/cmd/ransomware/main.go.

README_RESTORE.txt
bc1q9x4m27d3kge0f8v5td0w4rjhkfz5a5nqpfsghr
noreply@ygg.guru
https://ygg.guru/api/health

Imports and dynamic loading

The import table lists only KERNEL32.dll.

Among the entries:

There are no static imports for cryptography, networking, or the Windows registry. Go loads the other DLLs dynamically via LoadLibraryExW and GetProcAddress.

KERNEL32.dll
    LoadLibraryExW
    GetProcAddress
    VirtualAlloc
    CreateThread
    CreateIoCompletionPort

Execution flow in main.main

I opened the unpacked binary in IDA Pro and decompiled main_main using Hex-Rays.

The function executes the following sequence:

v0 = main_killProcesses();
v1 = main_deleteShadowCopies(v0);
main_addPersistence(v1);
r0 = main_disableTaskManager()._r0;
v32 = main_enumerateDrives(r0);
TargetDir = main_getTargetDir();
// ...
TargetFiles = main_getTargetFiles(TargetDir._r0, TargetDir._r1);
Key = poc_cyber_internal_pocrypto_GenerateKey(...);
// ...
while ( 1 ) {
  v33 = main_encryptFile(*v2, v2[1], v17, r1, r2);
  // increment encrypted file count
}
main_exfiltrateKey(r3, r4, TargetDir._r0, TargetDir._r1, ..., v25, ...);
v15 = main_dropRansomNote(TargetDir._r0, TargetDir._r1, v25);
main_setWallpaper(v15);
if ( Key._r1 != 0 )
  runtime_memclrNoHeapPointers(Key._r0);
Ransom note
Ransom note

Indicators

Takeaway

This was my first malware analysis and my first time using IDA and Detect It Easy. I read Practical Malware Analysis in parallel.

← all writeups

Written with the help of AI, based on my own analysis and notes.