Pykemon
問題文のリンクは下図のようなPykemonを捕まえるゲームになっています。また、そのPythonソースコードもダウンロードできるようになっています。ソースコードを確認すると、Flaskで構築されたアプリケーションであることが分かります。まずは普通にゲームをやってみます。アイコンをクリックするとピケモンを捕獲できるようです。しかし、FLAG(旗のアイコン)はクリックしても、下図のように取得することができません。
pykemon.pyに、Pykemonクラスがありフラグが記載されています。run.pyのpcatch()関数で捕獲チェックしていますが、FLAGのrarityが0であるため絶対に取得することができないようになっています。
さらにrun.pyを見てみるとsession変数にRoomクラスのインスタンスを設定しているようです。Flaskではセッション情報をCookieに持たせているそうですので、ここからFLAGを取得できないかやってみます。
それではCookieを確認してみます。session変数が下記のように設定されています。
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
$ 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}
です。
Miguel Grinberg
Oreilly & Associates Inc
2014-05-18











