UPX (Ultimate Packer for eXecutables)

Compresse et packe des exécutables ; couramment utilisé, et détourné, pour obfusquer des payloads et échapper à la détection AV basée sur signatures statiques. Compresses and packs executables; commonly used, and abused, to obfuscate payloads and evade static signature-based AV detection.

↗ https://upx.github.io

Overview

UPX is a legitimate executable packer/compressor supporting a wide range of formats (PE, ELF, Mach-O, and more). Legitimately it just shrinks binary size, but on the offensive side packing a payload with UPX (often combined with further obfuscation or a custom stub) changes its byte signature enough to slip past naive static AV/EDR detection that hasn’t specifically fingerprinted the packed form. On the defensive side, reversers use upx -d to unpack samples before static analysis.

Common Usage

Compress a binary in place (default settings)

upx payload.exe

Best compression ratio (slower)

upx --best payload.exe

Maximum compression, ultra-brute (very slow, smallest output)

upx --ultra-brute payload.exe

Decompress/unpack a UPX-packed binary

upx -d packed.exe

List info about a packed file without modifying it

upx -l packed.exe

Keep a backup of the original before packing

upx -k payload.exe

Evasion Context

Pack a payload to alter its static signature

upx --best -o payload_packed.exe payload.exe
# Note: many EDR/AV engines specifically fingerprint the UPX stub itself,
# so packing alone is rarely sufficient — often combined with a custom
# packer/crypter or UPX stub modification for real evasion testing

Reversing/Malware Analysis Workflow

  1. Identify if a sample is UPX-packed
upx -l suspicious.exe
  1. Attempt standard unpacking
upx -d suspicious.exe -o unpacked.exe
# 3. If UPX's own unpacker fails (modified stub), fall back to
#    manual unpacking in a debugger (dump at OEP)

Tips

  • UPX’s magic bytes/section names (UPX0, UPX1) are a well-known IOC — many AV engines flag “packed with UPX” outright regardless of payload.
  • -d (decompress) only works on unmodified UPX stubs; attackers who patch the stub to break upx -d force analysts into manual unpacking.
  • Not all formats/architectures are supported — check upx --help output for your target’s format before relying on it.
Help / Man page
Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..

Commands:
  -1     compress faster                   -9     compress better
  --best compress best (can be slow)       --ultra-brute try all methods & filters
  -d     decompress
  -l     list compressed file
  -t     test compressed file
  -V     display version number
  -h     give this help
  -L     display software license

Options:
  -q     be quiet                          -v    be verbose
  -o FILE    write output to FILE
  -f, --force    force compression / overwrite
  -k, --backup    keep backup of the original file
  --no-backup     no backup files

This version supports: dos/exe, win32/pe, linux/elf386, macho/x86,
macho/arm64, atari/tos, and more.

Vue d’ensemble

UPX est un packer/compresseur d’exécutables légitime supportant un large éventail de formats (PE, ELF, Mach-O, et plus). De manière légitime, il réduit simplement la taille des binaires, mais côté offensif, packer un payload avec UPX (souvent combiné à davantage d’obfuscation ou un stub personnalisé) modifie suffisamment sa signature d’octets pour passer sous le radar d’une détection AV/EDR statique naïve qui n’a pas spécifiquement fingerprinté la forme packée. Côté défensif, les reversers utilisent upx -d pour dépacker des échantillons avant analyse statique.

Utilisation courante

# Compresser un binaire sur place (paramètres par défaut)
upx payload.exe

# Meilleur taux de compression (plus lent)
upx --best payload.exe

# Compression maximale, ultra-brute (très lent, sortie la plus petite)
upx --ultra-brute payload.exe

# Décompresser/dépacker un binaire packé avec UPX
upx -d packed.exe

# Lister les infos d'un fichier packé sans le modifier
upx -l packed.exe

# Garder une sauvegarde de l'original avant de packer
upx -k payload.exe

Contexte d’évasion

# Packer un payload pour altérer sa signature statique
upx --best -o payload_packed.exe payload.exe
# Note : de nombreux moteurs EDR/AV fingerprintent spécifiquement le stub UPX lui-même,
# donc le packing seul est rarement suffisant : souvent combiné à un
# packer/crypter personnalisé ou à une modification du stub UPX pour un vrai test d'évasion

Workflow de reversing/analyse de malware

# 1. Identifier si un échantillon est packé avec UPX
upx -l suspicious.exe

# 2. Tenter le dépackage standard
upx -d suspicious.exe -o unpacked.exe
# 3. Si le propre dépackeur d'UPX échoue (stub modifié), passer à
#    un dépackage manuel dans un débogueur (dump à l'OEP)

Conseils

  • Les magic bytes/noms de section d’UPX (UPX0, UPX1) sont un IOC bien connu : de nombreux moteurs AV signalent “packé avec UPX” purement et simplement, quel que soit le payload.
  • -d (décompression) ne fonctionne que sur des stubs UPX non modifiés ; les attaquants qui patchent le stub pour casser upx -d forcent les analystes à un dépackage manuel.
  • Tous les formats/architectures ne sont pas supportés : vérifier la sortie de upx --help pour le format de votre cible avant de s’y fier.
Aide / Page de manuel
Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..

Commands:
  -1     compress faster                   -9     compress better
  --best compress best (can be slow)       --ultra-brute try all methods & filters
  -d     decompress
  -l     list compressed file
  -t     test compressed file
  -V     display version number
  -h     give this help
  -L     display software license

Options:
  -q     be quiet                          -v    be verbose
  -o FILE    write output to FILE
  -f, --force    force compression / overwrite
  -k, --backup    keep backup of the original file
  --no-backup     no backup files

This version supports: dos/exe, win32/pe, linux/elf386, macho/x86,
macho/arm64, atari/tos, and more.