感想
2019年7月20~21日にCyBRICS CTFを(院試勉強そっちのけで)やりました。正直全然できなかったです順位は775チーム中232位でした。3問しか解いてないんですけどね。
Write-up
Mic Check
Tone
YOUTUBEで番号を入力している音が聞こえて何を入力しているかという問題。問題見た瞬間コナンの映画を思い出しました。
DTMFという2つの周波数で番号を認識しているやつです。その2つの周波数が分かれば良いのでUbuntuソフトウェアにあったAudacityというツールで録音しスペクトルをこんな感じで一つずつ調べていきます
このとき697Hz,1336Hz周辺が強く見られるので2です。2回押したらB,3回ならCって感じです。全部解析して終わり。
Caesaref
最初、ログイン画面のようなものが表示される。SQLインジェクションかな?とおもってユーザー名に'--を入力したらなんか入れた。
そして、入力して送信したものがそのサイトで表示されるのでXSS攻撃かなと思ったら案の定でした。
そして管理者はその内容を見てるようなのでCSRF攻撃(違ったらすいません)かな?と思い、PostBinというサイトで一時的なサーバーを取得し、
を送信。管理人がアクセスしてくれるのでクッキーを取得し、自分のブラウザのクッキーをそれに変えてアクセスすると
このような画面に、フラグを表示して終わり。
わからなかったもの
解けたものより解けなかったもののほうが多かったですが、今回は惜しいところまで行った気がするけどできなかったものをピックアップしました。
Sender
スパイの通信を覗いてみたぜ〜という内容
見てみるとリクエストやレスポンスが表示されてる。
下の方にあるquoted-pritableでエンコードされているやつをデコードすると
password for the archive with flag:crack0Weston88vertebracheers!
cheers!
と書かれていました。これで終わりか?と思い送信するもダメ。
次にユーザー認証している部分がbase64で暗号化されているので復号してみると
Password:Combin4t1onXXY
と書いてありましたcombinationXXYということはXXYを結合しろってことなんでしょうが、先程のflagの色んな所にXXYをくっつけてみましたがダメでした。ここで行き詰まりました。
[追記]
得られたUsernameとpasswordをもとに実際にtelnetでアクセスするとzipファイルが手に入るそうなのでpassword for archiveで解除するとflagゲット
Oldman Reverse
開くとアセンブラ言語がでてきました。実行しようとしたのでしが何故かできなかったので(型が違かったのかも)Pythonで同じ挙動をするであろうコードを書きました
string ="cp33AI9~p78f8h1UcspOtKMQbxSKdq~^0yANxbnN)d}k&6eUNr66UK7Hsk_uFSb5#9b&PjV5_8phe7C#CLc#<QSr0sb6{%NC8G|ra!YJyaG_~RfV3sw_&SW~}((_1>rh0dMzi><i6)wPgxiCzJJVd8CsGkT^p>_KXGxv1cIs1q(QwpnONOU9PtP35JJ5<hlsThB{uCs4knEJxGgzpI&u)1d{4<098KpXrLko{Tn{gY<|EjH_ez{z)j)_3t(|13Y}"
r2 = 13
for i in range(0,len(string),2):
r1 = string[i:i+2] #mov #MSG r1
r1_1_bin = bin(ord(r1[0])).replace("0b","")
r1_2_bin = bin(ord(r1[1])).replace("0b","")
if (len(r1_1_bin) < 8):
while(len(r1_1_bin) != 8 ):
r1_1_bin = "0"+r1_1_bin
if (len(r1_2_bin) < 8):
while(len(r1_2_bin) != 8):
r1_2_bin = "0"+r1_2_bin
r1 = r1_1_bin + r1_2_bin
r0 = bin(int(r1,2) + r2).replace("b","") # add r2 r1
if (len(r0) < 16):
while(len(r0) != 16):
r0 = "0"+r0
print(chr(int(r0[0:8],2))+chr(int(r0[8:16],2))) #.TTYOUT
r2 += 829 # add #33d r2
r2_bin = bin(r2) # clrb
r2_bin_lat = r2_bin[-8:]
r2 = int(r2_bin_lat,2)
本来はr3レジスタにloopの回数をカウントする数が入っているのですが、割り切れない数で減算していて(´・ω・`)って感じだったので無視しました。これを実行してもよくわからない文字列が得られたのでたぶん間違っているんだと思います。もしくはその文字列からまた何かするのだと思います。
[追記]
writeupより、このコードはpyhtonで
s="cp33AI9~p78f8h1UcspOtKMQbxSKdq~^0yANxbnN)d}k&6eUNr66UK7Hsk_uFSb5#9b&PjV5_8phe7C#CLc#<QSr0sb6{%NC8G|ra!YJyaG_~RfV3sw_&SW~}((_1>rh0dMzi><i6)wPgxiCzJJVd8CsGkT^p>_KXGxv1cIs1q(QwpnONOU9PtP35JJ5<hlsThB{uCs4knEJxGgzpI&u)1d{4<098KpXrLko{Tn{gY<|EjH_ez{z)j)_3t(|13Y}"
i=0
j=32
o=""
while j>0:
o+=(s[i%len(s)])
i+=33
j-=1
print(o)
と書けるそうですが、なぜこうなるかはわかりません。。。自分でまた調べてみます。。。
Warmup
これはかすりもしなかったのですが面白い問題だったので書き留めます
開くと所々文字化けしたサイトが開かれます。最初文字化けした部分をつなぎ合わせれば何かになるのかなと思ったのですがよくわからなかったです...
[追記]文字化けはただのホントの文字化けで引っ掛け(?)でした。
正解はこのページはリダイレクトされた後にでるページでリダイレクトされる前のページを見ればわかる問題でした。よく見ればアクセスする前のURLと後のURLが異なっていたのでそれを見ればわかったかもしれないです。。。
リダイレクト前のページをみるには
curl http://45.32.148.106
です。