Pykemon

15 hours ago
Web (151 pts)

Gotta catch them FLAGs! 

Take this with you.

問題文のリンクは下図のようなPykemonを捕まえるゲームになっています。また、そのPythonソースコードもダウンロードできるようになっています。ソースコードを確認すると、Flaskで構築されたアプリケーションであることが分かります。
no title

まずは普通にゲームをやってみます。アイコンをクリックするとピケモンを捕獲できるようです。しかし、FLAG(旗のアイコン)はクリックしても、下図のように取得することができません。
1

pykemon.pyに、Pykemonクラスがありフラグが記載されています。run.pyのpcatch()関数で捕獲チェックしていますが、FLAGのrarityが0であるため絶対に取得することができないようになっています。
さらにrun.pyを見てみるとsession変数にRoomクラスのインスタンスを設定しているようです。Flaskではセッション情報をCookieに持たせているそうですので、ここからFLAGを取得できないかやってみます。

それではCookieを確認してみます。session変数が下記のように設定されています。
.eJztV0tvm0oU_isVay94mLRYyoa0zGDFVMY1r6qqYIYLmAEjY2JD5P_eA24cB8v2vZKzie4O5szre8w5M89c4DNWciOBH3DEr6J4zY2euaJOw2yZc6Ofv3YDbrVcZm9bnzkalmSVFOuk_X_mPgXciLNQXJBanYb2Og5spdJRHMM_C5C1oHhcuCLjw5nQUKTUvi3nOlafqG0sPWcSBeIw8h2z0RH829aK1MMI5mNEnEeuo248W6t1bD7paMxcUVl7s-N5tTLAaeSKsF5GmfegptQZF0FGIgpz6EguPDHmdUyXvr1luqbKvqgtfDyPiLhlnqM2j9H9PQdY44IbDe8GXO5n4QHYHLOVCxul032nPCHpxQ5FQk9jP6ZiG1v5q2RdwyrAeFnA9-s0vi3Enmg1j9JhgxVBcs7tdoMzlIsxCxKV9xFr_sJat1QSkVWeNCl1xHiAz2hmAX1qTB2DgSR8UKsJyay4pecY-t2XU-i5J24Lgq3Mi87DP-nUo-A1vnCHxzTIl2nwRFr6jip4mXuFivk3Y27m6-8TbP5jaErjf9Wq0FIMA5Gt35g1wfwB5mexB9NMt6q5OQPvOHgMq2tvSH0M5wIa0Stdm1xDgRmcDfoEorZnaQHej90MPIuUTMfjTkiKQNxaLSg24Ay4kWfLvO-MWXcGMrDNXuANyZScZNpaRyYI_S1ybTnVkVVRZO3PHzJkF-YjEqwhzqsXdpThqQn2m7pggDcdeuLvY4uUP2ZKuiw8yVgOTr5OVwopZKW3_geIoW2VAVKk47MAHo_pg1p74P3AHpdtunFn6t9xSg0ppSDISl17ExG0jSlmG-pMDmZRpFM6usHnqDgEezR07d9_7Gd-oeHuiv-xBXrKG8hl97fxvqjczvu6fGPvw1mnMXi7L1YSYIs9PqgNaWtCxhatWBRpKUFK6c2G0cyZRj7SwATbrgaAz-VubOt5rEItKKMAsQ3Uldc8388Chw2cY6PfoSfwPtZM32SEL5cFhk1J_4Ka_yBwu-CtBI42txT4w1wQ3ul-cH_7-8EHYfxOeB_K3e3NKYfJedcx431JMuDKZRaBZME3q4CuZUtTiM3aswX2mKgaVPTqQEN3XWvHaQ1QycjDBiSYAo1KRSQzDnKzDGcq5BmDh6oP_cayjoQnmr3cCCZRKwtIDLQrQpBNq0vZrtvoOfoOwR51XbvxVX_jVuUydZCqeXd2rYx9FLfK8vu4dS78_4C4wQPi1-DlKfubLKscXrwCXPFW7Xr8bvcHqwDZuA.C-8epQ.AEM0acIhD0NV5MEhWxp8dw2AOUY
 Cookieのsession変数の最初の.(ピリオド)の部分を、下記のようにデコードします。
