俺的 Capture The Flag Writeup

Capture The Flag に挑戦したときの記録を自分用にドキュメント化して置いておくだけのブログ。

[CpawCTF] 第三夜: Q7 ファイル種別の特定

Q7.[Reversing] Can you execute ?

CpawCTF Level1 Q7 (通し番号は 7 だけど 第三問目)

以下、問題文

Q7.[Reversing] Can you execute ?

10pt

拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、どうしたら実行出来るのだろうか。 この場合、UnixLinuxのとあるコマンドを使ってファイルの種類を調べて、適切なOSで実行するのが一般的らしいが… 問題ファイル: exec_me

答案

さて今回は、問題文の最後に添付ファイルが置かれており、これを実行してくれ、という内容の問題でした。

ダウンロード

とりあえず、ファイル exec_me (私を実行して) をダウンロードします。

それから、文中にもある通り、このファイルは拡張子がなく、なんのファイルなのかわかりません。

ウィルスの類という可能性もなくはないですが、cpawCTF の規模感と、以前の参加者がそういったことを言っていないことから、そうでないだろうという推測は、とりあえずつきます。

とりあえず、ダウンロード直後の場所で、ファイルエクスプローラからダブルクリックしてみますが... (個人情報的な観点から、普段のダウンロードの中身を隠すため、tmp_dl というフォルダに中身を移動させています。このフォルダは気にしないでください。)

f:id:comeonknowhow:20200516183416p:plain
finder

以下のような Warning が出て、テキストエディタが終了します。

f:id:comeonknowhow:20200516183523p:plain
warning

ファイルの種類を調べる

ここで、再度問題文を見やり「 UnixLinux のとあるコマンドを使ってファイルの種類を調べて」という部分に着目します。

特にこんなコマンドは知らないので、検索します。 ファイルの種類を調べる コマンド [検索] とかで。

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.txtASCII 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 ファイルを知っていますか?」だそうです。 知らないので、調べてみましょう。 あ、もちろん提出してからですけど。

f:id:comeonknowhow:20200516203854p:plain
submit

とりあえず、サクッと submit してきました。

f:id:comeonknowhow:20200516203913p:plain
accepted

ELF ファイルについて

ここ より引用

ELFとは「Executable and Linking Format」の略であり,Red Hatを始めとするLinuxディストリビューションの多くでは標準バイナリ形式として採用されているものだ。

従来までは,「a.out」,「COFF」(Common Object File Format)と呼ばれるバイナリフォーマットが占めていたが,ELFでは動的な共有ライブラリの利用と,C++言語のサポートが容易という利点が挙げられる。

ちょー雑にまとめるなら、「Linux でデフォルト化されている形式のバイナリファイル」ってところでしょうか。

このバイナリファイルを解析したり (バイナリ解析) 、逆コンパイル (逆アセンブル?) したりするという技術もあるらしい。

その辺の知識については、本題から逸れるので、また別の機会までにまとめておきたいなと思います (気持ちだけはある)。

なんか、次回も似たような問題ですね。 実行ではなく、中身を垣間見るのが違いでしょうか。それではまた。

Links

file コマンド

ELF ファイルについて

CpawCTF Q7 について