[CpawCTF] 第三夜: Q7 ファイル種別の特定
Q7.[Reversing] Can you execute ?
CpawCTF Level1 Q7 (通し番号は 7 だけど 第三問目)
以下、問題文
Q7.[Reversing] Can you execute ?
10pt
拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、どうしたら実行出来るのだろうか。 この場合、UnixやLinuxのとあるコマンドを使ってファイルの種類を調べて、適切なOSで実行するのが一般的らしいが… 問題ファイル: exec_me
答案
さて今回は、問題文の最後に添付ファイルが置かれており、これを実行してくれ、という内容の問題でした。
ダウンロード
とりあえず、ファイル exec_me
(私を実行して) をダウンロードします。
それから、文中にもある通り、このファイルは拡張子がなく、なんのファイルなのかわかりません。
ウィルスの類という可能性もなくはないですが、cpawCTF の規模感と、以前の参加者がそういったことを言っていないことから、そうでないだろうという推測は、とりあえずつきます。
とりあえず、ダウンロード直後の場所で、ファイルエクスプローラからダブルクリックしてみますが... (個人情報的な観点から、普段のダウンロードの中身を隠すため、tmp_dl
というフォルダに中身を移動させています。このフォルダは気にしないでください。)
以下のような Warning
が出て、テキストエディタが終了します。
ファイルの種類を調べる
ここで、再度問題文を見やり「 Unix
や Linux
のとあるコマンドを使ってファイルの種類を調べて」という部分に着目します。
特にこんなコマンドは知らないので、検索します。
ファイルの種類を調べる コマンド [検索]
とかで。
file
コマンド
どうやら file
コマンドというのがあるらしいということがわかりました。
使い方は file [option] {調べたいファイル}
で良さそうです。
例:
とりあえず、わかりやすい例で試してみます。
$ cd ~/Downloads/ $ ls exec_me tmp_dl $ file Usage: file [-bcEhikLlNnprsvzZ0] [-e test] [-f namefile] [-F separator] [-m magicfiles] [-M magicfiles] file... file -C -m magicfiles Try `file --help' for more information. $ echo "Hello world." > hoge.txt $ cat hoge.txt Hello world.
ダウンロード配下に移動し、中身が Hello world.
であるようなテキストファイル hoge.txt
を作ります。
このファイルが何であるか、file
コマンドを用いて調べてみましょう。
$ ls exec_me hoge.txt tmp_dl $ file hoge.txt hoge.txt: ASCII text
一番下の実行結果を見ると、hoge.txt
が ASCII text
ファイルであることがわかりました。
テストとしてはこんなところでしょう。
本題:
早速、exec_me
ファイルの種類を調べてみようと思います。
$ 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
executable
なので実行可能なファイル、さらには BuildID[] = ...
と書いてあることから、バイナリファイルでしょうか。
エディタなどで中身をみても 仕方がなさそうだ、ということがわかりました。
また、x86-64
から、64bit
版の OS
なら実行可能ということでしょうかね。
コアに近い部分は知識が貧弱なので、間違っていたらぜひツッコミをください... m( _ _ )m
ものは試しということで、実行してみましょうか。
$ ./exec_me -bash: ./exec_me: Permission denied
ありゃ。
実行権限がないそうなので、chmod
で変更します。
$ ls -l total 32 -rw-r--r--@ 1 xxxxx staff 8556 5 16 18:25 exec_me -rw-r--r-- 1 xxxxx staff 13 5 16 18:38 hoge.txt drwxr-xr-x X xxxxx staff 288 5 1 18:53 tmp_dl $ chmod 777 exec_me $ ls -l total 32 -rwxrwxrwx@ 1 xxxxx staff 8556 5 16 18:25 exec_me -rw-r--r-- 1 xxxxx staff 13 5 16 18:38 hoge.txt drwxr-xr-x X xxxxx staff 288 5 1 18:53 tmp_dl
再三的に申しておりますが、個人情報的な部分は XXX
で伏せてありますので、悪しからず...
面倒なので 777
に変更しておきました。
さて、怖いもの知らず、いざ実行。
$ ./exec_me -bash: ./exec_me: cannot execute binary file
あら。一筋縄ではいかないみたいです。
もう一度 $ file exec_me
を実行して、結果をよくみて見ると... for GNU/Linux
の文字を見落としていました...。
これってもしかして ( Unix
ベースである) mac ではダメって感じなのでしょうか。
たまたま都合の良いことに、僕が管理している Linux (Ubuntu 18.04)
サーバがあるので、ここに送って実行してみましょう。
(local:Downloads) $ scp ./exec_me user@myserver:~/ (server:~) $ ./exec_me $ ./exec_me cpaw{Do_you_know_ELF_file?}
Flag
っぽいものが得られましたね。
今回は 「ELF
ファイルを知っていますか?」だそうです。
知らないので、調べてみましょう。 あ、もちろん提出してからですけど。
とりあえず、サクッと submit してきました。
ELF ファイルについて
ここ より引用
ELFとは「Executable and Linking Format」の略であり,Red Hatを始めとするLinuxディストリビューションの多くでは標準バイナリ形式として採用されているものだ。
従来までは,「a.out」,「COFF」(Common Object File Format)と呼ばれるバイナリフォーマットが占めていたが,ELFでは動的な共有ライブラリの利用と,C++言語のサポートが容易という利点が挙げられる。
ちょー雑にまとめるなら、「Linux
でデフォルト化されている形式のバイナリファイル」ってところでしょうか。
このバイナリファイルを解析したり (バイナリ解析) 、逆コンパイル (逆アセンブル?) したりするという技術もあるらしい。
その辺の知識については、本題から逸れるので、また別の機会までにまとめておきたいなと思います (気持ちだけはある)。
なんか、次回も似たような問題ですね。 実行ではなく、中身を垣間見るのが違いでしょうか。それではまた。