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

wildimagebinary

60a549cd4a7fa59e09efdbdc5fd2a304?s=47 yoya
June 24, 2016

 wildimagebinary

ワイルドな画像バイナリ

60a549cd4a7fa59e09efdbdc5fd2a304?s=128

yoya

June 24, 2016
Tweet

More Decks by yoya

Other Decks in Programming

Transcript

  1. ワイルドな画像バイナリ 2016/06/24(Fri)   “よや”  yoya@awm.jp

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

     。たまに  JavaScript  。   •  退職届けPDFメーカーのひと(だったのに)   – 最近は AWS  で200万迷惑かけた人として有名…  
  3. ワイルドな画像バイナリ。とは •  JPEGやPNG等で画像バイナリ形式的に壊れ たファイル   – 「壊れた」とは?   •  端的にいうと、表示できない画像ファイル  

  4. 表示できない理由予想 •  MIME  Type  と実際の画像形式が違う(?) HTTP  request HTTP  response <?php

      header(“Content-­‐type:  image/gif”)   echo  file_get_contents(“logo.jpg”); GIFと偽って   JPEG画像を転送
  5. 結果 •  普通に表示された。  この件はスルーする   –  (MacOS  での Chrome,Safari,Firefox  調べ)  

    –  IE や  Edge  はチェックしてるらしい。(※追記)
  6.   ここから本題

  7. 画像バイナリについて •  画像バイナリって何?   – こういうの↓

  8. 画像バイナリのチャンク •  画像バイナリはその情報の種類に応じてブ ロックに分けて保存する   – いわゆる「チャンク」   メタ情報 シグネチャ 画像の実データ

    例  JPEG) ffe1  (APP1) ffd8ff… ffda  (画像データ) ??? 89504e… <len>IDAT(画像データ) 例  PNG) 画像情報 ffc0  (SOF0) <len>IHDR… 画像サイズ等 Encode された   画像データ   撮影日付等
  9. チャンク分割の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  を持つ  
  10. PNG のデータ構造 89  50  4E  47  0D  0A  1A  0A

      Signature Type Len Content 。。。 <Len>byte 4byte 4byte CRC 4byte
  11. PNG を壊す •  例えば(4byte前提の)  gAMA  を 3byteにする   – CRC  も計算し直し

  12. プログラムがどう動くか •  予想1)  無理やり読む   •  予想2)チェックでエラー   •  予想3)落ちる

      – (チェックしてない場合)   Type Len Content CRC gAMA 3 ガンマ値 CRC gAMA 3 ガンマ値 CRC 4byte   read 3byte 4byte   read CRC から   1byte貰う
  13. JPEG のデータ構造 Mark Len Content 。。。 <Len>byte 2byte 2byte

  14. 怪しい JPEG  バイナリ Mark Len Content <Len>byte 2byte 2byte ゴミ

    Mark Len Content
  15. ImageMagick で変換してみる •  ImageMagick で変換   – 警告が出る (変換自体はできてる)

  16. JPEG  の  marker  の仕様 •  次の marker  (ffxx)まで 6  byte

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

    –  仕様的に駄目なチャンクの並び   –  1つしかないはずのチャンクが複数ある   –  複数必要なチャンクが一つしかない   •  チャンク構造   –  チャンクの Length  がデータの長さと違う   –  存在しない  type(tag)     •  データの中身   –  表の大きさより大きなインデックス値   –  仕様以外のデータ形式が入る (PNG  に zlib  以外とか)   先程紹介   したケース  
  18. 全体構造 •  シグネチャが違う   •  チャンクの過不足や順番 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  へ 画像サイズが   ないのにデコード?
  19. チャンク構造 •  先ほどの PNG  や JPEG  の例で示したので省 略。

  20. データの中身 •  色のインデックスからはみでる例   •  想定されるプログラムの動きは、チャンクが はみ出た場合と同様 色パレット RGB RGB

    RGB RGB インデックス値 1 4 何か 1 4 何かを色として   使うかも?
  21. バイナリを壊すメリット •  プログラムをリバースエンジニアするのに便 利   – 投稿サイトに色んな画像バイナリを送りつけて検 証   •  プログラムを外部から攻撃するのに便利

    J   – 境界チェックを真面目にしないプログラムの脆弱 性もつけるかも?
  22. (質問タイム) •  JPEGの後ろに任意のデータを置けるか   – fff9  (End  of  Image)マーカの後ろは任意のデータ がおける。  

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