SECCON 令和CTF writeup

SECCON 令和CTF writeup

個人参加限定なので個人で.510 pts で12位でした.

フラグ例は?

warmup で入れるだけ.
SECCON{reiwa}

bREInWAck

brainf*ck なのは明らか.
それぞれの文字をどれに置き換えるかを全通り試す?と考えるも,文字頻度から推測できそう.
まず . だろう.出力的にラストだし.あと[] っぽい,形的にも.
あとは だけど は開幕現れてるので > っぽいし, はそのあと連続してるので + っぽい.
この法則でいくと < だし - だとエスパーして置換して適当なインタプリンタへ Go.

>++++++++++++++++[>+
++++>++++>+++++++>++
++++>++<<<<<-]>+++.>
+++++.--..<----.-.>>
+++++++++++.>++.<<<+
+++.>++.++++.>>+++++
+++++++.<<<+++++++++
++++.--------.>-----
---.>>.-----.------.
>+.<<++.>>>+++++++++
+.

エスパー成功した. SECCON{bREIn_WAnic!}

零は?

よくある方程式を解く問題.後輩から承諾 CTF で送りつけらたことがあってサクッとコードを書いた.
方程式は sympy で解く.ただそもそも ? = 0 のケースがあって死ぬっぽくそこは例外処理した.
(末尾のやるきない print は何行くるかわからなかったので適当)

from pwn import *
from sympy import *

x = Symbol('x')

con = remote('zerois-o-reiwa.seccon.jp', 23615)

for i in range(100):
    con.recvline()
    expr = con.recvline().replace("?", "x")
    print(i, expr)
    tmp = solve(Eq(eval(expr[2:-1]),0))
    if len(tmp) == 0:
        ans = 0
    else:
        ans = tmp[0]
    con.sendline(str(ans))

print con.recvline()
print con.recvline()
print con.recvline()
print con.recvline()
print con.recvline()
print con.recvline()

100 問解けば良い素直(後輩のは Stage 2 があった).
SECCON{REIWA_is_not_ZERO_IS}

元号発表

PDF 開くと QR が隠れてて読めない. LibraOffice で開いて上に重なっているやつをどかす.
そのまま読もうとするが読めない. 令和 の形で抜かれてる部分がたりなさそう.
復元か?とおもって画像ひっぱったらなんか裏に 令和 の形で抜かれた QR の部分コードが.
フロントにもってきて,でかい QR コードの 令和 の形で抜かれたところに移動して位置を微調整しながら以下のアプリで読んだ.

‎「QRコードリーダー for iPhone」をApp Storeで

SECCON{overlay_overlap_overera}

和暦の流れ

バリナリ読んでみると 0x804878f あたりから入力された文字を1文字づつ cmp していることがわかる.
ざっと眺めてみると SHOWA をベースになんかゴニョゴニョして比較してる.入力は5文字.
適当な文字を入れて cmp あたりに BP 貼ってレジスタみてると1文字目は R であるらしい.
REIWA じゃないんか…と思ったけど違う.3文字目くらいまで適当に入れてあててみると RAY であることがわかった.
これってもしかして REIWA をそれっぽく読める感じのものを入れればいいのか…?とおもって RAYWA を入れると正解.
次が Old era らしいが,どうせ HEYSAY とかそういう感じだろうと予想して入れると通った.
SECCON{M-T-S-H-R}

reiwaVote

Web だし, SQLi とかじゃろ…と思っていろいろやるもうまくいかない.
登録時に ' を入れてみるとなんかログイン時にバグることがわかった.どうも syntax error でパスワードの MD5 が出ているみたい.
''' とかしてもだめ.登録されているユーザチェックが走るっぽくまず登録されていることが前提.
とはいえ,ログイン時のパスワードのハッシュ値なんか見えてもなんの意味もない.
ということはこれは登録時になんらかの SQLi ぶっこめば,別ユーザでログインできるみたいななにかなのではと予想する.
適当にユーザ名に誰でもログインできそうな SQLi ぶっこんでみるかーと思い, ' OR TRUE -- で登録.
その ID でログインしているみると見事 shinzo になれた.令和に投票して結果をみると1位になった.スーパーユーザーかなにか? あとは投票を閉め切れば以下のフラグが出た.歴史を守った!
SECCON{e32afd2cf7b98e41cf70fed}

まとめ

なんか意外と調子よく解けて良かった.
平成最後かつ令和最初の CTF でなかなか良かったので,新元号時代も頑張っていきたい.

f:id:yharima:20190501023029p:plain