車輪の再開発ブログ

Python & CTF Beginner!

picoCTF 2022 St3g0 writeup

コンテスト中に解けなかった問題の復習です。

問題文

Download this image and find the flag.

で、imageにリンクがついていて、画像が一枚与えられる。

ヒント

We know the end sequence of the message will be $t3g0.

解法1

foremostをかけてみたりしましたが、いまいち、どのツールもピント来ずに、解けませんでした。で、kusuwadaさんのwriteup picoCTF2022 [Forensics] writeup - 好奇心の足跡 を読む。なんと、画像に埋め込む系のツール一式が入ったやつがあるとのこと(全然知らなかったー)

github.com

とは言いつつ、今回は、そのstego toolkitの中にもある zsteg というツールだけでも解けるらしい。

github.com

(rubyの)gemがインストールするのに必要になる。(私のCTF環境は、macOSでDockerを利用)

apt -y install ruby-full

で、rubyをインストールして、

gem install zsteg

をする。これで、 zsteg が使えるようになった。

Usage: zsteg [options] filename.png [param_string]

    -c, --channels X                 channels (R/G/B/A) or any combination, comma separated
                                     valid values: r,g,b,a,rg,bgr,rgba,r3g2b3,...
    -l, --limit N                    limit bytes checked, 0 = no limit (default: 256)
    -b, --bits N                     number of bits, single int value or '1,3,5' or range '1-8'
                                     advanced: specify individual bits like '00001110' or '0x88'
        --lsb                        least significant BIT comes first
        --msb                        most significant BIT comes first
    -P, --prime                      analyze/extract only prime bytes/pixels
        --invert                     invert bits (XOR 0xff)
    -a, --all                        try all known methods
    -o, --order X                    pixel iteration order (default: 'auto')
                                     valid values: ALL,xy,yx,XY,YX,xY,Xy,bY,...
    -E, --extract NAME               extract specified payload, NAME is like '1b,rgb,lsb'

        --[no-]file                  use 'file' command to detect data type (default: YES)
        --no-strings                 disable ASCII strings finding (default: enabled)
    -s, --strings X                  ASCII strings find mode: first, all, longest, none
                                     (default: first)
    -n, --min-str-len X              minimum string length (default: 8)
        --shift N                    prepend N zero bits

    -v, --verbose                    Run verbosely (can be used multiple times)
    -q, --quiet                      Silent any warnings (can be used multiple times)
    -C, --[no-]color                 Force (or disable) color output (default: auto)

PARAMS SHORTCUT
    zsteg fname.png 2b,b,lsb,xy  ==>  --bits 2 --channel b --lsb --order xy

なんかいろいろあるけれども、 -a オプションが、tray all known methodsなので、最強そう。

# zsteg -a pico.flag.png 
b1,r,lsb,xy         .. text: "~__B>VG?G@"
b1,g,lsb,xy         .. file: dBase III DBT, version number 0, next free block index 3549684369
b1,g,msb,xy         .. file: dBase III DBT, version number 0, next free block index 3418965897
b1,b,lsb,xy         .. file: dBase III DBT, version number 0, next free block index 2623130757
b1,rgb,lsb,xy       .. text: "picoCTF{7h3r3_15_n0_5p00n_a9a181eb}$t3g0"
b1,abgr,lsb,xy      .. text: "E2A5q4E%uSA"
b2,b,lsb,xy         .. text: "AAPAAQTAAA"
b2,b,msb,xy         .. text: "HWUUUUUU"
b3,r,lsb,xy         .. file: gfxboot compiled html help file

結構、長い出力が現れる。最初の方に書いてあった。

解法2

せっかくなので、 stego-toolkit を使ってみる。Usageの手順に従う。

Docker pullする(結構時間かかる)。

docker pull dominicbreuker/stego-toolkit

イメージを起動。

docker run -it --rm -v /loca/path/to/picoCTF2022/stage/data:/data dominicbreuker/stego-toolkit /bin/bash

実行する。

check_png.sh pico.flag.png 

大量に出力が出てくるのですが、結局、zstegしか、ヒットしてなかった模様。