ユーザ用ツール

サイト用ツール


サイドバー

ctf:lesson:第8回

第8回資料

  • 2018/7/10 (オフライン回)
  • テーマ: 画像フォレンジック
    • 正直最近のCTFにはあんまり出てない気もしますがお手軽なのでやってみましょう

準備

  • java, stegsolve.jarをDL(ダウンロード)しておいてください
snippet.bash
$ wget http://www.caesum.com/handbook/Stegsolve.jar -O stegsolve.jar
  • 問題もDLしておいてください
snippet.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でファイルの詳しい情報を見てみましょう
    • このコマンドはどんなファイルにでも使えます
snippet.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の略)というのが入ってます
snippet.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  .....PLTE...@...
0000030: 174b 1c1c 1829 01fe 5713 022f 2e24 3d32  .K...)..W../.$=2
  • stegsolve.jarでいろいろ見てみましょう
    • $ java -jar /path/to/stegsolve.jarで起動して、出てきた画面のFileから操作します
  • Random colour mapを見てみてください(「>」を何回かクリック)
    • パレットの色をランダムに変えている
    • 何か浮かび上がってきましたね
    • 左のほうの文字列が見たい
  • パレットに入っている256色から1つだけ選んで白、他は黒とかにしたらハッキリ見えそう
  • スクリプトが転がってたのでこれ使いましょう(自分で実装したけどCRC32でエラーが出て取れない)
snippet.bash
$ wget https://raw.githubusercontent.com/ctfs/write-ups-2014/master/plaid-ctf-2014/doge-stege/change_palette.py
  • ここのコメントアウト(#paldataの#)を消します、コメントにもありますがこのスクリプトではパレットを全部黒にしたあと前の方から少しずつ白にしていきながら出力します
snippet.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)))
snippet.bash
$ for i in {0..128}; do python ./change_palette.py doge_stege.png "range-color-127+${i}.png" "${i}"; done

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)
snippet.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は関係ありません

発展・参考になる資料

ctf/lesson/第8回.txt · 最終更新: 2018/08/15 16:49 (外部編集)