UPX

From aldeid
Jump to navigation Jump to search

Description

UPX (Ultimate Packer for eXecutables) is one of the most famous packers for executables. Many malware are packed using UPX.

UPX supports:

Format full name Format description
amd64-linux.elf Linux ELF
amd64-linux.kernel.vmlinux Linux kernel
arm-linux.elf Linux ELF
arm-linux.kernel.vmlinux Linux kernel
arm-wince.pe Windows CE executable or DLL
armeb-linux.elf Linux ELF
armeb-linux.kernel.vmlinux Linux kernel
fat-darwin.macho Mac OS X executable
i086-dos16.com DOS 16-bit .com file
i086-dos16.exe DOS 16-bit executable
i086-dos16.sys DOS 16-bit .sys file
i386-bsd.elf.execve BSD generic
i386-darwin.macho Mac OS X executable
i386-dos32.djgpp2.coff DOS 32-bit COFF
i386-dos32.tmt.adam DOS 32-bit executable
i386-dos32.watcom.le DOS 32-bit linear executable
i386-freebsd.elf FreeBSD ELF
i386-linux.elf Linux ELF
i386-linux.elf.execve Linux generic
i386-linux.elf.shell Linux shell script
i386-linux.kernel.bvmlinuz Linux kernel
i386-linux.kernel.vmlinux Linux kernel
i386-linux.kernel.vmlinuz Linux kernel
i386-netbsd.elf NetBSD ELF
i386-openbsd.elf OpenBSD ELF
i386-win32.pe Windows 32-bit executable or DLL
m68k-atari.tos Atari TOS/MiNT executable
mips-linux.elf Linux ELF
mipsel-linux.elf Linux ELF
mipsel.r3000-ps1 PlayStation 1 executable
powerpc-darwin.macho Mac OS X executable
powerpc-linux.elf Linux ELF
powerpc-linux.kernel.vmlinux Linux kernel

Installation

UPX supports following platforms:

  • Win32/i386
  • Linux/i386
  • Linux/AMD64
  • Linux/ARM
  • Linux/MIPS
  • Linux/PPC
  • DOS/i386
  • Atari TOS-MiNT/m68k

The above installation has been tested on Ubuntu 12.04 32 bits:

$ cd /data/src/
$ wget http://upx.sourceforge.net/download/upx-3.09-i386_linux.tar.bz2
$ bzip2 -cd upx-3.09-i386_linux.tar.bz2 | tar xvf -
$ cd upx-3.09-i386_linux/
$ ./upx --help

Usage

Syntax

Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file

Options

Commands

-1
compress faster
-9
compress better
--best
compress best (can be slow for big files)
-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
-oFILE
write output to 'FILE'
-f
force compression of suspicious files
--no-color, --mono, --color, --no-progress
change look

Compression tuning options

--brute
try all available compression methods & filters [slow]
--ultra-brute
try even more compression variants [very slow]

Backup options

-k, --backup
keep backup files
--no-backup
no backup files [default]

Overlay options

--overlay=copy
copy any extra data attached to the file [default]
--overlay=strip
strip any extra data attached to the file [DANGEROUS]
--overlay=skip
don't compress a file with an overlay

Options for djgpp2/coff

--coff
produce COFF output [default: EXE]

Options for dos/com

--8086
make compressed com work on any 8086

Options for dos/exe

--8086
make compressed exe work on any 8086
--no-reloc
put no relocations in to the exe header

Options for dos/sys

--8086
make compressed sys work on any 8086

Options for ps1/exe

--8-bit
uses 8 bit size compression [default: 32 bit]
--8mib-ram
8 megabyte memory limit [default: 2 MiB]
--boot-only
disables client/host transfer compatibility
--no-align
don't align to 2048 bytes [enables: --console-run]

Options for watcom/le

--le
produce LE output [default: EXE]

Options for win32/pe, rtm32/pe & arm/pe

