🕊️

CpawCTF Level1 Writeup

2024/06/29に公開

はじめに

サイト

https://ctf.cpaw.site/index.php

環境

  • macOS
  • M1チップ

Q1.[Misc] Test Problem

問題

この問題の答え(FLAG)は、cpaw{this_is_Cpaw_CTF} です。
下の入力欄にFLAGを入力してSubmitボタンを押して、答えを送信しましょう!

Enjoy CpawCTF!!!!

回答

cpaw{this_is_Cpaw_CTF} を入力してsubmitするだけ.

こんな感じの表示になったらクリア.

Q6.[Crypto] Classical Cipher

問題

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

暗号文: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}

回答

以下の Python ファイル( q6.py )を作成し,出力されたものが答えになります.

q6.py
# 暗号化された文字列
S = "fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}"

# 復号化した文字列を格納するリスト
T = []

# 復号化していく
for s in S:
    # 特殊な文字の時は,復号化の手順を踏まない.
    if s == "{" or s == "}" or s == "_":
        T.append(s)
    # シーザー暗号の復号化は,文字コードを三つずらす.
    else:
        T.append(chr(ord(s) - 3))

# 文字列を出力する.
print(*T, sep="")
実行方法
$ python3 q6.py                       
cpaw{Caesar_cipher_is_classical_cipher}

答えが出てきました.

Q7.[Reversing] Can you execute ?

問題

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

回答

まず, exec_me をクリックしてファイルをダウンロードする.
次に,ダウンロードされたファイルを作業ディレクトリに移動する.
とりあえず,ファイル 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

出力を見た感じ, Linux とかの実行環境であれば実行できそう?
Linux に似ている(筆者がそう思っているだけ) macOS で実行してみよう

実行権限を与えて,実行してみます.

macOS
$ chmod +x exec_me
$ ./exec_me        
zsh: exec format error: ./exec_me

うーむ. macOS では実行できませんでしたね.なので筆者は CentOS の計算機を持っているので,そこにファイルをダウンロードさせ,実行してみました.
では,先ほどと同じ手順で,実行権限を与えて,実行してみます.

Linux
$ chmod +x exec_me
$ ./exec_me        
cpaw{Do_you_know_ELF_file?}

答えが出てきました.

Q8.[Misc] Can you open this file ?

問題

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

回答

まず, open_me をクリックしてファイルをダウンロードする.
次に,ダウンロードされたファイルを作業ディレクトリに移動する.
とりあえず,ファイル exec_me の種類を 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

ほう. Microsoft Office Word という言葉が見えたので, Word.app で開けばいいかもしれませんね.アプリケーションに Microsoft Word.app を指定して,ファイルを開いてみましょう.

$ open -a /Applications/Microsoft\ Word.app open_me

すると,次のような Word ファイルが開かれました.

これで, cpaw{Th1s_f1le_c0uld_be_0p3n3d} という答えが得られました.

Q9.[Web] HTML Page

問題

HTML(Hyper Text Markup Language)は、Webサイトを記述するための言語です。
ページに表示されている部分以外にも、ページをより良くみせるためのデータが含まれています。
次のWebサイトからフラグを探して下さい。
http://q9.ctf.cpaw.site

回答

とりあえず,リンクをクリックしてみましょう.

普通のウェブサイトが見えましたね.とりあえず,ディベロッパーツールを開いてみましょう.ファンクションキーの F12 を押してください.または, Command(⌘) Option(⌥) I を同時に押しても良いです.
すると,次のような画面が出ます.