$ python
>>> import zlib
>>> import base64
>>> cookie_str = "eJztV0tvm0oU_isVay94mLRYyoa0zGDFVMY1r6qqYIYLmAEjY2JD5P_eA24cB8v2vZKzie4O5szre8w5M89c4DNWciOBH3DEr6J4zY2euaJOw2yZc6Ofv3YDbrVcZm9bnzkalmSVFOuk_X_mPgXciLNQXJBanYb2Og5spdJRHMM_C5C1oHhcuCLjw5nQUKTUvi3nOlafqG0sPWcSBeIw8h2z0RH829aK1MMI5mNEnEeuo248W6t1bD7paMxcUVl7s-N5tTLAaeSKsF5GmfegptQZF0FGIgpz6EguPDHmdUyXvr1luqbKvqgtfDyPiLhlnqM2j9H9PQdY44IbDe8GXO5n4QHYHLOVCxul032nPCHpxQ5FQk9jP6ZiG1v5q2RdwyrAeFnA9-s0vi3Enmg1j9JhgxVBcs7tdoMzlIsxCxKV9xFr_sJat1QSkVWeNCl1xHiAz2hmAX1qTB2DgSR8UKsJyay4pecY-t2XU-i5J24Lgq3Mi87DP-nUo-A1vnCHxzTIl2nwRFr6jip4mXuFivk3Y27m6-8TbP5jaErjf9Wq0FIMA5Gt35g1wfwB5mexB9NMt6q5OQPvOHgMq2tvSH0M5wIa0Stdm1xDgRmcDfoEorZnaQHej90MPIuUTMfjTkiKQNxaLSg24Ay4kWfLvO-MWXcGMrDNXuANyZScZNpaRyYI_S1ybTnVkVVRZO3PHzJkF-YjEqwhzqsXdpThqQn2m7pggDcdeuLvY4uUP2ZKuiw8yVgOTr5OVwopZKW3_geIoW2VAVKk47MAHo_pg1p74P3AHpdtunFn6t9xSg0ppSDISl17ExG0jSlmG-pMDmZRpFM6usHnqDgEezR07d9_7Gd-oeHuiv-xBXrKG8hl97fxvqjczvu6fGPvw1mnMXi7L1YSYIs9PqgNaWtCxhatWBRpKUFK6c2G0cyZRj7SwATbrgaAz-VubOt5rEItKKMAsQ3Uldc8388Chw2cY6PfoSfwPtZM32SEL5cFhk1J_4Ka_yBwu-CtBI42txT4w1wQ3ul-cH_7-8EHYfxOeB_K3e3NKYfJedcx431JMuDKZRaBZME3q4CuZUtTiM3aswX2mKgaVPTqQEN3XWvHaQ1QycjDBiSYAo1KRSQzDnKzDGcq5BmDh6oP_cayjoQnmr3cCCZRKwtIDLQrQpBNq0vZrtvoOfoOwR51XbvxVX_jVuUydZCqeXd2rYx9FLfK8vu4dS78_4C4wQPi1-DlKfubLKscXrwCXPFW7Xr8bvcHqwDZuA"
>>> zlib.decompress(base64.urlsafe_b64decode(cookie_str+b"="*(-len(cookie_str) % 4)))
デコードして得た文字列の中から、"rarity": 0の部分がFLAGの情報になりますので、下記に抽出します。
(略)
            {
                "description": {
                    " b": "UENURntOMHRfNF9zaDFueV9NNGcxazRycH0="
                }, 
                "hp": 72, 
                "name": {
                    " b": "RkxBRw=="
                }, 
                "nickname": {
                    " b": "RkxBRw=="
                }, 
                "pid": {
                    " b": "RkxBRzcy"
                }, 
                "rarity": 0, 
                "sprite": {
                    " b": "aW1hZ2VzL2ZsYWcucG5n"
                }
            }, 
(略)
descriptionにフラグ値が記載されているはずなので、base64でデコードします。
フラグは、
PCTF{N0t_4_sh1ny_M4g1k4rp}
です。