今回はパック化された実行ファイルの解析問題を作成する。
マルウェアはパックファイル形式で配布されることがある。パックファイルとは実行コードを圧縮したものである。パックファイルを実行すると、解凍プログラムにより圧縮されたコードが解凍され、本来の実行プログラムが起動する。そのため、パックファイルをgdbやobjdumpなどの解析ツールで静的解析する場合、解凍が行われていない状態のためプログラムのコードは不明のままである。したがって、実行されるコードを解析するにはパックファイルをアンパックする必要がある。
今回のBinary問題はパックファイル作成ツールであるUPXを用いて、解答者に以下を問う問題とする。
・パックファイルであることに気付けるか?
※gdbやobjdumpで解析をしても実態がわからないことをヒントにUPXファイルであることに気付けるか(Stringsコマンドとの組み合わせでUPXを使ったパックファイルであることがわかるか)
・パックファイルであることに気付いてアンパックできるか?
※これは「upx -d」で簡単にできる。
・アンパックされたプログラムコードの解析ができるか?

upxのインストール
# yum install upx

upxコマンドで実行ファイルをパック
# upx bin4v2.out -o bin4upx.out

パックされた実行ファイルをgdbで解析する。「info functions」を入力しても何も表示されないことがわかる。

次に、objdumpでdisassembleをかけるが何も表示されないことがわかる。

upx -d でアンパックする。
# upx -d bin4upx.out -o bin4upx-d.out

アンパックされた実行ファイルをgdbで解析する。「info functions」を入力すると多くの関数を確認することができる(Static Linkしているためかなり多い)。

objdumpでdisassembleをかけると、解析が可能になりアセンブリ表示されることがわかる。

解析対象の実行ファイルがパックされているかどうかを確認する方法として「strings」コマンドを用いる方法がある。左図ではUPXという文字が見えることがヒントになる。
★UPXコマンドを使うときの注意
・対象のプログラムサイズが40kバイト以下の場合、パックしてくれない。
・そこで、実行ファイルサイズを大きくするため、gccでコンパイルするときに「-static」オプションでLibraryをStaticLinkしようとしたがエラーとなる。
・原因はgccのライブラリはデフォルトではStaticLibraryがないため「glibc-static」をインストールする必要がある。
・しかし、yumやdnfで「glibc-static」が見つからず、インストールできない。
・原因は上記ライブラリをダウンロードするには「PowerToolsレポジトリ」を有効にする必要がある。
ファイル名:/etc/yum.repos.d/CentOS-Stream-PowerTools.repo
変更する場所:enable=1
・上記レポジトリを有効化した後、「glibc-static」がインストール可能になる。
dnf install glibc-static
・gccのstaticオプションが有効になり、Static-Linkが成功し、ファイルサイズの大きな実行ファイルができる。
gcc -static -o bin4v2.out bin4.c -lcrypt
・UPXでパックできるようになる。
upx bin4v2.out -o bin4upx.out
・「-d」オプションでアンパックもできる。
upx -d bin4upx.out -o bin4upx-d.out