令和CTF writeup
最終結果はこんな感じでした。
フラグの例は? (10pt)
やるだけ。
bREInWAck (100pt)
以下、問題ファイルの中身。
令和和和和和和和和和和和和和和和和「令和 和和和和令和和和和令和和和和和和和令和和 和和和和令和和平平平平平成」令和和和。令 和和和和和。成成。。平成成成成。成。令令 和和和和和和和和和和和。令和和。平平平和 和和和。令和和。和和和和。令令和和和和和 和和和和和和和。平平平和和和和和和和和和 和和和和。成成成成成成成成。令成成成成成 成成成。令令。成成成成成。成成成成成成。 令和。平平和和。令令令和和和和和和和和和 和。
どうやらBrainfuckらしい。
他のBrainfuckのコードを参考に記号の出現頻度から適当に置換してみる。
>++++++++++++++++[>+ ++++>++++>+++++++>++ ++++>++<<<<<-]>+++.> +++++.--..<----.-.>> +++++++++++.>++.<<<+ +++.>++.++++.>>+++++ +++++++.<<<+++++++++ ++++.--------.>----- ---.>>.-----.------. >+.<<++.>>>+++++++++ +.
あとは適当なインタプリタにいれてみる。
FLAGはSECCON{bREIn_WAnic!}
でした。
零は? (100pt)
SECCON Beginnersでも同様の問題が出題されていたので参考にした。
頭悪い方法で解いた。一応タイムアウトせずに解き切ることに成功した。
from socket import * s = socket(AF_INET, SOCK_STREAM) s.connect(("zerois-o-reiwa.seccon.jp", 23615)) def read(): t = "" while len(t)==0 or t[-1]!="\n": t += s.recv(1) return t[:-1] for _ in range(100): print read() q = read() res = True i = 0 while res: result = q.replace('?', str(i)) print result rei, answer = result.split('=') if eval(answer) == 0: s.send("%s\n" % i) res = False else : i += 1 print s.recv(100) print read() print read() print read()
出力結果はこんな感じ。
?=[100/100] 0=65+71-38*57-9+46*76+12-82*53*78+53-77+4-63*76*4-30+64-47*26+57-81*25+33-58*10+12-6+22*25*80-40+99-72*55+73*33+24-95*42-14+32+31*36-33-96+74*47+7*71-67+22*27-72-43+62*80*9-0+32-28*77+55+92-87*49*6-97+83*26+96-43-11+19*41-93*0+78-34*11+46+18-40*32+65-52*86+56-82*16*24+52-95*7+90-0*0-49+6+334404 ?= Congratulations! The flag is SECCON{REIWA_is_not_ZERO_IS}.