CTF for BBA

ゲーム時々CTFやるBBAの日常。

SECCON Beginners CTF 2020 writeup(その1)

SECCON Beginners CTF 初めて参加しました。
普通のCTFでは1問も解けないことが多くて大抵人権が無いのですが、(私にとって)良い難易度で楽しかったです。
楽しさのあまりBBAの癖に徹夜しました(睡眠時間2時間)。
まあ日中は子供の世話と久しぶりのスプラフェス(!)であんまりやれなかったんですけど。

CTF4BBAは(ほぼ)一人チームで525ポイント、180位でした。
終了後にghostが解けたんですがそれが間に合っていれば…(結局大したことないですが)

下記、解けた問題。

welcome

ruleに記載してあるDiscordサーバに参加するだけ
flag: ctf4b{sorry, we lost the ownership of our irc channel so we decided to use discord}


R&B

コードから、特定の順番にROT13あるいはBase64エンコードし、ROT13の場合は頭に'R'を、Base64の場合は頭に'B'を付加することがわかるので、
文頭を見て逆にほどいていくだけ。文頭の'R'または'B'は消す。
コード書くほどでもないのでオンラインの変換サービスにひたすらコピペしてました。
ctf4b{rot_base_rot_base_rot_base_base}


Tweetstore

search limitに存在するblind SQL injectionの脆弱性を使って解いたのですが想定解ではなかったらしいですね…(そしたら多分解けなかった)
SQLiはsqlmapにお任せ。

python sqlmap.py -u "https://tweetstore.quals.beginners.seccon.jp/?search=flag&limit=1"
でSQLiの脆弱性を確認、DB情報等の取得をして、コードからDBの接続ユーザがflagということがわかっていたので、
python sqlmap.py -u "https://tweetstore.quals.beginners.seccon.jp/?search=flag&limit=1" --current-user
で接続ユーザを特定しました。

flag: ctf4b{is_postgres_your_friend?}

mask

f:id:boxwolf:20200526235923p:plain

IDAで開くと、120Chから始まるループが見つかり、変数(図ではcount)が1ずつインクリメントされていたり、
1258hの部分で長さの変数(図ではlength)と比較していたりして、あー1文字ずつ何らかの処理をしてるなって感じです。
怪しいのは定数の入っているand 75hとand EBhです。
その結果はそれぞれsとs1という変数に入るのですが、その後の処理でsとs1はそれぞれ特定の文字列と比較されます(右下と下のブロック)

…ここまで書いておいてなんですが、0x75と0xEBでandされていることが分からなくても、1文字ずつ変換されていることと比較対象の文字列を知っていれば、回答が出せます。
フラグに使われていそうな文字を変換しておきます。

./mask abcdefghijklmnopqrstuvwxyz_{}
Putting on masks...
a`adede`a`adedepqpqtutupqpUqu
abc`abchijkhijk`abc`abchijKki

1文字目は、比較対象の文字列ではそれぞれ'a'と'c'ですので、変換結果の1行目で'a'、2行目で'c'となっている文字を探します(該当するのは'c'です)。
同じように1文字ずつ探していけばflagが出ます。
flag: ctf4b{dont_reverse_face_mask}