【write-up】SECCON 2019 Online CTF【[misc]Sandstorm】
前略
この記事はwrite-upではありません。悪しからず。
......
....
..
.
事もあろうにSECCONと情報処理技術者試験がブッキングしてしまったので、SECCONの方はあまり触れていないが、少しでも触った問題については反省会でもしようかと。以下は触った問題一覧。
- [pwn]one
- [pwn]Sum
- [reversing]follow-me
- [misc]Beeeeeeeeeer
- [misc]Sandstorm
- [forensics]repair
- [crypto]coffee_break
割とまじめに取り組もうとした問題もあるし、ファイル落としてちょっと見ただけの問題もあるが、触ったことに変わりはないので取り合えず。まぁまぁまじめに取り組んだと思われる[misc]Sandstormあたりから反省会を行っていく。
嘆き
誰かのブログで自分のたどったプロセスを「嘆き」と表現していたのが気に入っているので、今後例に倣って「嘆き」を多用していくことにする。
とりあえず問題文からstegano系の問題だと思われたが、とりあえずbinwalkにかける。もちろん何も出ない。
次にtweakpngにかける。
第一印象はIDATチャンクがずいぶん多いということ。この記事を書いてる途中で「IDATチャンクの数は画像のサイズに依存するのでは?」とか思ったりしたが、63KBのSandstorm.pngのIDATチャンクの数が8つなのに対し、3KBのpngも43KBのpngもIDATチャンクの数が互いに1つだったのでどういうときにIDATチャンクの数が複数個になるのかはよく分からない。
とりあえずIDATチャンクを消したりして何個かpngを作ってみたものの、flagにつながりそうな情報は得られなかった。
解き方
この記事を見た。
バイナリエディタで最初のIDAT チャンクのlengthを
00 00 20 00
から
00 00 05 00
に書き換えてchromeで開いたら解けたらしい…
🤔???
補遺
png全体の構造は以下のようになっている。
最初だけpngのシグネチャで8bytes占めていて、以下、任意のチャンクが複数個並んで、最後は必ずIENDチャンクで終わっている。
チャンク全体の構造は以下の様になっている。
length:data領域が何byteであるのかを示す
type:チャンクの種類を示す。
data:データが格納されている。
CRC:誤り検知のための数値データ。
チャンクの種類は大きく必須チャンクと補助チャンクに分かれるが補助チャンクについては以下を参照。
必須チャンクは主にIHDR、IDAT、IENDがあるが、IHDRチャンクには画像サイズやカーラータイプなどの情報が格納されていて、IDATチャンクには圧縮された実際のイメージデータが格納されている(?)。IENDはpngの一番最後のチャンクに必ずいて、データの終わりを示す。
png完全に理解した
— Кодаира(コダイラ)(.🐧|.🐴💀) (@kodaira9723) October 20, 2019
再出撃
改めて渡された画像データを見てみる。
......
....
..
.
png何も分からん
— Кодаира(コダイラ)(.🐧|.🐴💀) (@kodaira9723) October 20, 2019
100歩譲って画像をブラウザで表示させようと思ったのは、出題時の画像の渡し方に違和感があったから理解できるにしても、なぜlengthを0x500にしたらQRコードが表示されると分かったのだろうか?0x543bytesのバイナリを見ても多分圧縮されたデータが格納されているだけで、データ長を書き換える根拠となるようなものは(僕の力では)確認できなかった。いったいどうやって解いたんだろうか?
まぁ、でも今回の問題でlengthを任意に書き換えることで埋め込まれたデータを取り出せることが分かったので、そのうち勝手にlengthを書き換えてくれるスクリプトでも書いてみようと思う(書いてみるとは言ってない)。
追記
VMwareを持っていれば、「仮想マシンの設定の編集」->「ネットワークアダプタ」->「詳細」->「発信転送」->「バンド幅」のところを適切にいじってからどこかに置いておいた画像を開くとQRコードが表示されるようです。(VMの方には環境が入ってないので肌やってない。適当な環境が用意出来たらやってみる予定。)