この記事の内容
CPCTFという初心者向けのCTFが開催されると聞いて参加してみました。この記事はそのwriteupです。
今回はCTFらしい問題を解きたかったのでPPC(いわゆる競プロ的な問題)は解いてません。
Crypto
暗号に関する問題
My own language
問題
Ya! Lxi zyq etxn sawo rtooxmto? Metxs! Sawo wo x pwin yb owrugt oqcoswsqswyi lwuate saxs etugxlto x gtsste dwsa ysate gtsste. Sat Lxtoxe lwuate, yit yb sat bxryqo oqcoswsqswyi lwuateo, axo ctti wi qot owilt sat swrt yb sat xilwtis Eyrxi Truwet. sat bgxm wo atet. LULSB{dtglyrt_sy_lezusy_dyegn}.
解答
LULSB
がCPCTF
であることに注目すると、LがCに、UがPに対応しているのでABC順をずらした暗号ではないことがわかります。もとの文章が英語であると仮定すれば、語中のxがaに対応するとわかるのでLxi
はCan
であると推測できます。Lxi zyq etxn sawo rtooxmto?
は疑問文で文脈からCan you read this...
とすると整合します。このように英語らしさと文脈を突き合わせると答えがCPCTF{welcome_to_crypto_world}
であるとわかります。
RSA warmup
問題
RSA暗号の $c,e,N$ が $c=810, e=5, N=415411$ と与えられるので平文 $m$ を求める。
解答
まず $N$ が小さいので素数 $p,q$ が求まります。 $d$ は $\bmod (p-1)(q-1)$ において $de \equiv 1$ を満たす数であり、これを用いて $m = c^d \pmod n$と計算すれば復号できます。この値は愚直に計算すると爆発してしまいますが、pythonのpow関数の第3引数に$n$を入れることで簡単に計算できます。
xxorxx
問題
text[i] = a ^ ((b ^ text[i]) ^ a) ^ b ^ a
を100回繰り返すことで暗号化する。ただしa,b
は1から32の間の整数を繰り返しのたびに計算される。
解答
xorはa^b^b==a
というように同じ数を2回xorすると演算前のものと等しくなる性質を持つので右辺はtext[i]^a
となります。また、xorはビットごとの演算で繰り上がりが存在しないので平文と1から32の間の整数を一つxorしたものが暗号文になります。暗号文と1から32の整数をxorしてCPCTFから始まるものが答えです。
Forensics
sunset
問題
画像が与えられている
解答
画像には撮影時の日時や位置情報、カメラや編集ソフトの設定などを含むExifと呼ばれるメタデータがつけられています。これをexiftool flag.jpg
コマンドで表示するとComment : CPCTF{3x1f_inf0_15_us3fu1}
が見つかります。
Misc
その他の問題
Mellon
問題
トップページ下にある暗号文とMACHINE TYPE : Wehrmacht / Luftwaffe 3 rotorsなどの情報
..-. --.. .... --. -..- .-.. --. . .--. .- .-.. .-.. -.-- ..- - -... --. ..-. .-- -.-- .. .--. -.-. .-. --- - .-.. -.-- .-. .---
解答
暗号文はモールス信号で書かれていると推測できるので、変換するとFZHGXLGEPALLYUTBGFWYIPCROTLYRJ
となります。また、Wehrmacht / Luftwaffe 3 rotorsで検索するとエニグマのソルバーが出てくるので変換するとREQUESTGETMETHODFRIENDANDENTER
となります。GETメソッドでfriendとリクエストしてエンターせよ、の通り、アドレスバーにcpctf.space/friend
を入力すると解答が得られます。
This is Flag!!
問題
wehurtasit
解答
問題文を選択してみると、選択のされ方が不自然であることに気づきます。デベロッパーツールで見ると、Êe
(Right-to-Left Override)という文字の向きを右向きに変更する制御文字が使われています。もとの順番はwehurtasit
となっていることが確認でき、これが答えです。
OSINT
Welcome to OSINT! 1
画像が与えられているので、Google画像検索で検索すると、解答の書かれたブログが見つかる
Shell
シェルになれるための問題。簡単めに設定されている。
Hello Webshell
WebShellにログインしcatコマンドを打つ
netcat
ncコマンドで通信する
Find Image
ディスクイメージが与えられているのでsudo mount image.img /mnt/
コマンドでマウントする。また、ファイル階層が深いのでfind . -type f -name "*flag*"
コマンドで検索するとよい。アンマウントするときはsudo umount image.img
を使う。
Veeeeeeery Long Text
サイズの大きいファイル内で検索するためgrepコマンドを用いる
Web
Forbidden 1
デベロッパーツールを見ると、cookieにadmin=false
が設定されている。よって以下のように要求すればよい。
curl -b 'admin=true' https://forbidden-1.cpctf.space/private/flag.txt
POST ME!
jsonをPOSTして、その後DELETEをリクエストする。jsonをPOSTするときはヘッダーにcontent-typeをセットする必要があるので注意。
curl -H "content-type: application/json" -X POST -d '{"password":"pass"}' https://postme.cpctf.space/
curl -X DELETE https://postme.cpctf.space/
Robots
robots.txt
にアクセスする。これは検索エンジンがクロールするときに使う情報を記すファイルである。
あとがき
解こうとして解けなかった問題も多かったのでちゃんと復習したい。