Attack All Around

今やCTFと競プロばかりだが、トビタテ生のアメリカ留学やTOEFL奮闘記

SunshineCTF 2020 Magically Delicious writeup

こんにちは! Ken.Sです!

 

ついさっきまで行われてたSunshine CTFのMagically Deliciousについての解説です!他の問題は解けてもすごく簡単なものなのでさらっと紹介します。

 

解説

Welcome! 1pt

Welcome to SunshineCTF 2020. Glad to have you here.

To show that you made it here okay and still have a pulse, enter the following flag: sun{yes_competitor_is_here}

 

sun{yes_competitor_is_here}

 

Disboard Round 2pt

Don't worry, this year we made the discord challenge much easier, just check out the announcements channel.

Discordに入ってannouncementsチャンネルのトピックを見るとflagがありました。

 

sun{see_i_was_here_all_along}

 

User Guide 10pt

While bored during the holidays because the Wi-Fi at your family's house is infuriatingly slow, you decided to go poking around through the garage. You come across a dusty cardboard box containing a very unusual computerized device along with some program cartridges. The first cartridge is labelled "PEGASUS User Guide". Why not pop it in, power the machine up, and see what happens?

PEGASUS User Guide program file:

PEGASUS_User_Guide.peg

Core PEGASUS files:

libpegasus_ear.so

runpeg

submitpeg

How to run a PEGASUS file:

runpeg <file.peg> [--debug] [--verbose] [--trace]

とりあえずファイルをDLして、How to runの通りに実行したらflagが出てきた

 

./runpeg PEGASUS_User_Guide.peg

 

sun{1n_4_w0rld_0f_pur3_d3lir1ati0n}

 

RTFM 10pt

PEGASUS User Guide
The PEGASUS User Guide is split into two sections.

EAR Extended Architecture Reference

PEGASUS Executable Format Reference

Read the docs and you may find a flag :P

 

PEGASUS.mdファイルを開くとstructの文字がいっぱい。構造体とか把握しなきゃいけないの?と思いながらざっと目を通したら最後にflagの欠片が!EAR_EAR.mdファイルに前半部分がありました。

 

sun{und3r5t4nd1ng_7h3_d0c5_w1ll_b3_1mp0r74n7!}

 

Magically Delicious 100pt

ここからが本題です。

Can you help me decipher this message?

Tip: If you're digging into the unicode encoding of the emojis, you're on the wrong track!

 

f:id:partender810:20201108180340p:plain

与えられた絵文字達

 

emojiとかUnicodeが面倒…とか、どう読み込んだり利用したらいいんだ…っていう意識からemoji問題は苦手です(笑) この絵文字達を別のエディタにコピペすると、規則性が見えました。

 

⭐🌈🍀 ⭐🌈🦄 ⭐🦄🌈 ⭐🎈🍀 ⭐🦄🌑 ⭐🌈🦄 ⭐🌑🍀 ⭐🦄🍀 ⭐🎈⭐ 🦄🦄 ⭐🦄🎈 ⭐🌑🍀 ⭐🌈🌑 ⭐🌑⭐ ⭐🦄🌑 🦄🦄 ⭐🌑🦄 ⭐🦄🌈 ⭐🌑🍀 ⭐🦄🎈 ⭐🌑🌑 ⭐🦄⭐ ⭐🦄🌈 ⭐🌑🎈 🦄🦄 ⭐🦄⭐ ⭐🌈🍀 🦄🦄 ⭐🌈🌑 ⭐🦄💜 ⭐🌑🦄 🦄🦄 ⭐🌑🐴 ⭐🌑🦄 ⭐🌈🍀 ⭐🌈🌑 🦄🦄 ⭐🌑🦄 ⭐🦄🌈 ⭐🌑🍀 ⭐🦄🎈 ⭐🌑🌑 ⭐🦄⭐ ⭐🦄🌈 ⭐🌑🎈 🦄🦄 ⭐🦄🦄 ⭐🌑🦄 ⭐🌈🌑 ⭐🦄💜 ⭐🦄🎈 ⭐🌑🌑 ⭐🎈🦄

 

i) 星(⭐)が3文字ブロックの先頭、ii) ユニコーン(🦄🦄)が2つ連続であるブロックの二種類があります。

emoji問題ってUnicodeをごちゃごちゃするか、換字式暗号の2パターンくらいしかないイメージです(換字のやつをはるか昔にちょろっと見た記憶しかない)。Unicodeでごちゃごちゃするのは違うとTipに書いてあるので換字なのかな。

 

実はemoji問題は初めてで食わず嫌いというか自分には無理だろうと思っていました。とりあえず「crypto ctf emoji」でググって似たような問題がないか調べたところ、emoji換字式暗号を発見。

