俺的 Capture The Flag Writeup

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

[CpawCTF] 第四夜: ファイルの中身は何だろう?

Q8.[Misc] Can you open this file ?

CpawCTF Level1 Q8 (通し番号は 8 だけど 第四問目)

以下、問題文

Q8.[Misc] Can you open this file ?

10pt

このファイルを開きたいが拡張子がないので、どのような種類のファイルで、どのアプリケーションで開けば良いかわからない。 どうにかして、この拡張子がないこのファイルの種類を特定し、どのアプリケーションで開くか調べてくれ。

問題ファイル: open_me

答案

前回問題に似たような問題ですね。

ファイルに拡張子がないので、何のファイルなのか不明。 これを特定して、適切なプロセスを経ることで Flag ゲットの問題。

ただ、今回は実行ファイルではなく、なんらかのアプリケーションで開けるファイルだそうです。

ひとまず実行

f:id:comeonknowhow:20200517120707p:plain
finder

ダウンロード直後の場所で開こうとすると、microsoft word が立ち上がりました。

ちゃんと開けてしまった...

f:id:comeonknowhow:20200517120300p:plain
word

真ん中に Flag らしき文字列が書かれた画像が貼られており、 cpaw{Th1s_f1le_c0uld_be_0p3n3d} と書かれていますね。

This file could be opened - このファイルは開かれました。

file コマンドを用いた調査

事後処理ですが、前回学んだ file コマンドでも調べてみましょう。

$ file open_me
open_me: Composite Document File V2 Document, Little Endian, Os: Windows, Version 10.0, Code page: 932, Author: �v��, Template: Normal.dotm, Last Saved By: �v��, Revision Number: 1, Name of Creating Application: Microsoft Office Word, Total Editing Time: 28:00, Create Time/Date: Mon Oct 12 04:27:00 2015, Last Saved Time/Date: Mon Oct 12 04:55:00 2015, Number of Pages: 1, Number of Words: 3, Number of Characters: 23, Security: 0

この結果により open_me というファイルが

  • Composite Document File (複合ドキュメントファイル) 」であること
  • Os: Windows に対応しているということ
  • Name of Creating Application: Microsoft Office Word より、microsoft officeword アプリケーションにより作られているということ

などがわかりました。

今回は CTF という限定的な状況なので、セキュリティ的な問題をあまり気にする必要がなく (本当は気にするべき) ネットワークからダウンロードしたファイルを無防備にもそのまま実行、ということをしていますが、実際にはそんなことはするべきではなく、先にファイルの種別や、できれば中身の調査を行なってから、マルウェアではない、などの安全性を担保した上でファイルを開いたり、実行したりするべきなのでしょう。

もしかして、セキュリティに知識のある方がみたら、ゾッとするようなことをしているかもしれません、私...

submit

f:id:comeonknowhow:20200517120331p:plain
submit

f:id:comeonknowhow:20200517120347p:plain
accepted

ということで、今回は割とサクっと終了です。

次回は HTML のファイル? ページ? から 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 について

[CpawCTF] 第二夜: Q6 古典的暗号

Q6.[Crypto] Classical Cipher

CpawCTF Level1 Q6 (通し番号は 6 だけど 第二問目)

以下、問題文

Q6.[Crypto] Classical Cipher

10pt

暗号には大きく分けて、古典暗号と現代暗号の2種類があります。
特に古典暗号では、古代ローマの軍事的指導者ガイウス・ユリウス・カエサル(英語読みでシーザー)が初めて使ったことから、名称がついたシーザー暗号が有名です。これは3文字分アルファベットをずらすという単一換字式暗号の一つです。次の暗号文は、このシーザー暗号を用いて暗号化しました。暗号文を解読してフラグを手にいれましょう。

暗号文: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}

答案

