最初の2問は過去に解いてしまっていたので、途中から
Q7.[Reversing] Can you execute ?
10pt
拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、どうしたら実行出来るのだろうか。
この場合、UnixやLinuxのとあるコマンドを使ってファイルの種類を調べて、適切なOSで実行するのが一般的らしいが…
問題ファイル: exec_me
知らなかったのでchat GPTに聞いてみた
ファイルの種類を調べるためのコマンドは、オペレーティングシステムや目的に応じて異なります。以下はいくつかの主要な方法です:
- UNIX/Linux:
file
コマンド: これはファイルの種類を調べるための最も一般的なコマンドです。file [ファイル名]
- Windows:
- Windowsでは、コマンドラインから直接的にファイルの種類を調べる組み込みのツールは提供されていませんが、ファイル拡張子を見ることで大体のファイルタイプを判断することができます。
- Python:
- Pythonの標準ライブラリには、
mimetypes
というモジュールがあり、これを使用するとファイルのMIMEタイプを簡単に調べることができます。import mimetypes mime_type, encoding = mimetypes.guess_type('ファイル名') print(mime_type)
これらの方法の中から、目的や環境に合わせて適切なものを選んで使用してください。
躓いた点
% file exec_me
exec_me: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=663a3e0e5a079fddd0de92474688cd6812d3b550, not stripped
とりあえず助けてGPT先生
exec_me: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=663a3e0e5a079fddd0de92474688cd6812d3b550, not stripped
この結果は以下の情報を提供しています:
- exec_me: 調査対象のファイル名。
- ELF: 実行可能ファイルやオブジェクトファイルのフォーマットです。ELFは “Executable and Linkable Format” の略で、多くのUNIXベースのオペレーティングシステムで標準的に使用されるフォーマットです。
- 64-bit: ファイルが64ビットアーキテクチャ向けであることを示しています。
- LSB executable: “Linux Standard Base” の略で、Linuxディストリビューション間の互換性を提供するための標準です。このファイルはLSBに準拠していることを示しています。
- x86-64: この実行ファイルはx86-64アーキテクチャ(またはAMD64)向けであることを示しています。
- version 1 (SYSV): ELFのバージョンと、使用されているABI(Application Binary Interface)を示しています。SYSVはSystem Vとも呼ばれるUNIXの一種です。
- dynamically linked: このファイルは動的にリンクされていることを示しています。これは、実行時に外部のライブラリとリンクする必要があることを意味します。
- interpreter /lib64/ld-linux-x86-64.so.2: 実行時にこのインタープリタ(動的リンカー)が使用されることを示しています。
- for GNU/Linux 2.6.24: この実行可能ファイルは、少なくともLinuxカーネルバージョン2.6.24で実行できることを示しています。
- BuildID[sha1]: ビルドIDは、特定のバイナリのバージョンやオリジンを識別するための識別子です。
- not stripped: ファイルは “stripped” されていません。つまり、デバッグ情報やシンボル情報がまだファイルに残っていることを示しています。この情報はデバッグ時に非常に役立ちますが、配布や公開時には通常、この情報は削除(strip)されることが多いです。
この情報は、ファイルがどのようにコンパイルされ、どのプラットフォームやアーキテクチャ向けであるかなど、重要な詳細を提供しています。
Mac OSってUNIXベースじゃないんですね!!
% ./exec_me
zsh: exec format error: ./exec_me
DockerとVMって違うんですね…
言われるがままに、GPTに指摘されたDockerでいろんなディストリビューションを試せと言われたけど、理由がわかりました
はい、Dockerと仮想環境(例えばVirtualBoxやVMwareなどの仮想マシン)は、基本的なアイディアや目的が似ていると感じられるかもしれませんが、実際の動作の仕組みや使用目的は異なります。
- 仕組み:
- Docker: OSのカーネルを共有しながら、それぞれのアプリケーションとその依存関係をコンテナとして実行します。コンテナは軽量で、起動が速く、少ないオーバーヘッドで動作します。
- 仮想マシン: ハイパーバイザ上に完全に分離されたゲストOSを実行します。これにより、異なるOSを同じホスト上で実行することができますが、オーバーヘッドが大きくなります。
- リソース消費:
- Docker: メモリやストレージのオーバーヘッドは比較的少ない。
- 仮想マシン: ゲストOSごとにリソース(RAM, CPU, ストレージ)が割り当てられるため、オーバーヘッドは大きくなります。
- 分離:
- Docker: ホストOSのカーネルを共有しているため、完全な分離は提供されません。
- 仮想マシン: ゲストOSが完全に分離されているため、より高いセキュリティと分離が提供されます。
- ユースケース:
- Docker: 一般的に、アプリケーションやサービスを隔離し、デプロイやスケーリングを簡単にするために使用されます。
- 仮想マシン: 異なるOS環境や、完全に分離された環境が必要な場合に使用されます。
要するに、Dockerはアプリケーションの実行を軽量かつ迅速にすることを目的としていますが、仮想マシンは完全に分離された環境を提供することを目的としています。
仮想環境(CentOS 8)を立ててようやくできた
% scp exec_me admin@192.168.11.74:/home/admin
admin@192.168.11.74's password:
exec_me 100% 8556 6.3MB/s 00:00
% ssh admin@192.168.11.74
admin@192.168.11.74's password:
[admin@localhost ~]$ chmod +x exec_me
[admin@localhost ~]$ ./exec_me
cpaw{Do_you_know_ELF_file?}
ここまで90分かかりました。たかがこの問題だけでめちゃくちゃ時間かかりましたが、新たな勉強になりました。
まとめ
- いままでコピペでほぼなんとかなっていた、DockerとVM、アーキテクチャの違いを少し理解できた
- 結局解くのに120分かかった(爆)
コメント