2020 1/21(火) 1:00 ~ 1/25(土) 16:59 JST に開催された、Rice Tea Cat Panda CTF の Rice Goddess ジャンルのwriteup。
writeup一覧・戦績はこちら
Rice Goddess ジャンルってなんだよ!って感じですが、もう型にはまらない、色々なジャンルを組み合わせたやつ!って感じですかね。1/2しか解いてないのでわからないけど。
[Rice Goddess] Wrath of the Rice Goddess (4000pt)
So, uh, you see, when you wetuwnyed my uwu back to me, the wice goddess got a bit angwy - nyow she has a giant panda weady to sit on my uwu stowage... can you tawk to it? >w<
Quest: Talk to the giant panda on discord
Hints
Data linearization and generalization tend to make a lot of things lead to Rome.
... or I think that's how the saying goes
Python is more or less required for this. Try making a byte encoder!
I would try sweet-talking the panda, maybe start with something like I love rice, tea, cats, and pandas
Never, EVER trust the developer. (but do trust this hint)
dontbeconcerned.whatsoever
,pandaspeak_encoder.py
が配布されます。
また、ヒントの通り、Discordにいた @Giant Panda に I love rice, tea, cats, and pandas
と話しかけてみました。
パンダ語が返ってきた。
radjwr sqdak chaggjrp ragwr grrr grjrr chifdbirp hujdbff hugfhaff grgcciiebejagrr chgerp rajfwr chcfgrp huff huaedfff huiff sqbak grrr ragwr grddhcarr rawr rajhwr grhairr sqak grjhrr grhhrr sqak chdrp chcjbafjhhgfrp grabgcfrr hubff sqak rabawr rawr grjarr chjfjerp chgffrp grffgrr chjgarp chghcgrp huhff chhijaaggjfrp raeadjwr chrp rawr hufgdff huhddbchiff chrp chhfeirp raewr racgwr hufff chdhderp sqjeak sqcak huff hugdff chrp chrp sqegidak rahwr sqak sqibddidedefggchegak raegwr sqeadak sqcfhak sqak sqak chdrp sqiak sqdak grfarr sqdfak hufff chgrp charp grrr sqiihgcak grrr raddgefwr raghhwr hugff chebecjjrp huhff sqadabjak grbhrr rabhcwr huhff sqgeak chijrp hubcccahhgff chdrp sqcifjeidaak hujbff hucff chirp chafdirp ragcjcfbbwr sqcjhhaajfaeak chfcajebdegbiibfdeeibbfhghbbcjrp charp grgibdrr
このパンダ語、下記のパターンで構成されています。cat-chatの延長みたい。
ra[a-z]*wr sq[a-z]*ak gr[a-z]*rr ch[a-z]*rp hu[a-z]*ff
さーて、decoder書いてみるぞ!と思ったら、encoderあるじゃん!配信されてたわ!
このencoderpandaspeak_encoder.py
を動かしてみると
No such file or directory: 'key.key'
ほう。試しにもう一つ配信されていた、dontbeconcerned.whatsoever
をkey.key
にリネームして再度実行してみると、
Fernet key must be 32 url-safe base64-encoded bytes.
ほう。そういえば、dontbeconcerned.whatsoever
、中身がbase64の逆さまみたいな感じだったな。ということで
$ echo "=0GJUhKgKiIjSihnGY_g_o-dn-P2HiJ_wasilW_qUlL3" | rev 3LlUq_Wlisaw_JiH2P-nd-o_g_YGnhiSjIiKgKhUJG0=
これをkey.key
として、再度実行してみます。
$ python pandaspeak_encoder.py Paste your message here: test sqcgijeak chhddefrp huff raifjhicawr rabeicfwr sqak sqcbak huifff hugff huff sqak sqhak hueafcdeeejebdff grgcrr sqciak chrp hujeiff sqak grrr grdecjbijgiffarr hufff chjarp chihdferp grhajijgjfbrr huhff sqeiak grberr sqdhak graarr huhff sqak grgbrr hueff chjarp griacebhijrr huhjdff raicedagwr grrr gradfhebrr huff huifff rawr chgrp grjggrr sqak ragjefbicjfafhdjbbwr grrr huidff sqgaieaebgfggbefecdiafbak sqcajhdccbjahak sqak chjdrp grrr chcfrp grgrr grgrr sqak radegajwr rahiwr chghrp grdcbiaicrr hugff radiwr sqiejdhaajjhbgjehgcaak hudff huhebdbgbfff chejhfieghbjbrp grrr grcgbjbecbrr
おお、動いた!これ、同じ文字列を入力しても、encode結果は一意にはならないんだな…。
これはencoderなので、decoderを書きます。
import cryptography from cryptography.fernet import Fernet import random class BytesIntEncoder: @staticmethod def encode(b: bytes) -> int: return int.from_bytes(b, byteorder='big') @staticmethod def decode(i: int) -> bytes: return i.to_bytes(((i.bit_length() + 7) // 8), byteorder='big') file = open('key.key', 'rb') key = file.read() file.close() with open('panda.txt', 'r') as f: data = f.read() cleaned = '' for d in data.split(' '): cleaned += d[2:-2] plain = '' for c in cleaned: plain += str(ord(c)-97) decoded0 = BytesIntEncoder.decode(int(plain)) f = Fernet(key) human = f.decrypt(decoded0) print(human)
実行
$ python pandaspeak_decoder.py b'especially pandas'
おお、人語になった!
あとは、翻訳した人語をまたパンダボットに話しかけると、別のパンダ語が返ってくるので、それを翻訳してまた投げて…を繰り返します。
$ python pandaspeak_decoder.py b'especially pandas' $ python pandaspeak_decoder.py b'yeah do you want to tell me how much you love pandas?' $ python pandaspeak_decoder.py b"i love them so much, i'd cuddle them all day" $ python pandaspeak_decoder.py b'so? the rice goddess does that too.' $ python pandaspeak_decoder.py b"darn!!! here's your flag: rtcp{pand4z_just_w4nt_cudd13z_fr0m_y0u!}"
(๑• ̀д•́ )✧+°フラグゲットォォォォォォォォ!!!
他のジャンルに出てきた問題
- botとやりとり
- 動物語を翻訳
- Fernet
などの要素が盛り盛りで、めっちゃ楽しかった💖