好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

Rice Tea Cat Panda CTF writeup [Rice Goddess]

2020 1/21(火) 1:00 ~ 1/25(土) 16:59 JST に開催された、Rice Tea Cat Panda CTF の Rice Goddess ジャンルのwriteup。

writeup一覧・戦績はこちら

kusuwada.hatenablog.com

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 と話しかけてみました。

パンダ語が返ってきた。

f:id:kusuwada:20200126115555p:plain

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.whatsoeverkey.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

などの要素が盛り盛りで、めっちゃ楽しかった💖