目次
- はじめに
- misc
- OMG
- rev
- assignment
- crypto
- derangment
- おわりに
はじめに
初CTF writte upです.
今回はIERAE CTF 2024に参加しました.
IERAE CTF 2024
CTFを始めて1年目のぺーぺーなのでwarmupの3問しか解けなかったのですが,解けた問題をまとめました.
順位はソロ参加で224チーム中113位でした.
misc
OMG [warmup]
Oh my God!!!My browser history has been hijacked!
オーマイガー!!!ブラウザの履歴が乗っ取られてしまった!
Challenge: http://[host]:[port]
Challengeのページにアクセスすると,下のようなページが表示されます.
指示に従ってブラウザのバックボタンを33回押すとflagが表示されます.
詳しい原理は分かりませんが,アクセスした際にブラウザの履歴が33回分のページになっているので,バックボタンを押すことでflagが表示されると思われます.
flag
IERAE{Tr3ndy_4ds.LOL}
rev
assignment [warmup]
Assignment is the root of everything in procedural programs.
ここでは調査対象のバイナリファイルが渡されるので,静的解析ツールGhidraを使って解析します.
解析した結果の中からmain関数の中身を確認すると,flagという配列に整数値が格納されていることが分かります.
配列番号順に直して,ASCIIコードに変換するとflagが表示されます.
flag
IERAE{s0me_r4nd0m_str1ng_5a9354c}
crypto
derangment [warmup]
I've made a secret magic string, perfectly encrypted!
nc [ip address] [port]
サーバ側の処理としては,初期化として小文字アルファベットと数字と記号を15文字重複なく選び,ランダムに並べ替えたものを用意し答えとします.セッションを繋ぐたびに答えは変わることに注意です.ユーザ側はヒントを得ることができます.ヒントは答えをシャッフルしたものが出力されます.ここで,シャッフルする際には答えと同じ位置に文字がこないようにしてあります.ヒントを得られる回数は最大で299回です.ヒントを頼りに答えを求めて,合っているとフラグが出力されます.
解法としては,299回のヒントを使って,文字が出現しなかった位置を特定し,その位置に文字を入れることで答えを求めます.これを手入力で行うとセッションが切れてしまうため,pythonスクリプトを使って自動化します.
from pwn import *
import string
import tqdm # 進捗状況が見れる
# 接続
io = remote('104.199.135.28', 55555)
# ヒントを取得して、hintsに保存
hints = []
for i in tqdm.tqdm(range(299)):
io.sendlineafter('> ', '1')
hints.append(io.recvline().decode().strip().split(' ')[1])
# hints[0][i]が何番目に出てくるのかを調べる
index = [[0 for _ in range(15)] for _ in range(15)]
for i in tqdm.tqdm(range(15)):
c = hints[0][i]
for hint in hints:
for j in range(len(hint)):
if hint[j] == c:
index[i][j] = 1
break
ans = ['' for _ in range(15)]
for i in tqdm.tqdm(range(15)):
for j in range(15):
if index[i][j] == 0:
ans[j] += hints[0][i]
break
result = ''.join(ans)
if result not in hints and len(result) == 15:
# 2を入力してを答え入力
io.sendlineafter('> ', '2')
io.sendlineafter('> ', result)
# FLAGを取得
print(io.recvline().decode())
print(io.recvline().decode())
else:
print("not found")
# 接続を切断
io.close()
flag
IERAE{th3r35_n0_5uch_th!ng_45_p3rf3ct_3ncrypt!0n}
おわりに
今回はIERAE CTF 2024に参加しました.
24時間ぶっ続けでCTFに取り組んだわけではないので十分な成果が出なかったのですが,そもそもの実力不足なので過去問を解いて解いて解きまくろうと思います.
分野としては,暗号の研究をしているのでcryptoの問題を中心に勉強して無双できる日が来るように頑張ります.
あと,IERAE NIGHTにも参加します.
ホワイトハッカーの方々に直接お話を聞けるので楽しみです.
IERAE NIGHT