TSALVIA技術メモ

CTFのWriteupや気になったツールについて書いていきます。また、このサイトはGoogle Analyticsを利用しています。

SECCON 令和CTF Writeup

SECCON 令和CTF について

平成最後のCTFとして、http://score-reiwa.seccon.jp/が開催されました。
平成31年4月30日(火)23:00(JST)~令和元年5月1日(水)01:00 (JST) (2時間)
※ 開始直後にサーバトラブルがあり、結局2時まで開催されていました。

2018.seccon.jp

私もいろいろ準備して参加しましたが、 結局チュートリアルも含めて、4問しか解くことができませんでした。 結果は、310点で78/858位でした。

f:id:tsalvia:20190501113258p:plain

SECCON 令和CTF Writeup(4問)

Misc フラグの例は?

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

Misc bREInWAck

問題

元号が変わる。記号も変わる。
参考: https://ja.wikipedia.org/wiki/Brainfuck

添付ファイル(flag.bw)

令和和和和和和和和和和和和和和和和「令和
和和和和令和和和和令和和和和和和和令和和
和和和和令和和平平平平平成」令和和和。令
和和和和和。成成。。平成成成成。成。令令
和和和和和和和和和和和。令和和。平平平和
和和和。令和和。和和和和。令令和和和和和
和和和和和和和。平平平和和和和和和和和和
和和和和。成成成成成成成成。令成成成成成
成成成。令令。成成成成成。成成成成成成。
令和。平平和和。令令令和和和和和和和和和
和。

解答例

令和平成「」。 の文字をBrainfuckの記号( >+<-[]. )に置き換えて、 Brainfuckインタプリタで実行するとフラグが取得できます。

cat flag.bw |
sed -e 's/令/>/g' |
sed -e 's/和/+/g' |
sed -e 's/平/</g' |
sed -e 's/成/-/g' |
sed -e 's/「/[/g' |
sed -e 's/」/]/g' |
sed -e 's/。/./g'

変換すると、下記のようになります。

$ sh reiwa_ctf_misc2.sh
>++++++++++++++++[>+
++++>++++>+++++++>++
++++>++<<<<<-]>+++.>
+++++.--..<----.-.>>
+++++++++++.>++.<<<+
+++.>++.++++.>>+++++
+++++++.<<<+++++++++
++++.--------.>-----
---.>>.-----.------.
>+.<<++.>>>+++++++++
+.

今回は、下記のBrainfuckインタプリタを使用しました。

copy.sh

f:id:tsalvia:20190501112847p:plain

Misc 零は?

問題

nc zerois-o-reiwa.seccon.jp 23615

解答例

netcatで接続すると、計算問題が表示されます。
右辺の計算結果が0になるような?を見つけていく問題のようです。

$ nc zerois-o-reiwa.seccon.jp 23615
[1/100]
0=71-?
?=71
[2/100]
0=91*71-?
?=

後半になると問題も長くなり、タイムアウト時間もあるので手動では解けそうにありません。 今回は、Pythonを使って100問解くようにプログラムを書きました。

  1. pwntoolsで接続して、問題を取得する。
  2. ?を総当たりで割り当てて、evalで計算する。
  3. 計算結果が0になったら、回答する。
  4. 上記を繰り返す。
from pwn import *

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

for count in range(100):
    print '--- ' + str(count) + ' ---'

    # get question
    p.readuntil('0=')
    question = p.readuntil('?=').split('\n')[0]
    print question

    # brute force
    answer = 0
    while True:
        tmp = question
        result = eval(tmp.replace('?', str(answer)))
        if result == 0:
            break
        answer += 1

    # send answer
    p.sendline(str(answer));
    print '?=' + str(answer)

p.interactive()

実行すると、下記のようになります。

$ python reiwa_ctf_misc3.py
[+] Opening connection to zerois-o-reiwa.seccon.jp on port 23615: Done
--- 0 ---
?-43
?=43
--- 1 ---
60+23-?
?=83

(省略)

--- 98 ---
71-92+76*30*15+56-84*68+47-65-10+79*10*61+27-94*40+34-1+36*96-29-71*73+25*89+91-52*62-52+33-6*43+9*8+62-22-45+36*13-18+52*60+16-59*57-63+83*65*64-85+48+6*56-32+57*29-74-88*90+58-42+7*86*52+58-25-57*18+22+98*90-97+89-69*29*8+51-97-63*67+20+19-54*95*18+19-52+89*55-13*33+80-54-77+?*0+39-92-340391
?=0
--- 99 ---
55+56*0-68+32-47*78*59+59-85+45-71*73+91*90-21*25+93-15+98-27*82*99+49-48+77*73-78*80+44-13*89-67+24-60+14*31-97*75+87+30*88-33-23*28+19*35-93+29*30-22+71+75*65-33+56*54-20+59-68*81-54+9*32+16-50*5*80-34+75*15-40+51+31-90*43*18-57+46+99-59*19-80+93*89*24-33+97-39*89+40-99*72+72-14+67*88+0*?-10+330814
?=0
[*] Switching to interactive mode
Congratulations!
The flag is SECCON{REIWA_is_not_ZERO_IS}.
(Enter RETURN key if connection is not disconnected)
[*] Got EOF while reading in interactive
$

Forensic 新元号発表

問題

newera.pdfを開くと下記の画像が表示されます。

f:id:tsalvia:20190501103333p:plain

解答例

PDFをよく見ると、QRコードが隠れているように見えます。 下記のサービスを使用してPDFから画像を抽出してみました。
smallpdf.com

抽出すると、2つの画像を取得することができました。

f:id:tsalvia:20190501104229j:plain

f:id:tsalvia:20190501110248j:plain

後は適当に重ねてQRコードを読み込むとフラグが取得できます。 私は、PowerPointの機能で白を透過させて2つの画像を重ねました。

www.becoolusers.com

実際にQRコードを重ねてみると、以下のようになります。

f:id:tsalvia:20190501104125p:plain