Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
wildimagebinary
Search
yoya
June 24, 2016
Programming
1
200
wildimagebinary
ワイルドな画像バイナリ
yoya
June 24, 2016
Tweet
Share
More Decks by yoya
See All by yoya
resize_nitpick
yoya
1
140
ImageFluxBinary
yoya
2
2.6k
HEIF-kaisetsu
yoya
4
3.1k
go-thumber-imagick
yoya
1
160
chokaizomae
yoya
2
500
goimagicksyokai
yoya
2
1k
GoImagickThumbnail
yoya
0
1.4k
sushigazou
yoya
0
12k
twitterimgupload
yoya
0
350
Other Decks in Programming
See All in Programming
Make Impossible States Impossibleを 意識してReactのPropsを設計しよう
ikumatadokoro
0
170
弊社の「意識チョット低いアーキテクチャ」10選
texmeijin
5
24k
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
1.9k
最新TCAキャッチアップ
0si43
0
140
CSC509 Lecture 09
javiergs
PRO
0
140
Quine, Polyglot, 良いコード
qnighy
4
640
初めてDefinitelyTypedにPRを出した話
syumai
0
400
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
170
エンジニアとして関わる要件と仕様(公開用)
murabayashi
0
280
Click-free releases & the making of a CLI app
oheyadam
2
110
色々なIaCツールを実際に触って比較してみる
iriikeita
0
330
EventSourcingの理想と現実
wenas
6
2.3k
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
Side Projects
sachag
452
42k
For a Future-Friendly Web
brad_frost
175
9.4k
A designer walks into a library…
pauljervisheath
203
24k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.3k
Facilitating Awesome Meetings
lara
50
6.1k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Embracing the Ebb and Flow
colly
84
4.5k
Transcript
ワイルドな画像バイナリ 2016/06/24(Fri) “よや”
[email protected]
自己紹介 • よやのプロフィール – h9ps://osdn.jp/users/yoya/ • C言語寄りの PHPer
。たまに JavaScript 。 • 退職届けPDFメーカーのひと(だったのに) – 最近は AWS で200万迷惑かけた人として有名…
ワイルドな画像バイナリ。とは • JPEGやPNG等で画像バイナリ形式的に壊れ たファイル – 「壊れた」とは? • 端的にいうと、表示できない画像ファイル
表示できない理由予想 • MIME Type と実際の画像形式が違う(?) HTTP request HTTP response <?php
header(“Content-‐type: image/gif”) echo file_get_contents(“logo.jpg”); GIFと偽って JPEG画像を転送
結果 • 普通に表示された。 この件はスルーする – (MacOS での Chrome,Safari,Firefox 調べ)
– IE や Edge はチェックしてるらしい。(※追記)
ここから本題
画像バイナリについて • 画像バイナリって何? – こういうの↓
画像バイナリのチャンク • 画像バイナリはその情報の種類に応じてブ ロックに分けて保存する – いわゆる「チャンク」 メタ情報 シグネチャ 画像の実データ
例 JPEG) ffe1 (APP1) ffd8ff… ffda (画像データ) ??? 89504e… <len>IDAT(画像データ) 例 PNG) 画像情報 ffc0 (SOF0) <len>IHDR… 画像サイズ等 Encode された 画像データ 撮影日付等
チャンク分割の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 を持つ
PNG のデータ構造 89 50 4E 47 0D 0A 1A 0A
Signature Type Len Content 。。。 <Len>byte 4byte 4byte CRC 4byte
PNG を壊す • 例えば(4byte前提の) gAMA を 3byteにする – CRC も計算し直し
プログラムがどう動くか • 予想1) 無理やり読む • 予想2)チェックでエラー • 予想3)落ちる
– (チェックしてない場合) Type Len Content CRC gAMA 3 ガンマ値 CRC gAMA 3 ガンマ値 CRC 4byte read 3byte 4byte read CRC から 1byte貰う
JPEG のデータ構造 Mark Len Content 。。。 <Len>byte 2byte 2byte
怪しい JPEG バイナリ Mark Len Content <Len>byte 2byte 2byte ゴミ
Mark Len Content
ImageMagick で変換してみる • ImageMagick で変換 – 警告が出る (変換自体はできてる)
JPEG の marker の仕様 • 次の marker (ffxx)まで 6 byte
読み飛ばす – Jpeglib の挙動なので仕様のはず!
バイナリ壊れるパターン色々 • 全体構造 – シグネチャが違う – 必須のチャンクがない
– 仕様的に駄目なチャンクの並び – 1つしかないはずのチャンクが複数ある – 複数必要なチャンクが一つしかない • チャンク構造 – チャンクの Length がデータの長さと違う – 存在しない type(tag) • データの中身 – 表の大きさより大きなインデックス値 – 仕様以外のデータ形式が入る (PNG に zlib 以外とか) 先程紹介 したケース
全体構造 • シグネチャが違う • チャンクの過不足や順番 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 へ 画像サイズが ないのにデコード?
チャンク構造 • 先ほどの PNG や JPEG の例で示したので省 略。
データの中身 • 色のインデックスからはみでる例 • 想定されるプログラムの動きは、チャンクが はみ出た場合と同様 色パレット RGB RGB
RGB RGB インデックス値 1 4 何か 1 4 何かを色として 使うかも?
バイナリを壊すメリット • プログラムをリバースエンジニアするのに便 利 – 投稿サイトに色んな画像バイナリを送りつけて検 証 • プログラムを外部から攻撃するのに便利
J – 境界チェックを真面目にしないプログラムの脆弱 性もつけるかも?
(質問タイム) • JPEGの後ろに任意のデータを置けるか – fff9 (End of Image)マーカの後ろは任意のデータ がおける。
– 一見画像だけど、fff9 の後ろを切り出すと、欲し いデータが取れる。とか。 – 昔、そうやって違法なファイルを配布するツール があったという噂を聞いた事がある
おしまい