Upgrade to Pro — share decks privately, control downloads, hide ads and more …

wildimagebinary

yoya
June 24, 2016

 wildimagebinary

ワイルドな画像バイナリ

yoya

June 24, 2016
Tweet

More Decks by yoya

Other Decks in Programming

Transcript

  1. 自己紹介 •  よやのプロフィール   – h9ps://osdn.jp/users/yoya/     •  C言語寄りの PHPer

     。たまに  JavaScript  。   •  退職届けPDFメーカーのひと(だったのに)   – 最近は AWS  で200万迷惑かけた人として有名…  
  2. 表示できない理由予想 •  MIME  Type  と実際の画像形式が違う(?) HTTP  request HTTP  response <?php

      header(“Content-­‐type:  image/gif”)   echo  file_get_contents(“logo.jpg”); GIFと偽って   JPEG画像を転送
  3. 画像バイナリのチャンク •  画像バイナリはその情報の種類に応じてブ ロックに分けて保存する   – いわゆる「チャンク」   メタ情報 シグネチャ 画像の実データ

    例  JPEG) ffe1  (APP1) ffd8ff… ffda  (画像データ) ??? 89504e… <len>IDAT(画像データ) 例  PNG) 画像情報 ffc0  (SOF0) <len>IHDR… 画像サイズ等 Encode された   画像データ   撮影日付等
  4. チャンク分割の3パターン (a)  TLC  方式  (PNG)   (b)  Marker,  Terminater  方式

     (JPEG  は (a)と併用)     (c)  Type  で長さが決まる方式  (GIF)     Type Len Content Type Len Content 。。。 mark Content ¥e 。。。 mark Content ¥e type Content 。。。 type Content Len バイト長の   Content  を持つ  
  5. PNG のデータ構造 89  50  4E  47  0D  0A  1A  0A

      Signature Type Len Content 。。。 <Len>byte 4byte 4byte CRC 4byte
  6. プログラムがどう動くか •  予想1)  無理やり読む   •  予想2)チェックでエラー   •  予想3)落ちる

      – (チェックしてない場合)   Type Len Content CRC gAMA 3 ガンマ値 CRC gAMA 3 ガンマ値 CRC 4byte   read 3byte 4byte   read CRC から   1byte貰う
  7. JPEG  の  marker  の仕様 •  次の marker  (ffxx)まで 6  byte

     読み飛ばす   – Jpeglib の挙動なので仕様のはず!
  8. バイナリ壊れるパターン色々 •  全体構造   –  シグネチャが違う   –  必須のチャンクがない  

    –  仕様的に駄目なチャンクの並び   –  1つしかないはずのチャンクが複数ある   –  複数必要なチャンクが一つしかない   •  チャンク構造   –  チャンクの Length  がデータの長さと違う   –  存在しない  type(tag)     •  データの中身   –  表の大きさより大きなインデックス値   –  仕様以外のデータ形式が入る (PNG  に zlib  以外とか)   先程紹介   したケース  
  9. 全体構造 •  シグネチャが違う   •  チャンクの過不足や順番 89  50  4E  47

     0D  0A  1A  0A   PNG  Signature 例えば   mp  の asciiモード 89  50  4E  47  0A  1A  0A   例  JPEG) ffe1  (APP1) ffd8ff… ffda  (画像データ) ffc0  (SOF0) 壊れた   JPEG ffe1  (APP1) ffd8ff… ffda  (画像データ) ffc0  (SOF0) 画像サイズ等 開始マーカ 改行コードが   Win から Unix  へ 画像サイズが   ないのにデコード?
  10. (質問タイム) •  JPEGの後ろに任意のデータを置けるか   – fff9  (End  of  Image)マーカの後ろは任意のデータ がおける。  

    – 一見画像だけど、fff9  の後ろを切り出すと、欲し いデータが取れる。とか。   – 昔、そうやって違法なファイルを配布するツール があったという噂を聞いた事がある