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