[CpawCTF] 第四夜: ファイルの中身は何だろう?
Q8.[Misc] Can you open this file ?
CpawCTF Level1 Q8 (通し番号は 8 だけど 第四問目)
以下、問題文
Q8.[Misc] Can you open this file ?
10pt
このファイルを開きたいが拡張子がないので、どのような種類のファイルで、どのアプリケーションで開けば良いかわからない。 どうにかして、この拡張子がないこのファイルの種類を特定し、どのアプリケーションで開くか調べてくれ。
問題ファイル: open_me
答案
前回問題に似たような問題ですね。
ファイルに拡張子がないので、何のファイルなのか不明。
これを特定して、適切なプロセスを経ることで Flag
ゲットの問題。
ただ、今回は実行ファイルではなく、なんらかのアプリケーションで開けるファイルだそうです。
ひとまず実行
ダウンロード直後の場所で開こうとすると、microsoft 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 office
のword
アプリケーションにより作られているということ
などがわかりました。
今回は CTF
という限定的な状況なので、セキュリティ的な問題をあまり気にする必要がなく (本当は気にするべき) ネットワークからダウンロードしたファイルを無防備にもそのまま実行、ということをしていますが、実際にはそんなことはするべきではなく、先にファイルの種別や、できれば中身の調査を行なってから、マルウェアではない、などの安全性を担保した上でファイルを開いたり、実行したりするべきなのでしょう。
もしかして、セキュリティに知識のある方がみたら、ゾッとするようなことをしているかもしれません、私...
submit
ということで、今回は割とサクっと終了です。
次回は HTML
のファイル? ページ? から Flag
を見つける問題のようです。では。
[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
でデフォルト化されている形式のバイナリファイル」ってところでしょうか。
このバイナリファイルを解析したり (バイナリ解析) 、逆コンパイル (逆アセンブル?) したりするという技術もあるらしい。
その辺の知識については、本題から逸れるので、また別の機会までにまとめておきたいなと思います (気持ちだけはある)。
なんか、次回も似たような問題ですね。 実行ではなく、中身を垣間見るのが違いでしょうか。それではまた。
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.h
を include
しています。
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 のサイトに提出します。
無事、クリアできたようです。
どうでも良いことなのですが
前回の 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 してね」という仕様らしい。
初回参加者の登録は、右上の赤四角に示した部分をクリックし
- screenName (参加者として表示される名前)
- userID
- Password (確認用と合わせて 2回)
を入力して登録できる。メアドとか特にいらないっぽい。
ちなみに2回目以降、login をする場合は、右上の赤四角のもう1つ右にある login
に screenName
と Password
を入力することで、登録ユーザとして login できる。
userID
じゃないんだ..?
ログインすると、画面は以下のような感じに変わる。
Q1.[Misc] Test Problem
動作確認がてら、Q1.[Misc] Test Problemの問題を解いてみる。
問題文に flag
と呼ばれるキーワードが表示されている。
今回は cpaw{this_is_Cpaw_CTF}
がそうだ。
これを下にある (もう入力してしまったのでない... 本当は Rank Username の列の上にあるはず) 入力欄にそのまま入力することで、Q1 はクリアとなる。
余計なことだが、ちゃんと私の名前が回答者の表にある。
CTF は何をするものなのか
cpawctf のトップページ にある「CTFは初めてですか?一度こちらを参考にしてください!」というリンク が詳しいし、CTF に関しては先人の方々がわかりやすく解説してくださっているので、ここではあまり深く触れない。
強いて簡単にいえば、
なんらかの方法で隠されている Flag
という「キーワード」を入手して、サイトに提出する。
その Flag
が正しければ (運営の用意したものと一致していれば) ゲームクリアとなる「宝探しゲーム」だと思うとわかりやすいのではないかと思う。
さて、今日は動作確認に終わったがここまで。 次の問題をチラッとみると、どうやら暗号解析のようです。
Links:
- CTF サイトまとめ
CTF サービス
- cpawctf
- ksnctf
- akictf
一定期間中に開催される CTF
- SECCON CTF
- LepusCTF
MMA CTF