これでソースコードが見えたのですが, Command(⌘) F を同時に押して,検索をかけます. cpaw{ と検索してみてください.

これで, cpaw{9216ddf84851f15a46662eb04759d2bebacac666} という答えが得られました.

Q10.[Forensics] River

問題

JPEGという画像ファイルのフォーマットでは、撮影時の日時、使われたカメラ、位置情報など様々な情報(Exif情報)が付加されることがあるらしい。
この情報から、写真に写っている川の名前を特定して欲しい。
問題ファイル: river.jpg

FLAGの形式は、"cpaw{river_name}"
例:隅田川 → cpaw{sumidagawa}

回答

とりあえず, river.jpg をクリックして,ファイルをダウンロードする.
そしたら, Exif を解析してくれるウェブサイトにアクセスする.
http://exif-check.org/
アクセスすると,以下のようなページが出る.

そしたら,ファイルを選択をクリックし,先ほどダウンロードした river.jpg を選択する.

次に,チェックする!をクリックすると,次のようなページに変化する.

先ほどダウンロードした画像が表示された.上記の画面で言う画面中央右側にある地図というタブをクリックすると

上記のような表示になる.マップに書いてある情報から川の名前は 甲突川(koutsukigawa)であることがわかる.問題文に書いてあったフラグの形式に従って, cpaw{koutsukigawa} という答えが得られた.

Q11.[Network]pcap

問題

ネットワークを流れているデータはパケットというデータの塊です。
それを保存したのがpcapファイルです。
pcapファイルを開いて、ネットワークにふれてみましょう!
pcapファイル

回答

とりあえず, pcapファイル をクリックして,ファイルをダウンロードしましょう.
network10.pcap というファイルが得られました.
実は, .pcap というファイルは, Wireshark を用いて解析することができます.ダウンロードや使い方をここで説明するには余白が足りないので,各自調べるorGPTしてみてください.
https://www.wireshark.org/download.html

さて, network10.pcapWireshark で開いてみましょう.すると,次の画面のようなものが得られます.

cpaw{gochi_usa_kami} という答えが得られましたね.

Q12.[Crypto]HashHashHash!

問題

ハッシュ関数とは、値を入れたら絶対にもとに戻せないハッシュ値と呼ばれる値が返ってくる関数です。
ですが、レインボーテーブルなどでいくつかのハッシュ関数は元に戻せてしまう時代になってしまいました。
以下のSHA1というハッシュ関数で作られたハッシュ値を元に戻してみてください!(ヒント:googleで検索)

e4c6bced9edff99746401bd077afa92860f83de3

フラグは
cpaw{ハッシュを戻した値}
です。

回答

レインボーテーブルという,元の値とシード値のセットを自分で用意すれば良いのです.今回は,英小・大文字のみを想定し,文字も最大4文字である想定の元で解きました.文字の種類的にも,文字数的にも,厳しい条件ですが,これでも実行は私のPCでは20秒ほどもかかってしまっています.もっと効率の良い方法があるかも.

q12.py
import hashlib

# 逆算したいハッシュ値
TARGET = "e4c6bced9edff99746401bd077afa92860f83de3"

# ハッシュ元として想定される文字.今回は大文字と小文字のみとした.
CHARSET = "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

# 元の文字の長さの最大値.今回は4とした.というか,これがギリギリ
N = 4

# レインボーテーブル
table = {}

# 元の文字の長さ
for i in range(N + 1):
    # 文字を一つずつ変化させていく.
    for j in range(len(CHARSET) ** i):
        # 数値を文字に変換させる.
        s = []
        while j > 0:
            j, mo = divmod(j, len(CHARSET))
            s.append(CHARSET[mo])

        # 元の文字
        text = "".join(s)

        # keyをハッシュ値とし,元の文字をvalueとした.
        table[hashlib.sha1(text.encode()).hexdigest()] = text

# 作成したレインボーテーブルから探索する.
for k, v in table.items():
    if k == TARGET:
        print(v)
        exit()

# みつからなかった時は-1を出力する.
print(-1)
実行方法
$ python3 q12.py
Shal

問題文にあったフラグの形式に従って, cpaw{Shal} という答えが得られました.

Q14.[PPC]並べ替えろ!

問題

下にある配列の中身を大きい順に並べ替えて、くっつけて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 で逆順にするプログラムを組んであげましょう.

q14.py
ls = [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]

ls.sort(reverse=True)

print(*ls, sep="")
実行方法
$ python q14.py      
2112102072011931901881711671601591511501461441431361301211191111101091081051031021009994938785828180777672666360585755545250494642413634333127252420191815141210743210

あとは,フラグの形式に従うことで, cpaw{2112102072011931901881711671601591511501461441431361301211191111101091081051031021009994938785828180777672666360585755545250494642413634333127252420191815141210743210} という答えが得られました.

おわりに

感想

楽しかったbut院試期間中なのに何やってんだろ...

筆者について

https://mattsun-kun-portfolio.vercel.app/

Discussion