今回は、CpawCTF の Writeup について、セキュリティの学習記録として記載する。
Level 1
Q1.[Misc] Test Problem
問題文に記載のフラグを提出する。
Q6.[Crypto] Classical Cipher
シーザー暗号を使った問題。
cpawが現れるように3文字シフトした文字列を提出。
CyberChefの「ROT13」を使用することで出力することが可能。
#!/usr/bin/env python3
def caesar_decrypt(ciphertext, shift=None):
"""
シーザー暗号を解読する関数
引数:
ciphertext (str): 解読する暗号文
shift (int, optional): シフト量(指定しない場合は全シフトを試す)
戻り値:
list: (シフト量, 解読結果) のタプルのリスト
"""
results = []
# シフト量が指定されていない場合は全シフト(0-25)を試す
shifts = [shift] if shift is not None else range(26)
for s in shifts:
plaintext = ""
for char in ciphertext:
if char.isalpha():
# アルファベットの場合のみシフトを適用
ascii_offset = ord('A') if char.isupper() else ord('a')
# シフト後の文字を計算(26で割った余りを使用)
decrypted_char = chr((ord(char) - ascii_offset - s) % 26 + ascii_offset)
plaintext += decrypted_char
else:
# 非アルファベット文字はそのまま
plaintext += char
results.append((s, plaintext))
return results
def main():
print("シーザー暗号解読ツール")
print("=" * 30)
# ユーザーから暗号文を入力
ciphertext = input("解読する暗号文を入力してください: ")
# シフト量の入力(オプション)
shift_input = input("シフト量を入力してください(空白の場合は全シフトを試します): ")
if shift_input.strip():
try:
shift = int(shift_input)
results = caesar_decrypt(ciphertext, shift)
except ValueError:
print("シフト量は整数で入力してください。全シフトを試します。")
results = caesar_decrypt(ciphertext)
else:
results = caesar_decrypt(ciphertext)
# 結果の表示
print("\n解読結果:")
print("-" * 30)
for shift, plaintext in results:
print(f"シフト量 {shift}: {plaintext}")
if __name__ == "__main__":
main()
Q7.[Reversing] Can you execute ?
拡張子がないファイルについては、まず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 strippedELF ファイルのようなので、そのまま実行します。(実行権限がない場合は、chmodコマンドで権限付与)
◼︎コマンド
./exec_me出てきたフラグを提出。
※筆者はmacosのターミナルで、コマンドラインシェルとして zsh を使用していたため、実行できず。仮想環境ツールなどを使用する必要あり。
Q8.[Misc] Can you open this file ?
Q7同様に、まずはファイルの種類を確認。
◼︎コマンド
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どうやらWordで作成されたファイルのようなので、そのまま開いて出てきたフラグを提出。
※Wordがない場合は、Googleドキュメントでも中身を確認することができた。
Q9.[Web] HTML Page
HTMLに関する問題。
Chromeのデベロッパーツールでページソースを確認。
meta name=”description” にフラグが記載されていた。
Q10.[Forensics] River
画像から情報を読み取る問題。
写真に写っている川の名前を特定する必要があるため、とりあえずGoogle画像検索したら同じような画像が出てきた。
川の名前は特定できたので、フォーマットに従って提出。
※検索汚染されているような状態なので、本来であればEXIFファイルの位置情報から特定するのが正攻法かと思われる。exif情報表示ツールを使用。
Q11.[Network]pcap
pcapファイルを解析する問題。
pcap ファイルの詳細は以下のサイトを参照。

pcap ファイルは、Wireshark などのツールで解析できる。
Wireshark のダウンロードサイトは以下の通り。

Wireshark で pcap ファイルを読み込むと、解析結果にフラグが記載されていた。
Q12.[Crypto]HashHashHash!
ハッシュ関数の問題。
SHA-1は、任意の長さのデータから、常に固定長の160ビットのハッシュ値を生成する「一方通行」の関数。
基本的にハッシュ化されたデータから元のデータを復元することは困難だが、レインボーテーブルと呼ばれる事前に計算されたハッシュ値と元のパスワードの組み合わせを保存したテーブルがネット上にあるので、頻出の単語などは復元できてしまう。
今回は以下のサイトを活用して、デコードした。
Q14.[PPC]並べ替えろ!
配列をソートする問題。
今回は、Pythonで実装した。
#!/usr/bin/env python3
input_array = [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]
# 配列を降順に並べ替え
sorted_array = sorted(input_array, reverse=True)
# 並べ替えた配列の要素を連結
s = ''.join(str(x) for x in sorted_array)
# フラグ形式で表示
flag = f"cpaw{{{s}}}"
print(flag)
Level 2
Q13.[Stego]隠されたフラグ
モールス信号の問題。
以下のサイトで、復号できる。

Q15.[Web] Redirect
リダイレクトに関する問題。
Chrome のディベロッパーツールで「Network」を確認するとフラグが記載されている。
Q16.[Network+Forensic]HTTP Traffic
パケットキャプチャファイルを解析する問題。
pcap ファイルを WireShark で開き、通信ファイルを復元。
「ファイル」→「オブジェクトをエクスポート」→「HTTP」
network100(1) というファイルに html 拡張子をつけブラウザで開く。
css や js などはパスの指定に合うように、フォルダ配下に格納してやると正常に動作。
Q17.[Recon]Who am I ?
Twitter の投稿内容から答えを導く問題。
「@porisuteru スペシャルフォース2」などで検索。
Q18.[Forensic]leaf in forest
とりあえずファイルの情報を確認。
$ file misc100
misc100: pcap capture file, microsecond ts (little-endian) - version 0.0 (linktype#1768711542, capture length 1869357413)pcapファイルのようだが、Wiresharkで開けず、、、
とりあえず strings コマンド中身を見てみると、大量の “lovelive!” の文字が確認できる。
所々別の文字が見られたので、”lovelive!” の文字を取り除いてみる。
$ strings misc100 | sed -e 's/[lovelive!]//g'
CCCPPPAAAWWW{{{MMMGGGRRREEEPPP}}}3文字ずつ同じ文字が繰り返されているようなので、フォーマットに合わせて提出。
Q19.[Misc]Image!
とりあえずファイル情報を確認。
$ file misc100.zip
misc100.zip: OpenDocument DrawingOpenDocument形式のファイルのようだ。
Word で開くと、フラグが記載されている。
Q20.[Crypto]Block Cipher
ソースコードを確認すると、引数に暗号文と数字を入れるとフラグが出てくるようである。
数字分先の文字と並べ替えているようなプログラムとなっているので、大文字のYを先頭に持ってくるために引数を 4 とするとフラグになる。



コメント