問題文を通読すると、以下の情報が手に入りました。

  • 暗号文: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}
  • この暗号文は、「シーザー暗号」を用いて暗号化しているということ。
  • 「シーザー暗号」は「3文字分アルファベットをずらす」という単一換字式暗号により暗号化を行なっているということ。

さて、暗号文を手作業で (頭の中でカウントして) 3文字分だけずらしても良いと思いますが、一応プログラムを書く技能を持っているので、ウォーミング・アップがてら、プログラムを組んでみましょう。

復号プログラム

#include <stdio.h>
#include <string.h>

int main() {

  char cip[] = "fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}";
  int l;

  l = strlen(cip);

  printf("Cipher: %s (length: %d)\n", cip, l);

  for (int i=0; i<l; i++) {
    if ( ('A' <= cip[i] && cip[i] <= 'Z') || ('a' <= cip[i] && cip[i] <= 'z') ) {
      //cip[i] += 3;
      cip[i] -= 3;
    }
  }

  l = strlen(cip);
  printf("Decryption: %s (length: %d)\n", cip, l);

  return 0;
}

一応、解説がてら、以下にメモを残しておきます。

標準入出力を扱うため stdio.h を、文字列を扱いやすくするため string.hincludeしています。

cip[] = "暗号文" の部分は文字列リテラルを用いて、暗号文を変数として定義しています。

数えるのが面倒なので、配列のサイズは省略 (自動決定)

文字列リテラルの扱いに関しては こちら を参考にさせていただきました。

そしてデバッグのために、保険で文字数を strlen() 関数を使ってカウントしておきます。( 参考 )

for 文 により、cip の各文字に対して処理を行います。

その最中、if 文 により「アルファベットに対してのみ」3文字ズラす対象とするようにし、最後に復号した暗号を出力します。

さて、アルファベットの部分を捉えることができたら、これを 3文字だけずらします。

最初、3文字後ろ ( cip[i] += 3 )に動かしていたのですが、意味がわからない文が出てきまして、試しに3文字前 ( cip[i] -= 3 ) に動かしたら、以下の意味を持つような文字列が得られました。

後から気軽にやり直せるのは、プログラムのいいところだと思います。

Cipher: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu} (length: 39)
Decryption: cpaw{Caesar_cipher_is_classical_cipher} (length: 39)

cpaw{Caesar_cipher_is_classical_cipher} がどうやら Flag のようです。

「シーザー暗号は古典暗号」の意

ちなみに Cipher は「暗号」, Decryption は「復号」です。

submit

Flag をゲットしたので、cpawctf のサイトに提出します。

f:id:comeonknowhow:20200515001014p:plain
submit_flag

無事、クリアできたようです。

f:id:comeonknowhow:20200515001044p:plain
accepted

どうでも良いことなのですが

f:id:comeonknowhow:20200515001146p:plain
number

前回の Test problem は 7000番台でしたよね。 今回は 5900 近くということで、1000人くらいは登録して、テストだけして、って感じなのでしょうか。

私もよく三日坊主するので、お気持ちはよくわかります。(早すぎる共感)

まとめ

久しぶりに C言語でプログラムを (しかも文字列を扱う) 書いたので、思ったよりコストがかかってしまいました。

いい勉強になったと思います。

研究の分野柄 python を書くことが多いのですが、C を書くと型の硬さや、ビルトインの関数, ヘッダの include などにおっとっととなりますね。

ところで私は、暗号といえば、サマーウォーズを思い出します。

「骨折り損のくたびれもうけ」でしたっけ。暗号を考える人はとてもユーモアに飛んでいると思います。

次の問題は、拡張子の特定のようです。それでは、また。

Links

別解

暗号文を格納した変数 cip のうち、アルファベットを捉える if 文 に関して、以下のような書き方をしても動作することを確認しています。

