1. はじめに
この記事では、CpawCTF の Level1 の問題全問の解説を行う。
2. Q1.[Misc] Test Problem
問題:Q1.[Misc] Test Problem
出典:https://ctf.cpaw.site/questions.php?qnum=1
問題文:この問題の答え(FLAG)は、cpaw{this_is_Cpaw_CTF} です。下の入力欄にFLAGを入力してSubmitボタンを押して、答えを送信しましょう!
この問題は、与えられた Flag をそのまま打ち込めばよい。
3. Q6.[Crypto] Classical Cipher
問題:Q6.[Crypto] Classical Cipher
出典:https://ctf.cpaw.site/questions.php?qnum=6
問題文:暗号には大きく分けて、古典暗号と現代暗号の2種類があります。特に古典暗号では、古代ローマの軍事的指導者ガイウス・ユリウス・カエサル(英語読みでシーザー)が初めて使ったことから、名称がついたシーザー暗号が有名です。これは3文字分アルファベットをずらすという単一換字式暗号の一つです。次の暗号文は、このシーザー暗号を用いて暗号化しました。暗号文を解読してフラグを手にいれましょう。
暗号文: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}
この問題は、英字を ASCII コードに変換をし、暗号化時に3文字分ずらされた各英字を3シフトさせて復元することで解読することができる。
このとき、アルファベットは26文字で構成されているため、mod 26 をとって循環させる。
Python のコードを次に示す。
# 暗号化されたテキスト
cipher = "fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}"
# 平文
plain = []
for char in cipher:
if char.isalpha():
# 大文字と小文字を区別して処理
base = ord('A') if char.isupper() else ord('a')
plain.append(chr((ord(char) - base - 3) % 26 + base))
else:
plain.append(char)
print("".join(plain)) # 結合して出力
4. Q7.[Reversing] Can you execute ?
問題:Q7.[Reversing] Can you execute ?
出典:https://ctf.cpaw.site/questions.php?qnum=7
問題文:拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、どうしたら実行出来るのだろうか。この場合、UnixやLinuxのとあるコマンドを使ってファイルの種類を調べて、適切なOSで実行するのが一般的らしいが…
問題ファイル: exec_me
問題ファイルをダウンロードして、file コマンドを実行して中身を調べる。
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
出力から、このファイルは ELF 形式であることがわかる。ELF は、LinuxやUnix系のOSで使われる標準的な実行形式である。
Linux 環境で次のコマンドを実行する。
./exec_me
実行した結果、flag を得ることができる。
5. Q8.[Misc] Can you open this file ?
問題:Q8.[Misc] Can you open this file ?
出典:https://ctf.cpaw.site/questions.php?qnum=8
問題文:このファイルを開きたいが拡張子がないので、どのような種類のファイルで、どのアプリケーションで開けば良いかわからない。どうにかして、この拡張子がないこのファイルの種類を特定し、どのアプリケーションで開くか調べてくれ。
問題ファイル: open_me
はじめにこのファイルをダウンロードし、次の Linux コマンドでファイルの内容を確認する。
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
出力を読むと、次のことがわかる。
| 項目 | 内容 |
|---|---|
| ファイル形式 | Composite Document File V2 Document |
| 作成アプリ | Microsoft Office Word |
| 文字コード | Code page 932 (Shift_JIS) |
| OS | Windows |
| 作成日時 | 2015年10月12日 |
| ページ数 | 1ページ |
作成したアプリから Word ファイル(拡張子は doc)であると推定できる。次のコマンドで拡張子を付与する。
mv open_me open_me.doc
そのあと、open_me.doc を Microsoft Word で開けば、求める flag を入手することができる。
6. Q9.[Web] HTML Page
問題:Q9.[Web] HTML Page
出典:https://ctf.cpaw.site/questions.php?qnum=9
問題文:HTML(Hyper Text Markup Language)は、Webサイトを記述するための言語です。ページに表示されている部分以外にも、ページをより良くみせるためのデータが含まれています。
次のWebサイトからフラグを探して下さい。
http://q9.ctf.cpaw.site
この問題は、Webページの HTML ソース内に含まれるメタデータ を確認することで解ける。Chrome を使用している場合は、ctrl + u でページのHTMLを表示できる。
ソースを確認すると、<head> 内の <meta> タグに flag が埋め込まれているため、それを提出することで正解となる。
7. Q10.[Forensics] River
問題:Q10.[Forensics] River
出典:https://ctf.cpaw.site/questions.php?qnum=10
問題文:JPEGという画像ファイルのフォーマットでは、撮影時の日時、使われたカメラ、位置情報など様々な情報(Exif情報)が付加されることがあるらしい。この情報から、写真に写っている川の名前を特定して欲しい。
問題ファイル: river.jpgFLAGの形式は、"cpaw{river_name}"
例:隅田川 → cpaw{sumidagawa}
この問題は ExifTool を使って、写真内のメタデータを解析する。
ExifTool をダウンロードしたあと、次のコマンドを使って、メタデータを解析する。
exiftool river.jpg
出力結果から、埋め込まれた GPS 情報を取得する。
GPS Latitude : 31 deg 35' 2.76" N
GPS Longitude : 130 deg 32' 51.73" E
GPS Position : 31 deg 35' 2.76" N, 130 deg 32' 51.73" E
このGPS情報はDMS形式であるので、DEG形式に変換を行い、その結果を Google Maps で確認する。
8. Q11.[Network]pcap
問題:Q11.[Network]pcap
出典:https://ctf.cpaw.site/questions.php?qnum=11
問題文:ネットワークを流れているデータはパケットというデータの塊です。
それを保存したのがpcapファイルです。
pcapファイルを開いて、ネットワークにふれてみましょう!
pcapファイル
pcap ファイルとは、ネットワーク上を流れるデータパケットを記録したファイル形式である。
この形式のファイルには、通信の送受信データがすべてパケット単位で格納されており、ネットワーク通信の内容を後から解析することができる。
このファイルを Wireshark を使って解析する。
ダウンロードした pcap ファイルを Wireshark で開くと、各通信パケットの詳細情報が閲覧できる。その中に、flag があるので、これを入力することで問題の正解を得ることができる。
9. Q12.[Crypto]HashHashHash!
問題:Q12.[Crypto]HashHashHash!
出典:https://ctf.cpaw.site/questions.php?qnum=12
問題文:ハッシュ関数とは、値を入れたら絶対にもとに戻せないハッシュ値と呼ばれる値が返ってくる関数です。
ですが、レインボーテーブルなどでいくつかのハッシュ関数は元に戻せてしまう時代になってしまいました。以下のSHA1というハッシュ関数で作られたハッシュ値を元に戻してみてください!(ヒント:googleで検索)
e4c6bced9edff99746401bd077afa92860f83de3
フラグは cpaw{ハッシュを戻した値} です。
SHA-1 はハッシュ関数の一つであるが、衝突耐性に脆弱性が発見されたことから、現在では安全性の観点から使用が非推奨とされている。
この問題では、与えられたハッシュ値を Google で検索すると、SHA-1 Center などのハッシュデータベースサイトが見つかる。そこで照合を行うことで、対応する元の文字列を特定できる。
10. Q14.[PPC]並べ替えろ!
問題:Q14.[PPC]並べ替えろ!
出典:https://ctf.cpaw.site/questions.php?qnum=14
問題文:下にある配列の中身を大きい順に並べ替えて、くっつけてcpaw{並べ替えた後の値}をフラグとして提出してください。例:もし配列{1,5,3,2}っていう配列があったら、大きい順に並べ替えると{5,3,2,1}となります。そして、フラグはcpaw{5321}となります。
同じようにやってみましょう(ただし量が多いので、ソートするプログラムを書いたほうがいいですよ!)
[15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207]
この問題は、降順にソートしてそれをつければいい。
Python コードを次に示す。
nums = [15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207]
nums.sort(reverse=True)
ans = "".join(map(str, nums))
print(f"cpaw{{{ans}}}")
11. 参考資料
[1]. CpawCTF
[2]. PCAPファイルとは?
[3]. Executable and Linkable Format
[4]. ELF ファイルとは
[5]. Wireshark のダウンロードページ
[6]. SHA-1 Center