Slide 1

Slide 1 text

ワイルドな画像バイナリ 2016/06/24(Fri)   “よや”  [email protected]

Slide 2

Slide 2 text

自己紹介 •  よやのプロフィール   – h9ps://osdn.jp/users/yoya/     •  C言語寄りの PHPer  。たまに  JavaScript  。   •  退職届けPDFメーカーのひと(だったのに)   – 最近は AWS  で200万迷惑かけた人として有名…  

Slide 3

Slide 3 text

ワイルドな画像バイナリ。とは •  JPEGやPNG等で画像バイナリ形式的に壊れ たファイル   – 「壊れた」とは?   •  端的にいうと、表示できない画像ファイル  

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

結果 •  普通に表示された。  この件はスルーする   –  (MacOS  での Chrome,Safari,Firefox  調べ)   –  IE や  Edge  はチェックしてるらしい。(※追記)

Slide 6

Slide 6 text

  ここから本題

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

画像バイナリのチャンク •  画像バイナリはその情報の種類に応じてブ ロックに分けて保存する   – いわゆる「チャンク」   メタ情報 シグネチャ 画像の実データ 例  JPEG) ffe1  (APP1) ffd8ff… ffda  (画像データ) ??? 89504e… IDAT(画像データ) 例  PNG) 画像情報 ffc0  (SOF0) IHDR… 画像サイズ等 Encode された   画像データ   撮影日付等

Slide 9

Slide 9 text

チャンク分割の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  を持つ  

Slide 10

Slide 10 text

PNG のデータ構造 89  50  4E  47  0D  0A  1A  0A   Signature Type Len Content 。。。 byte 4byte 4byte CRC 4byte

Slide 11

Slide 11 text

PNG を壊す •  例えば(4byte前提の)  gAMA  を 3byteにする   – CRC  も計算し直し

Slide 12

Slide 12 text

プログラムがどう動くか •  予想1)  無理やり読む   •  予想2)チェックでエラー   •  予想3)落ちる   – (チェックしてない場合)   Type Len Content CRC gAMA 3 ガンマ値 CRC gAMA 3 ガンマ値 CRC 4byte   read 3byte 4byte   read CRC から   1byte貰う

Slide 13

Slide 13 text

JPEG のデータ構造 Mark Len Content 。。。 byte 2byte 2byte

Slide 14

Slide 14 text

怪しい JPEG  バイナリ Mark Len Content byte 2byte 2byte ゴミ Mark Len Content

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

JPEG  の  marker  の仕様 •  次の marker  (ffxx)まで 6  byte  読み飛ばす   – Jpeglib の挙動なので仕様のはず!

Slide 17

Slide 17 text

バイナリ壊れるパターン色々 •  全体構造   –  シグネチャが違う   –  必須のチャンクがない   –  仕様的に駄目なチャンクの並び   –  1つしかないはずのチャンクが複数ある   –  複数必要なチャンクが一つしかない   •  チャンク構造   –  チャンクの Length  がデータの長さと違う   –  存在しない  type(tag)     •  データの中身   –  表の大きさより大きなインデックス値   –  仕様以外のデータ形式が入る (PNG  に zlib  以外とか)   先程紹介   したケース  

Slide 18

Slide 18 text

全体構造 •  シグネチャが違う   •  チャンクの過不足や順番 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  へ 画像サイズが   ないのにデコード?

Slide 19

Slide 19 text

チャンク構造 •  先ほどの PNG  や JPEG  の例で示したので省 略。

Slide 20

Slide 20 text

データの中身 •  色のインデックスからはみでる例   •  想定されるプログラムの動きは、チャンクが はみ出た場合と同様 色パレット RGB RGB RGB RGB インデックス値 1 4 何か 1 4 何かを色として   使うかも?

Slide 21

Slide 21 text

バイナリを壊すメリット •  プログラムをリバースエンジニアするのに便 利   – 投稿サイトに色んな画像バイナリを送りつけて検 証   •  プログラムを外部から攻撃するのに便利 J   – 境界チェックを真面目にしないプログラムの脆弱 性もつけるかも?

Slide 22

Slide 22 text

(質問タイム) •  JPEGの後ろに任意のデータを置けるか   – fff9  (End  of  Image)マーカの後ろは任意のデータ がおける。   – 一見画像だけど、fff9  の後ろを切り出すと、欲し いデータが取れる。とか。   – 昔、そうやって違法なファイルを配布するツール があったという噂を聞いた事がある  

Slide 23

Slide 23 text

おしまい