http://score-reiwa.seccon.jp/
令和CTFに参加してみました。常設でないCTFは初参加、ついでにQiitaも初投稿です。
平成31年4月30日23:00〜令和元年5月1日01:0002:00 と、年号またぎでの開催でした。
なんで時間が延びてるかというと、アクセス殺到しすぎて最初の方は全く繋がらなかったからです(自分が問題を見ることが出来たのも確か23:30くらいだった)。
結果
110points/368th です。
1問解ければいいかな、と思っていたのですが、本当にWelcome問題+1問で終わってしまいました。
ということで、記録代わりに解けた問題のWrite Upを残しておこうと思います。上記+時間外で解けた1問です。すべてMisc。
フラグの例は? (Misc/10p)
点数の通り、Welcome問題ですね。
問題文に書いてあるフラグをそのまま入力して終わり。
SECCON{reiwa}
bREInWAck (Misc/100p)
時間内に解けた方。
タイトルと問題文に載っているWikipediaのページから、Brainfuckの問題であることが分かります。
令和和和和和和和和和和和和和和和和「令和
和和和和令和和和和令和和和和和和和令和和
和和和和令和和平平平平平成」令和和和。令
和和和和和。成成。。平成成成成。成。令令
和和和和和和和和和和和。令和和。平平平和
和和和。令和和。和和和和。令令和和和和和
和和和和和和和。平平平和和和和和和和和和
和和和和。成成成成成成成成。令成成成成成
成成成。令令。成成成成成。成成成成成成。
令和。平平和和。令令令和和和和和和和和和
和。
平成令和。「」 の7字で構成されている様子。
BrainfuckのHelloWorldをググり、コードを見比べて以下のように推定。
なんとなく上から推定した順で並べてます。
| Brainfuck | bREInWAck | 理由 |
|---|---|---|
| []. | 「」。 | そのまま |
| + | 和 | 数が多い・連続している |
| - | 成 | 次に多い・連続している |
| > | 令 | ><のどちらかから勘 |
| < | 平 | ><のどちらかから勘 |
あとはエディタの置換機能使って、オンラインのインタプリタに放り込んで終わり。
勘が当たりました。
SECCON{bREIn_WAnic!}
参考
Brainfuck - Wikipedia
BrainFuckインタープリタ:いで庵
零は? (Misc/100p)
時間内に解けなかった方。プログラムの修正に手間取りました。
問題文は以下。
nc zerois-o-reiwa.seccon.jp 23615
> nc zerois-o-reiwa.seccon.jp 23615
[1/100]
0=?-40
?=40
[2/100]
0=23*?-138
?=6
[3/100]
0=15*28-243-?
?=177
...
接続してみると、こんな感じで100問解けと言われます。タイムアウトあり。
SECCON Beginners writeupで似たような問題を見た記憶があったので、参考にさせていただいてコードを書きました。
方程式を解く知識がなかったので、?に片っ端から数字を代入していってeval()で右辺が0になる解を探しました。頭が悪い解き方ですが許してください……。
コードで詰まってたのは以下の辺りです。
- 1回目の計算をしたあと2回目で失敗する→なぜか1回目のみ
[1/100]と問題文が一気に取得できていなかったので、if文で場合分け - 解が大きくなるとタイムアウトする→
?が+-で接続されており、移項すれば式を計算するだけで解が分かる場合は移項して解く
import socket
import time
import re
target = "zerois-o-reiwa.seccon.jp"
port = 23615
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((target, port))
resp = ""
cnt = 0
try:
while True:
resp = s.recv(4096)
list = resp.split(b"\n")
if not list[1]:
# 問題文を取得できていない場合
continue
elif list[1].decode()[0] == "0":
exp = list[1].decode()[2:]
else :
exp = list[0].decode()[2:]
cnt = cnt + 1
print(f"{cnt}: {exp}")
i = -1
ans = 1
# 移項と計算のみで解が導出できる場合の場合分け
if exp[-2:] == "-?" :
i = eval(exp[:-2])
elif exp[-2:] == "+?":
i = eval(exp[:-2]) * -1
print("+?")
elif "-?-" in exp or "-?+" in exp:
i = eval(exp.replace("-?", ""))
else:
while ans != 0:
i = i + 1
t = exp.replace("?", str(i))
ans = eval(t)
if i == 5000:
print(f"5000: {exp}")
s.send(bytes(str(i) + "\n", "utf-8"))
print(f"? = {i}")
time.sleep(0.5)
finally:
print(resp)
雑なコードなので最後はSyntaxErrorで終わりますが、flagは取得できたのでよしとします。
> python3 reiwa.py
1: 15-?
? = 15
2: ?-10*22
? = 220
...
99: 30*17-63+62-95+89*24-59*7+46*70-8+72*85+35-27*9+51-76+83-30*51+67-74*96+40-5
1*94-38*93+93+43-41*56+48-70*35*66+77-30+32*79-49-83+69*43*78-37+3+68-19*49*9+82
-14+72-55*86*89+7-5*53-20+52-41*66+62+11*89-0*20+24-66+3-69*17*16+28-93-18*86+28
*92+21-14-67*60+66-86+35*43-94+16*68*28-96+21-?*0+356622
? = 0
100: 27*61-10+74+31*90-64+54*94-59-31+58*33-56*92+29*40-44+97*35+15-99+63*33-42-
96*0+50-96*81+52*89+59-83-5+51*88+81*17-61+73-65*53*36-55+43+24*25-65*86+18-5+93
-58*19*87+16-93-38*72+20*61+93-81+70-43*69+2*25-50+21*78-14+89*4-67+40-40*92*34-
66+11*74-44+66-14*83+19+67*51-79*97-71+23*13-36+33-0*?+20+341410
? = 0
101: e flag is SECCON{REIWA_is_not_ZERO_IS}.
b'The flag is SECCON{REIWA_is_not_ZERO_IS}.\n(Enter RETURN key if connection is
not disconnected)\n'
Traceback (most recent call last):
File "test.py", line 38, in <module>
ans = eval(t)
File "<string>", line 1
e flag is SECCON{REIWA_is_not_ZERO_IS}.
^
SyntaxError: invalid syntax
SECCON{REIWA_is_not_ZERO_IS}
参考
box-in write-up ctf4b てけいさんえくすとりーむず
【初参加】SECCON 2018 for beginners Write up(5/26-27) (ノ・Д・)ノ - 196Log
所感
あまり解けていませんが楽しかったです!!冒頭でも触れましたが、少なくとも1問と思っていたのでとりあえずは良かったかなと。ただ、やっぱり悔しい気持ちはあるので、次までにもっと勉強しておこうと思います。今年の SECCON Beginners には参加したいです。
あと、今回書いたもの以外の問題をほとんど見られなかったのも残念です。他の方の書かれた writeup を読んでおこう……。