RITSEC CTF 2018 Writeup - よっちんのブログ

この方のNobody uses the eggplant emojiを見ると、ある絵文字->アルファベットという変換を行っていました。とりあえずそれをやってみようとemojiの種類を見たところ8種類しかない(先に確認しろ)。同じようにやってみてquipquipに投げたけど文章になりません。そもそも最大3文字の単語かつ使用文字8種類で文章なんてできるわけ…

 

しばらく途方に暮れて他の問題に手を出してましたが、speedrunが10ptのくせに全く分からない。この問題解く以外ないなぁ、と立ち戻って考えてました。

 

そういえば、i) 星(⭐)が3文字ブロックの先頭の規則性は絶対何かあるだろ、この3文字ブロックで一文字表すんじゃないか? 先のブログのような文章の暗号ではなくflagの文字の暗号なのではないか?となると進展した気がしました。となると、ii) ユニコーン(🦄🦄)が2つ連続であるブロックは単語間のunderscoreだろうと推測しました。2,5個目の🦄🦄の後の8ブロックが同じということを発見しました。ヒントか??

 

そう仮定した場合、最初4文字はformatである"sun{"となり、最後は"}"となります。3文字ブロックには星(⭐)は、文字だという識別子と推測できます。となると後ろ二文字で平文一文字を表す必要があります。emojiの種類は8なので二文字あれば8*8=64文字に対応できることになります。

64...?? [0-9],[A-Z],[a-z],{,}の64じゃないか!?と閃いた私は早速対応表を作ります。自作の対応表なんて何通りにでもできてしまうな…。例えば、💜⭐🌑🦄🐴🌈🍀🎈という順番で左の対応表なら、⭐💜💜=0,⭐💜⭐=1,... となります。

 

f:id:partender810:20201108231318p:plain

対応表 チャンクが4つあるので4!通りの対応表を考えないといけない

 

⭐🌈🍀=s, ⭐🌈🦄=u, ⭐🦄🌈=n, ⭐🎈🍀={, ⭐🎈🦄=} となります。s,uについて、3つ目のemojiだけが異なります。アルファベット順ではstuとなることから、🍀,🦄は2つの差があるような感じがします。しかし、同様の考えを{,} で行うと、この二つの文字も2つの差が空くことになります。この二つの文字が離れるのはおかしい…、とASCIIコードを眺めてたらここでは二つ差が空いてる!!ということに気付く。独自の対応表作る前にASCIIコード見ろよ。

 

ASCIIコードの64~127が対応しているのでしょう。そして一文字目の⭐は+64という意味なのでしょう。なんでかって?星→星座→星座の数は88→8*8=64だからですよ?

冗談はさておき、こうすると[s,u],[{,}] ともに2つの差があることが分かります。

 

f:id:partender810:20201108231816p:plain

ちゃんとした対応表

 

縦を見ると、2文字目🌈は"pqrstuvw"の7番目, 🎈は"xyz{|}~"の8番目に該当し 、横を見た際に🍀,🦄はそれぞれ4,6番目になります。⭐🦄🌈は[6,7]となり、nを示しております。まず間違っていないでしょう。未知の💜⭐🌑🐴の4つはbrute forceしましょう。

 

f:id:partender810:20201108235242p:plain

見つけた!

 

同じ8文字はencodingだったんですね。submitとします。incorrect。は?

octalって単語知らなかったんでそんな単語あるのかと調べると「8進法の」という意味でした。octの時点で察せないほど英語力が落ちました…。でもこの単語が問題というわけではないし何なら8進法ってこの解法にばっちりです。さてどうしたものか…

単語間が"_"ではなさそうです。先の対応表にも"_"があるので他の文字にしてみよう、"-"ハイフンにしよう。通った。

注釈で入れてよぉ

 

sun{lucky-octal-encoding-is-the-best-encoding-method}

 

 

ちなみに、🦄はペガサス、🌑はなんかのボールかと思っていましたが、Unicorn Face, New Moon Symbolでした。ユニコーンはともかく、新月は分からんって

 

 

自分の経験や知識じゃなくて閃きで解けたのが嬉しくてブログに書いてみました(笑) それでは!

 

 

⭐🐴🍀 ⭐🌑🦄 ⭐🌑🦄 🦄🦄 ⭐🎈⭐ ⭐🦄🎈 ⭐🌈🦄 🦄🦄 ⭐🦄🌈 ⭐🌑🦄 ⭐🎈💜 ⭐🌈🌑 🦄🦄 ⭐🌈🌑 ⭐🦄🐴 ⭐🦄🦄 ⭐🌑🦄!