見出し画像

#79 UPX

 ファイルをネットワークを通じて送るとき、少しでもファイルサイズを小さくするために圧縮を行うことがあります。圧縮方法はZIP形式が一般的ですが、他の方法もあります。
 UPXは、圧縮ツールのひとつで、実行ファイルの圧縮に特化しています。もちろん、通常の用途で使うこともできますが、マルウェアの検知を回避するためのパッカーとして使われることが多いようです。マルウェア検知ツールは、ファイルの特徴から悪性判定を行うので、圧縮によってマルウェアの特徴が変わってしまうと検知を逃れることができてしまいます。
実際に、圧縮と解凍を試してみましょう。

作業

 公式リポジトリからupxをダウンロードします。

$ ./upx -h
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2023
UPX 4.0.2       Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 30th 2023

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

Hello Worldプログラムを圧縮してみます。

hello.cpp

#include <iostream>
int main() 
{
   printf("Hello World");
   return 0;
}
$ make hello
$ ./hello 
Hello World

$ ls -la ./hello
-rwxrwxr-x 1 kusa kusa 16280 May 29 01:33 ./hello

約16kbのファイルになっています。
これを圧縮してみます。

$ ./upx -o hello.upx ./hello
$ ls -la ./hello.upx
-rwxrwxr-x 1 kusa kusa 6092 May 29 01:33 ./hello.upx

なんと、約6kbまで圧縮されました!すさまじい圧縮率です。
しかし、いくら圧縮できても、適切に解凍できなければ意味がありません。

$ ./upx -d -o hello-dec hello.upx
$ ./hello-dec 
Hello World

$ ls -la ./hello-dec 
-rwxrwxr-x 1 kusa kusa 16280 May 29 01:33 ./hello-dec

バッチリ解凍できました!ハッシュ値はどうでしょうか。

$ sha1sum ./hello
4b6b1c9d403c8fc8b5df1f40c60b047598930681  ./hello
$ sha1sum ./hello-dec
4b6b1c9d403c8fc8b5df1f40c60b047598930681  ./hello-dec

完璧に同じですね。

どのように圧縮しているのか、また実際にどれほどマルウェア検知をかいくぐれるのか、気になるところです。研究のしがいがありますね。


EOF



この記事が気に入ったらサポートをしてみませんか?