SunshineCTF 2025
- Sat, 27 Sept. 2025, 14:00 UTC — Mon, 29 Sept. 2025, 14:00 UT
misc: the poor challenge
- 10pt
- created by
oatzs
- provided txt file
its da poop challenge :DDDDDDDDDD
$ cat poop_challenge.txt ❮❮❮
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩%
絵文字の羅列ファイルであることがわかった
vimで開いてみる
$ vim poor_challenge.txt
1 💩💩<200b>💩<200b>💩<200b>💩💩💩<200b>💩<200b>
2 💩💩<200b>💩<200b>💩<200b>💩💩<200b>💩💩<200b>
3 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩<200b>💩
4 💩💩<200b>💩<200b>💩<200b>💩<200b>💩💩<200b>💩<200b>
5 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩💩
6 💩💩<200b>💩<200b>💩💩💩<200b>💩💩<200b>
7 💩💩<200b>💩<200b>💩<200b>💩💩💩<200b>💩<200b>
8 💩💩<200b>💩<200b>💩<200b>💩💩💩<200b>💩<200b>
9 💩💩<200b>💩<200b>💩<200b>💩💩💩<200b>💩<200b>
10 💩💩<200b>💩<200b>💩💩💩<200b>💩<200b>💩<200b>
11 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩<200b>💩<200b>
12 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩<200b>💩<200b>
13 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩<200b>💩<200b>
14 💩💩<200b>💩💩<200b>💩<200b>💩<200b>💩<200b>💩<200b>
15 💩💩<200b>💩<200b>💩<200b>💩💩💩<200b>💩<200b>
16 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩<200b>💩<200b>
17 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩💩
18 💩💩<200b>💩<200b>💩<200b>💩💩<200b>💩<200b>💩
19 💩💩<200b>💩<200b>💩💩💩<200b>💩💩<200b>
20 💩💩<200b>💩<200b>💩💩💩<200b>💩💩
21 💩💩<200b>💩💩<200b>💩<200b>💩<200b>💩<200b>💩<200b>
22 💩💩<200b>💩<200b>💩<200b>💩💩<200b>💩💩
23 💩💩<200b>💩<200b>💩💩<200b>💩💩💩
24 💩💩<200b>💩<200b>💩💩💩<200b>💩💩<200b>
25 💩💩<200b>💩💩<200b>💩<200b>💩<200b>💩<200b>💩<200b>
26 💩💩<200b>💩<200b>💩<200b>💩💩💩💩
27 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩<200b>💩<200b>
28 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩<200b>💩<200b>
29 💩💩<200b>💩<200b>💩<200b>💩💩💩💩
30 💩💩<200b>💩💩<200b>💩<200b>💩<200b>💩<200b>💩<200b>
31 💩💩<200b>💩<200b>💩💩💩💩<200b>💩<200b>
32 💩💩<200b>💩<200b>💩💩<200b>💩💩💩
33 💩💩<200b>💩<200b>💩💩💩💩💩<200b>
34 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩💩
35 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩💩
36 💩💩<200b>💩<200b>💩💩💩<200b>💩💩<200b>
37 💩💩<200b>💩<200b>💩💩<200b>💩<200b>💩<200b>💩
38 💩💩<200b>💩<200b>💩💩💩<200b>💩<200b>💩<200b>
39 💩💩<200b>💩<200b>💩💩💩<200b>💩💩<200b>
40 💩💩💩<200b>💩💩💩💩💩<200b>
41 💩💩<200b>💩<200b>💩<200b>💩<200b>💩<200b>💩💩<200b>
不規則に<200b>
が絵文字の間に挿入されている
200b
はunicodeのZero Width Spaceで、ゼロ幅文字を表す
つまり、この問題はゼロ幅文字を用いたステガノグラフィが本質になる
ゼロ幅スペースによるエンコードがされているとすると以下の条件(もしくは逆条件)でデコードしてみる
- 絵文字の後にゼロ幅文字あり = 1
- 絵文字の後にゼロ幅文字なし = 0
検証
上記の1行目が以下
1 💩💩<200b>💩<200b>💩<200b>💩💩💩<200b>💩<200b>
それをデコードすると
01110011
になる
これを10進数にすると1+2+16+32+64 = 115
16進数にすると0x73
0x73
をASCIIの文字コードに直すと s
今回のCTFのFlagのフォーマットは sun{}
のため、正しそう
2行目も確認してみる
2 💩💩<200b>💩<200b>💩<200b>💩💩<200b>💩💩<200b>
01110101
= 1+4+16+32+64 = 117
(10進数)
117
= 0x75
= u
s
, u
と続いたので正しい可能性が高い
Answer
pythonのスクリプトをGPTに組んでもらい手を加えたものが以下
def extract_binary_from_poop(filename):
with open(filename, 'r', encoding='utf-8') as f:
data = f.read()
binary = ''
i = 0
while i < len(data):
if data[i] == '💩':
# 💩の次にゼロ幅スペースがあるか判定
if i + 1 < len(data) and data[i + 1] == '\u200b':
binary += '1'
i += 2 # 💩と\u200bを飛ばす
else:
binary += '0'
i += 1 # 💩だけ飛ばす
else:
i += 1 # 💩じゃないならスキップ
return binary
def binary_to_ascii(binary):
chars = []
for i in range(0, len(binary), 8):
byte = binary[i:i+8]
if len(byte) == 8:
chars.append(chr(int(byte, 2)))
return ''.join(chars)
# 実行
binary = extract_binary_from_poop('poop_challenge.txt')
print("binary:", binary)
flag = binary_to_ascii(binary)
print("flag:", flag)
実行結果
$ python3 decode.py ❮❮❮
binary: 0111001101110101011011100111101101101100011001010111001101110011011100110110011101101111011011110110111101011111011100110110111101101100011101100110010101100100010111110111010001101000011001010101111101110000011011110110111101110000010111110110001101101000011000010110110001101100011001010110111001100111011001010010000101111101
flag: sun{lesssgooo_solved_the_poop_challenge!}
- ファイル全体を01のバイナリにした後、8biずつ取り出しASCIIの文字コードで文字化
Flag : sun{lesssgooo_solved_the_poop_challenge!}
misc: Tribble with my Skin
- 10pt
- created by
oatzs
Question
My Minecraft account got hacked and now my skin seems to be a little off...
Might be having trouble with the tribbles...
Mind checking it out? My Minecraft username is "oatzs".
PS: A Minecraft account/instance is not required for this challenge. The most recently used skin is the suspicious one.
Answer
Googleで minecraft oatzs
と検索すると以下のoatzsのアカウントページが出てくる
「Download Skin」からスキンがDLできるのでDLする
DLしたpngを開くとFlagが表示されている
Flag : sun{Tribble_Craft}
OK BOOMER
- 10pt
- created by
sachsuke
Question
7778866{844444777_7446666633_444777_26622244433668}
alternatively (if that one is producing invalid results)
77778866{8444447777_7446666633_4447777_26622244433668}
フラグを直接エンコードしたものっぽ
7778866
or 77778866
が sun
になればいい
がこれだけではさっぱり分からないので、OK BOOMER
の意味を調べた
ロートルを揶揄するスラング的な意味合いらしい...
ということは、昔からある技術やデバイスを利用したデコードなのかと思ったが、さっぱりだったのでここまでの情報をまとめてGPTに聞く
テンキーの表示なのでは?という回答
検証してみる
検証
77778866{8444447777_7446666633_4447777_26622244433668}
の77778866
がsunになればいいので
-
7777
->s
-
88
->u
-
66
->n
ということが推測できた
つまり、数値は入力するテンキーの位置を示し、数字の回数は何回タップするかを示す
iPhoneのフリック入力を無効化して、以下の条件で試してみる
@ -> 1
a -> 2
d -> 3
g -> 4
j -> 5
m -> 6
p -> 7
t -> 8
w -> 9
つまり、7777
であれば7のp
のテンキーを4回
- p -> q -> r -> s
でs
になった
Answer
この調子でデコードすると
sun{ths_phne_is_ancient}
になる
flagっぽいがどこか足りない
文字列から4回以上ある区切りを意識してみる
8444447777
-
8
-> t -
44444
->44
+444
-> hi -
7777
-> s - =
this
で意味が通る
上記の調整をするとFlagが取得できる
Flag : sun{this_phone_is_ancient}
misc: BigMak
- 10pt
- created by
oatzs
Qustion
I tried typing out the flag for you, but our Astronaut **Cole**son seems to have changed the terminal's keyboard layout? He went out to get a big **mak** so I guess we're screwed. Whatever, here's the flag, if you can somehow get it back to normal.
rlk{blpdfp_iajylg_iyi}
最初はなんのことか問題文が理解できなかったが、Cole
とmak
が強調されていることがわかった
Coleson, mak, cole mak 等で検索すると、キーボードのColemak
配列がヒットした
Qwerty配列の文字列をColemak配列でエンコードしたものだと推測
検証
以下のColemak配列の画像を元に、rlk
をデコードしてみる
-
r
-> aの右隣 ->s
-
l
-> 7の右下 ->u
-
k
-> spaceの上、Bの右隣 ->n
sun
になったため正しい可能性が高い
Answer
上記の要領でデコードしていくとFlagが得られる
Flag : sun{burger_layout_lol}