令和CTF writeup

終結果はこんな感じでした。 f:id:kent056-n:20190501134732p:plain

フラグの例は? (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}.