PlaidCTF 2017

PlaidCTF 2017 writeup zipper

zipper

Misc (50 pts)

Something doesn't seem quite right with this zip file. 

Can you fix it and get the flag?

ダウンロードしたzipファイルは壊れているようでそのままでは解凍できません。下記URLのZIPファイルフォーマットを参考にしながら、バイナリエディタでzipファイルを確認します。
https://ja.wikipedia.org/wiki/ZIP_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)#.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.83.98.E3.83.83.E3.83.80

まず、ローカルファイルヘッダは下記のようになっています。ファイル名の長さとファイル名がおかしいようです。
開始 サイズ 項目 備考
0  
4   シグネチャ 50 4B 03 04  
4  
2   展開バージョン 14 00  
6  
2   ビットフラグ 02 00  
8  
2   圧縮メソッド 08 00  
10
2   最終変更時間 FC 99  
12
2   最終変更日付 92 4A  
14
4   CRC32 3E A9 2E 53  
18
4   圧縮サイズ 46 00 00 00 70bytes
22
4   非圧縮サイズ F6 00 00 00 246bytes
26
2   ファイル名の長さ(n) 29 23 9001bytes
28
2   拡張フィールドの長さ(m)  1C 00 28bytes
30
n   ファイル名 00 00 00 00 00 00 00 00
30+n m 拡張フィールド

セントラルディレクトリファイルヘッダは下記のようになっています。これもファイル名の長さとファイル名がおかしいようです。
開始 サイズ 項目 備考
0  
4   シグネチャ  50 4B 01 02  
4  
2   作成バージョン 1E 03  
6  
2   展開バージョン 14 00  
8  
2   ビットフラグ 02 00  
10
2   圧縮メソッド 08 00  
12
2   最終変更時間 FC 99  
14
2   最終変更日付 92 4A  
16
4   CRC32 3E A9 2E 53  
20
4   圧縮サイズ 46 00 00 00 70bytes
24
4   非圧縮サイズ F6 00 00 00 246bytes
28
2   ファイル名の長さ(n) 29 23 9001bytes
30
2   拡張フィールドの長さ(m)  18 00 28bytes 
32
2   ファイルコメントの長さ 00 00  
34
2   開始ディスク番号 00 00  
36
2   内部ファイル属性 01 00  
38
4   外部ファイル属性 00 00 B4 81  
42
4   ローカルファイルヘッダの開始位置 00 00 00 00  
46
n   ファイル名 00 00 00 00 00 00 00 00  
46+n
m 拡張フィールド     

最後にセントラルディレクトリの終端レコードを確認します。これは特に問題ないようです。
開始 サイズ 項目 備考
0  
4 シグネチャ 50 4B 05 06  
4  
2 ディスク数 00 00  
6  
2 セントラルディレクトリの開始ディスク 00 00  
8  
2 セントラルディレクトリ数 01 00  
10
2   セントラルディレクトリ合計 01 00  
12
4   セントラルディレクトリサイズ 4E 00 00 00  
16
4   セントラルディレクトリ開始位置 88 00 00 00  
20
2   コメントの長さ(n)  00 00  
22 n   コメント    

それでは、zipファイルを修復してみます。
  1. ファイル名の長さが8バイトと分かりますので、ローカルファイルヘッダとセントラルディレクトリヘッダのファイル名の長さのフィールドを08 00に修正します。
  2. 次に、ローカルファイルヘッダとセントラルディレクトリヘッダのファイル名のフィールドをダミーで41 41 41 41 41 41 41 41(AAAAAAAA)に修正します。
 つまり、下図のように修正します。
1

これで解凍できるようになります。解凍したファイルをテキストエディタで確認すると下記のようになっています。
                                  
                                  
Huzzah, you have captured the flag:
PCTF{f0rens1cs_yay}               
                                  
                                  
                                  
フラグは、
PCTF{f0rens1cs_yay}
です。 

詳解 圧縮処理プログラミング
昌達 慶仁
SBクリエイティブ
2010-10-26



PlaidCTF 2017 writeup sanity check

sanity check

Misc (1 pts)

The flag is PCTF{poop}


フラグは、
PCTF{poop}
です。



PlaidCTF 2017 writeup Pykemon

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}
です。

 
 

PlaidCTF 2017 writeup logarithms are hard

logarithms are hard

Misc (10 pts)

What is e^(1.000000001)? 

Please enter in decimal with 7 places. 
(For example, if the answer was 2.71828183... the flag would be 2.7182818 )

Pythonでe^(1.000000001)を計算してみます。
>python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> print(math.e**(1.000000001))
2.718281831177327
2.7182818をsubmitしてみますが、フラグではないようです。

logarithms bugでググります。電卓のlog計算のバグがあるようです。下記サイトで、yxの10の9乗のところの値が怪しいです。

フラグは、
2.7191928
記事検索
ギャラリー
  • TetCTF 2023 NewYearBot
  • UUT CTF writeup Find The Password
  • UUT CTF writeup The Puzzle
  • Hack Zone Tunisia 2019 writeup Microscope
  • Hack Zone Tunisia 2019 writeup Welcome
  • SwampCTF 2019 writeup Brokerboard
  • SwampCTF 2019 writeup Leap of Faith
  • SwampCTF 2019 writeup Last Transmission
  • CBM CTF 2019 writeup Long road
カテゴリー