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
230
1
Share
wildimagebinary
ワイルドな画像バイナリ
yoya
June 24, 2016
More Decks by yoya
See All by yoya
resize_nitpick
yoya
1
170
ImageFluxBinary
yoya
2
2.9k
HEIF-kaisetsu
yoya
4
3.5k
go-thumber-imagick
yoya
1
200
chokaizomae
yoya
2
600
goimagicksyokai
yoya
2
1.2k
GoImagickThumbnail
yoya
0
1.7k
sushigazou
yoya
0
12k
twitterimgupload
yoya
0
410
Other Decks in Programming
See All in Programming
サークル参加から学ぶ、小さな事業の回し方
yuzneri
0
230
GitHub Copilot CLIのいいところ
htkym
2
1.1k
バックエンドにElysiaJSを採用して気付いた、良い点・悪い点
wanko_it
1
170
Migrations : C'est une question d'hygiène !
vinceamstoutz
0
1.8k
Stage 3 Decorators でできること / できないこと / TSKaigi 2026
susisu
1
1.1k
Inside Stream API
skrb
1
160
関係性から理解する"同一性"の型用語たち
pvcresin
2
530
サーバーレスで作る、動画データ管理基盤
oyasumipants
0
260
Hive Metastoreを通して学ぶIceberg REST Catalog ― 仕様から実装まで
okumin
0
280
Oxlintはいかにしてtsgolintのlint ruleを呼び出しているのか
syumai
1
500
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
1.7k
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
980
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
225
10k
How STYLIGHT went responsive
nonsquared
100
6.1k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
340
How to build a perfect <img>
jonoalderson
1
5.5k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
380
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
AI: The stuff that nobody shows you
jnunemaker
PRO
7
660
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
It's Worth the Effort
3n
188
29k
First, design no harm
axbom
PRO
2
1.2k
WCS-LA-2024
lcolladotor
0
600
Joys of Absence: A Defence of Solitary Play
codingconduct
1
370
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 の後ろを切り出すと、欲し いデータが取れる。とか。 – 昔、そうやって違法なファイルを配布するツール があったという噂を聞いた事がある
おしまい