--compress-exports=0
do not compress the export section
--compress-exports=1
compress the export section [default]
--compress-icons=0
do not compress any icons
--compress-icons=1
compress all but the first icon
--compress-icons=2
compress all but the first icon directory [default]
--compress-icons=3
compress all icons
--compress-resources=0
do not compress any resources at all
--keep-resource=list
do not compress resources specified by list
--strip-relocs=0
do not strip relocations
--strip-relocs=1
strip relocations [default]

Options for linux/elf

--preserve-build-id
copy .gnu.note.build-id to compressed output

Example

Determine if executable is packed

Let's consider the example available in the "Practical Malware Analysis" book (Lab 1-2). The file seems to be packed with UPX:

$ ./pescanner.py /data/documents/BinaryCollection/Chapter_1L/Lab01-02.exe
################################################################################
Record 0
################################################################################

Meta-data
================================================================================
File:    /data/documents/BinaryCollection/Chapter_1L/Lab01-02.exe
Size:    3072 bytes
Type:    PE32 executable (console) Intel 80386, for MS Windows, UPX compressed
MD5:     8363436878404da0ae3e46991e355b83
SHA1:    5a016facbcb77e2009a01ea5c67b39af209c3fcb
ssdeep:  48:atUKzxRhvlNZEVtfbn4m3ZUJSSeJY8JTaIcLoBgs:0UKXktfb4KOJzcK
Date:    0x4D370D01 [Wed Jan 19 16:10:41 2011 UTC]
EP:      0x405410 UPX1 1/3 [SUSPICIOUS]
CRC:     Claimed: 0x0, Actual: 0x41f9 [SUSPICIOUS]

Signature scans
================================================================================

Clamav: /data/documents/BinaryCollection/Chapter_1L/Lab01-02.exe: Win.Trojan.Agent-328471 FOUND

Suspicious IAT alerts
================================================================================
CreateServiceA

Sections
================================================================================
Name       VirtAddr     VirtSize     RawSize      Entropy     
--------------------------------------------------------------------------------
UPX0       0x1000       0x4000       0x0          0.000000    [SUSPICIOUS]
UPX1       0x5000       0x1000       0x600        7.067181    [SUSPICIOUS]
UPX2       0x6000       0x1000       0x200        2.797804

The presence of the 2 highlighted imports is also a sign that the executable is likely to be packed:

$ strings /data/documents/BinaryCollection/Chapter_1L/Lab01-02.exe 
a\`Y
(23h
MalService
sHGL345
http://w
warean
ysisbook.co
om#Int6net Explo!r 8FEI
SystemTimeToFile
GetMo
*Waitab'r
Process
OpenMu$x
ZSB+
ForS
ObjectU4
[Vrtb
CtrlDisp ch
Xcpt
mArg
5nm@_
t_fd
dlI37n
olfp
dW|6
lB`.rd
XPTPSW
KERNEL32.DLL
ADVAPI32.dll
MSVCRT.dll
WININET.dll
LoadLibraryA
GetProcAddress
VirtualProtect
VirtualAlloc
VirtualFree
ExitProcess
CreateServiceA
exit
InternetOpenA

Unpack (success)

Now that we suspect that the file is packed (UPX), let's unpack it:

$ ./upx -o /data/tmp/Lab01-02_unpacked.exe -d /data/documents/BinaryCollection/Chapter_1L/Lab01-02.exe 
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2013
UPX 3.09        Markus Oberhumer, Laszlo Molnar & John Reiser   Feb 18th 2013

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
     16384 <-      3072   18.75%    win32/pe     Lab01-02_unpacked.exe

Unpacked 1 file.

Unpack (failure)

The following command fails because the executable seems not to be packed with UPX.

$ ./upx -o /data/tmp/Lab01-03_unpacked.exe -d /data/tmp/Lab01-03.exe 
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2013
UPX 3.09        Markus Oberhumer, Laszlo Molnar & John Reiser   Feb 18th 2013

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
upx: /data/tmp/Lab01-03.exe: NotPackedException: not packed by UPX

Unpacked 0 files.

Comments