ユーザ用ツール

サイト用ツール


ctf:lesson:第8回

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

次のリビジョン
前のリビジョン
ctf:lesson:第8回 [2018/07/10 08:51]
sei0o 作成
ctf:lesson:第8回 [2018/08/15 16:49] (現在)
ライン 1: ライン 1:
-執筆中… ​https://scrapbox.io/sei0opub/8回資料+# 第8回資料 
 + 
 +- 2018/7/10 (オフライン回) 
 +- テーマ: **画像フォレンジック** 
 +  - 正直最近のCTFにはあんまり出てない気もしますがお手軽なのでやってみましょう 
 + 
 +## 準備 
 + 
 +- java, stegsolve.jarをDL(ダウンロード)しておいてください 
 + 
 +```bash 
 +$ wget http://​www.caesum.com/​handbook/​Stegsolve.jar -O stegsolve.jar 
 +``` 
 + 
 +- 問題もDLしておいてください 
 + 
 +```bash 
 +$ wget https://github.com/ctfs/write-ups-2014/​raw/​master/​plaid-ctf-2014/​doge-stege/​doge_stege-bcea78ed7ce3588f89b56f125866c1e2.tar.bz2 
 +$ tar xf doge_stege-bcea78ed7ce3588f89b56f125866c1e2.tar.bz2 ​  
 +``` 
 + 
 +- 積極的にTabキーを押していきましょう(パスを補完してくれます 
 + 
 +## 色の表し方 
 + 
 +- それぞれの画素(ピクセル)が持つ色はRed,​ Green, Blue (RGB)の3つをどれだけ混ぜ合わせるかで表現されます 
 +  - 加法混色っていうのかな?中学美術は暗記科目 
 +- 仮に一つの色につき1byteで表現すると決めると、255が一番多く0が一番少ないことになります 
 +- 何色? 
 +  - R, G, B = 255, 0, 0 
 +  - R, G, B = 0, 0, 0 
 +  - R, G, B = 255, 255, 255 
 + 
 +## PNG形式 
 + 
 +- PNGは画像形式の一つ 
 +- Deflateという圧縮アルゴリズムを利用して、サイズを削減しています 
 +- 色の保存方法が複数あります 
 +  - グレースケール = 白黒画像 
 +  - RGB → 8bit * 3色 = 24bitで指定します 
 +  - パレットカラー,​ インデックスカラー,​ color map→好きな256色をあらかじめパレットに出しておいて、そこから選びます 
 +    - 256色なら8bitで指定できるのでサイズを小さくできる 
 +  - 他に透明度を指定する方法もあります 
 + 
 +## やってみよう 
 + 
 +- Plaid CTF 2014: doge_stege を解いてみましょう 
 +  - DLした画像を開くと犬が出てきますね 
 +- まずは`file`でファイルの詳しい情報を見てみましょう 
 +  - このコマンドはどんなファイルにでも使えます 
 + 
 +```bash 
 +$ file doge_stege.png 
 +doge_stege.png:​ PNG image data, 680 x 510, 8-bit colormap, non-interlaced 
 +``` 
 + 
 +  - `8-bit colormap`なのでパレットカラーです 
 +  - RGBの場合は`8-bit/​color RGBA` 
 +- バイナリエディタで確認すると`PLTE`(paletteの略)というのが入ってます 
 + 
 +```bash 
 +$ xxd doge_stege.png | head -n 10 
 +0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR 
 +0000010: 0000 02a8 0000 01fe 0803 0000 0067 590c  .............gY. 
 +0000020: 1900 0003 0050 4c54 450a 0b07 4005 0102  [email protected] 
 +0000030: 174b 1c1c 1829 01fe 5713 022f 2e24 3d32  .K...)..W../​.$=2 
 +``` 
 + 
 +- stegsolve.jarでいろいろ見てみましょう 
 +  - `$ java -jar /​path/​to/​stegsolve.jar`で起動して、出てきた画面のFileから操作します 
 +- Random colour mapを見てみてください(「>​」を何かクリック) 
 +  - パレットの色をランダムに変えている 
 +  - ![](https://​i.gyazo.com/​1c092d7e4d5cc00c0a22032f972b29e2.png) 
 +  - 何か浮かび上がってきましたね 
 +  - 左のほうの文字列が見たい 
 + 
 +- パレットに入っている256色から1つだけ選んで白、他は黒とかにしたらハッキリ見えそう 
 +- スクリプトが転がってたのでこれ使いましょう(自分で実装したけどCRC32でエラーが出て取れない) 
 + 
 +```bash 
 +$ wget https://​raw.githubusercontent.com/​ctfs/​write-ups-2014/​master/​plaid-ctf-2014/​doge-stege/​change_palette.py 
 +``` 
 + 
 +- ここのコメントアウト(#​paldataの#​)を消します、コメントにもありますがこのスクリプトではパレットを全部黒にしたあと前の方から少しずつ白にしていきながら出力します 
 + 
 +```python 
 +# replace palette entry 127 to 127 + n with white, the rest with black 
 +#paldata = ("​\x00\x00\x00"​ * 127) + ("​\xff\xff\xff"​*n) + ("​\x00\x00\x00"​ * (256 - (127 + n))) 
 +``` 
 + 
 +```bash 
 +$ for i in {0..128}; do python ./​change_palette.py doge_stege.png "​range-color-127+${i}.png"​ "​${i}";​ done 
 +``` 
 + 
 +- ![](https://​i.gyazo.com/​e4ea54565f7f1d08d066077669eceaeb.png) 
 + 
 + 
 +## LSBを利用した方法 
 + 
 +- LSB: Least Significant Bit 
 +- 1byte = 8bitですが、その時一番桁が小さい場所にあるbitを指します 
 +  - 8bitで表せる数字は ​ 2^8 = 2562​8​​=256 ​ 通り(0-255)です 
 +- R, G, B = 255, 0, 0 と 254, 0, 0 の差は人の目にはほとんどわかりません 
 +- このことを使って情報を埋め込むことができます 
 +- 255は2進数で`11111111`,​ 254は2進数で`11111110`なので、LSBのみが変化している→「LSBを利用した方法」 
 + 
 +## EXIFを利用した方法 
 + 
 +- 某サイバーセキュリティHRでも触れられた話 
 +- EXIF = JPEG画像などに含まれている緯度経度、撮影日時などを記録したもの 
 +- `$ exiftool image.jpg`みたいな感じで見ることができます 
 +- もちろん自分で書き換えることもできます (thanks to @ianare) 
 + 
 +```bash 
 +$ wget https://​github.com/​ianare/​exif-samples/​raw/​master/​jpg/​gps/​DSCN0029.jpg 
 +$ exiftool DSCN0029.jpg 
 +... 
 +GPS Latitude ​                   : 43 deg 28' 5.68" N 
 +GPS Longitude ​                  : 11 deg 52' 48.62" E 
 +GPS Position ​                   : 43 deg 28' 5.68" N, 11 deg 52' 48.62" E 
 +... 
 +$ exiftool -overwrite_original -rights="​Yo Yo Jyoken"​ DSCN0029.jpg  
 +$ exiftool DSCN0029.jpg 
 +... 
 +Rights ​                         : Yo Yo Jyoken 
 +``` 
 + 
 +- 問題の画像はPNGなので、EXIFは関係ありません 
 + 
 +## 発展・参考になる資料 
 + 
 +- 自分オリジナルの方法を考えてみよう、それをプログラムに落とし込もう 
 +  - LSBを使った方法を紹介しましたが、LSBだけではなくて下の3bitぐらい使えばその分データをたくさん隠せるのでは? 
 +  - 3bit変えても最大で `1111 1111` =255, `1111 1000`=247ぐらいの差しかないじゃん 
 +  - GIF, JPGだとどうなるか? 
 +- [ステガノグラフィーの解析について](https://​digitaltravesia.jp/​usamimihurricane/​webhelp/​_RESOURCE/​MenuItem/​another/​anotherAboutSteganography.html) ステガノグラフィの原理について。わかりやすい 
 +- [PNG画像の圧縮について](https://​qiita.com/​jkr_2255/​items/​aa2487981e949728d190) 
 +- [きみはPNGの仕様書を読んだか?](https://​www.slideshare.net/​yamasy1549s/​png-80969068) PNGの仕様図解。わかりやすい 
 +- [stego-toolkit](https://​github.com/​DominicBreuker/​stego-toolkit)という便利そうなもののあるみたいです 
 +- Patchwork algorithm, ​ Transform Domain Algorithmという手法もあるみたいです 
 +  - [https://​pdfs.semanticscholar.org/​503a/​8cfe83a04f76e35d2aaf32e78ca89074a24e.pdf](https://​pdfs.semanticscholar.org/​503a/​8cfe83a04f76e35d2aaf32e78ca89074a24e.pdf) の3ページ目 
 +- [CTF Tidbits: Part 1](https://​medium.com/​@FourOctets/​ctf-tidbits-part-1-steganography-ea76cc526b40) 具体的に問題をとりあげて解説しています
ctf/lesson/第8回.txt · 最終更新: 2018/08/15 16:49 (外部編集)