あらかじめ文字列の中に出てくるアルファベット以外を、自分の目でみて、除外する方針です。

  for (int i=0; i<l; i++) {
    if ( (cip[i] == '{') || (cip[i] == '}') || (cip[i] == '_')){
      continue;
    } else {
      //cip[i] += 3;
      cip[i] -= 3;
    }

[CpawCTF] 第一夜: 登録からQ1

CpawCTF に登録 => Test problem の提出

[TL;DR] CTF を始めるモチベーション

前から興味のあった Capture The Flag (以下, ctf) に挑戦してみようと思う。

モチベーションとしては、2020年の春に世間を騒がせている新型ウィルスの影響により大学が封鎖されており、研究室に入れないのだけど、何もしないでこの期間を終えてしまうには勿体無いということがまずある。何より、課題以外はほぼ暇ですし。

また、学部の4年生の時に、研究室の AI サーバの構築を任され、色々触って、Linux の使い方などに関して一通りの知識があると思っているのだけど、実務で扱っているエンジニアよりはもちろん軟弱だし、仕事として使えるほどのスキルまでは持っていないと思う。

そういった背景から、自分がどの程度なのかが知りたい、さらに足りない知識をつけたいという点と、研究室のサーバの管理を任されている役柄セキュリティに関してはもっと知らないといかんな...という余計な責任感を持っている点から、ctf への挑戦をば。

CTF を始めよう。

いくつかサービスがあるらしいので、 まずは ctf [検索] して大枠を掴む。

CTF初心者が考えるCTF入門 を参考にさせていただきました。 曰く

CTF初心者はksnctfから入ると自信なくすので、cpawCTFから入ることをおすすめしたい(・ω・;) 僕はそれで諦めかけたので・・・・

とのこと。

それぞれのサイトを見に行ってみたが、どうやらこの方のご意見は正しいと見える。

CpawCTF に登録

ということで、早速 Cpawctf していこうと思う。

ところで、なんて読むんでしょうこれ。

top page はこんな感じで「問題解くなら login してね」という仕様らしい。

f:id:comeonknowhow:20200514132852p:plain
cpawctf_toppage

初回参加者の登録は、右上の赤四角に示した部分をクリックし

  • screenName (参加者として表示される名前)
  • userID
  • Password (確認用と合わせて 2回)

を入力して登録できる。メアドとか特にいらないっぽい。

ちなみに2回目以降、login をする場合は、右上の赤四角のもう1つ右にある loginscreenNamePassword を入力することで、登録ユーザとして login できる。

userID じゃないんだ..?

ログインすると、画面は以下のような感じに変わる。

f:id:comeonknowhow:20200514133340p:plain
cpawctf_loginedpage

Q1.[Misc] Test Problem

動作確認がてら、Q1.[Misc] Test Problemの問題を解いてみる。

f:id:comeonknowhow:20200514133718p:plain
cpawctf_q1

問題文に flag と呼ばれるキーワードが表示されている。 今回は cpaw{this_is_Cpaw_CTF} がそうだ。

これを下にある (もう入力してしまったのでない... 本当は Rank Username の列の上にあるはず) 入力欄にそのまま入力することで、Q1 はクリアとなる。

余計なことだが、ちゃんと私の名前が回答者の表にある。

f:id:comeonknowhow:20200514134915p:plain
q1_myname

CTF は何をするものなのか

cpawctf のトップページ にある「CTFは初めてですか?一度こちらを参考にしてください!」というリンク が詳しいし、CTF に関しては先人の方々がわかりやすく解説してくださっているので、ここではあまり深く触れない。

強いて簡単にいえば、 なんらかの方法で隠されている Flag という「キーワード」を入手して、サイトに提出する。 その Flag が正しければ (運営の用意したものと一致していれば) ゲームクリアとなる「宝探しゲーム」だと思うとわかりやすいのではないかと思う。

さて、今日は動作確認に終わったがここまで。 次の問題をチラッとみると、どうやら暗号解析のようです。

Links:

一定期間中に開催される CTF

ctf watcher (?)

参考: