yumetodoの旅とプログラミングとかの記録

旅や登山の記録やプログラミング関連の話とかフリーソフト紹介とか

盛大にぶっ壊れたパスワード付きzipを解析してみる

はじめに

まあ何回か書いている通り、みらい研究室実行委員会のWebページ担当なわけですが、何故にや知らん、理大祭会議なるものに出席することになりまして、それが理大祭、つまい学園祭に出展するために出なければならんとのことだからやむを得ない。

で、出て、資料もらって、資料がWebでも上がってるというから、「見てみるか」となったわけですね。これが元凶です

解凍できない・・・だと!?

私はWindows使いなんですが、標準の解凍機能はお粗末なんで、CubeICEを愛用しています。ところが

ERROR: エラーを特定できません

いやいや、どういうことだってばよ?よろしい、ならば7-zip先生に・・・

7-zip error

なんやって・・・。ねんのためWindows標準機能で・・・

ms error1 ms error 2

パスワード違うだぁ!?こういう時はコマンドラインで・・・

わぁ・・・。なんかすごいエラーだけどとりあえず解凍できたぞ

ちょっとzipを解析するか

まずzipとはどういうデータ構造かというと、いろんな情報とデータに分かれていて、これがファイルごとに存在します。ではその情報のうち、ヘッダーを見ていきましょう。

オフセットサイズ内容
04ローカルファイルヘッダのシグネチャ = 0x504B0304(PK\003\004)
42展開に必要なバージョン (最小バージョン)
62汎用目的のビットフラグ
82圧縮メソッド
102ファイルの最終変更時間
122ファイルの最終変更日付
144CRC-32
184圧縮サイズ
224非圧縮サイズ
262ファイル名の長さ (n)
282拡張フィールドの長さ (m)
30nファイル名
30+nm拡張フィールド

で、実際のバイナリエディタで開いたものがこちら。

binary zip
  1. CRC32が格納される32bit分が空にもかかわらず、汎用目的のflagの3bit目が1になっていない。
    →ほとんどの解凍ソフトで解凍に失敗
  2. ファイル名がUTF-8エンコードされているが、汎用目的のflagの11bit目が1になっていない。
    Macや最近のLinuxではこの場合UTF-8として扱うので文字化けが発生しないが、WindwosではShift-JISとして扱うので文字化けを引き起こす。
  3. 暗号化zipにはアーカイブデータの前に12byteの暗号ヘッダーが付加される。これの12バイト目に圧縮元のデータのCRC32値の上位8ビットが設定されるはずだが、上述の通りヘッダーのCRC32がぶっ壊れているため、一致しない。
    →ほとんどの解凍ソフトで解凍に失敗

で、こんなぶっ壊れたファイルを吐くソフトは一体何者だ

ちょっとわからない。__MACOSXとあるから、Macで作られたんだろうけど。

教訓