![見出し画像](https://assets.st-note.com/production/uploads/images/106761929/rectangle_large_type_2_075f324ffdaa69592706f5526330d0e1.jpeg?width=1200)
#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