Edited at

SECCON 令和CTF Writeup

http://score-reiwa.seccon.jp/challenges

nicklegrで個人参加。

210点で97位(858チーム中)でした。

image.png

image.png

意外と良問揃い?

鯖落ちもお祭りのうち。CTFあるある。


フラグの例は? (Misc)


平成最後の最後、令和最初のSECCON CTFにようこそ。 フラグはSECCON{reiwa}です。


SECCON{reiwa}


bREInWAck (Misc)


元号が変わる。記号も変わる。

参考: https://ja.wikipedia.org/wiki/Brainfuck


間違いなさそうなところは決め打ち、残りは総当たりして全パターンをWebインタプリタで実行。

# coding: utf-8

require "pp"

input =
"令和和和和和和和和和和和和和和和和「令和
和和和和令和和和和令和和和和和和和令和和
和和和和令和和平平平平平成」令和和和。令
和和和和和。成成。。平成成成成。成。令令
和和和和和和和和和和和。令和和。平平平和
和和和。令和和。和和和和。令令和和和和和
和和和和和和和。平平平和和和和和和和和和
和和和和。成成成成成成成成。令成成成成成
成成成。令令。成成成成成。成成成成成成。
令和。平平和和。令令令和和和和和和和和和
和。"

%w|< > + -|.permutation(4) do |a|
pp a

str = input.dup
str.gsub!("\n", "")
str.gsub!("平", a[0])
str.gsub!("成", a[1])
str.gsub!("令", a[2])
str.gsub!("和", a[3])
str.gsub!("「", "[")
str.gsub!("」", "]")
str.gsub!("。", ".")

puts str
end

["<", "-", ">", "+"]

>++++++++++++++++[>+++++>++++>+++++++>++++++>++<<<<<-]>+++.>+++++.--..<----.-.>>+++++++++++.>++.<<<++++.>++.++++.>>++++++++++++.<<<+++++++++++++.--------.>--------.>>.-----.------.>+.<<++.>>>++++++++++.
SECCON{bREIn_WAnic!}


零は? (Misc)


nc zerois-o-reiwa.seccon.jp 23615


SECCON Beginnersであったようなやつ。

 % nc zerois-o-reiwa.seccon.jp 23615

[1/100]
0=8-?
?=8
[2/100]
0=78*55-?
?=4290
[3/100]
0=40*96+?-3903
?=63
[4/100]
0=56*87+82-?-4879
?=
...

方程式のソルバーを知らないので、?を総当たりで数値に置き換えてevalした。

たまにやたら大きな解でタイムアウトするのがいやらしい。

最後に-?が来る場合は探索する必要がないので、それを入れたら通った。

最後に+?もあるようだけど通ったときはたまたま間に合ったらしい。

ラスト2問の答えが必ず0で通るのは令(0)和(0)なんだろうか。

require "pp"

require_relative "pwnlib"

host = "zerois-o-reiwa.seccon.jp"
port = 23615

PwnTube.open(host, port) do |tube|
j = 1
loop do
puts "Stage #{j}:"
s = tube.recv_until(/0=(.+)\n/)
s =~ /0=(.+)\n/
expr = $1

tube.recv_until("?=")

puts expr

ans = nil
if expr =~ /(.+)-\?$/
ans = eval($1)
puts "simple: #{ans}"
else
for i in 0..1000
expr2 = expr.gsub("?", "(#{i.to_s})")
ret = eval(expr2)
if ret == 0
puts "found: #{i}"
ans = i
break
end
end

if !ans
for i in 0..1000000
expr2 = expr.gsub("?", "(#{i.to_s})")
ret = eval(expr2)
if ret == 0
puts "found: #{i}"
ans = i
break
end
end
end
end

tube.sendline(ans.to_s)
j += 1
end
end

 % ruby zero_sum.rb

[*] connected
Stage 1:
78-?
simple: 78
Stage 2:
31*11-?
simple: 341
Stage 3:
24*?-96-960
found!: 44
Stage 4:
25+45-13*?+307
found!: 29
Stage 5:
?*76+17-5+49-2417
found!: 31
Stage 6:
?+94*33-13+67-74-3129
found!: 47
Stage 7:
90*66+69-?-68*87+35-120
found!: 8
...
Stage 98:
84+6-8*30*47-43+4+80*80-72-53*9+66*84+94-22-9+6*65+97*20-7-68+52*75*10+68-84+53-87*1-17+94*4+19-78*25-89*24+19-64*52+37-44+97*55-99+97*12*23-13+60-42+73*4*92-92+50+18*67-25*99-25+30-29*57+92+72-31*44+64-77*74-97*92+76+44*77-75-2*65+55-50+8*5+32*68-39+99*92-80-15+6*89-88*2+82+11-?
simple: 89475
Stage 99:
79+73*52-1+86-95*55+78-9*84*14+49-81-91+74*71*33-18+1+54*65-13*91+90-42+76-92*19+66*76-62+25*26-67-44*21+56+71-76*65+50-48*52+70-20*93-9*11+11*21+65-31-98+75*59+91-1*7+22*96-25*76-83+42-98*42+29-90+14*32*6-97+61+48*23-20-92+20*52+52-12*82*82-14+38*42+91-62*31+63-69+44-56*98+5*53-?*0-53-76870
found!: 0
Stage 100:
93+57*17-73*87-62+18-64*28+67-60*29+30+36*19-59*72+29-55+70-60*12+23-55*79*61+44-55-31*39+25-23*47+99+89-56*44+94-51*58*17+23-92-19+40*56*26+62-98-33*11+43-11*64+90*31+74-44*34+90-36+64*40-41+65-16*63*9-19+97+43*69-92-1*49+81*71-11+44+87-71*59*12+90-49+65-21*46+78*8-36*13+63-62-81*36+0*?+8-49+325901
found!: 0
Stage 101:
"Congratulations!\nThe flag is SECCON{REIWA_is_not_ZERO_IS}.\n(Enter RETURN key if connection is not disconnected)\n"
[*] connection closed


新元号発表 (Forensics)

わかりやすい。

image.png

PDFから画像を抽出するWebサービスがあったのでバラすと

Page-1-Image-1.png

Page-1-Image-2.png

うーん?


reiwaVote (Web)

ヤバいやつ混ざってて草。

image.png

image.png


他の方のWriteup