2016年12月11日

SECCON 2016 online "PNG over Telegraph"

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

SECCON 2016 online CTFに参加された皆様、お疲れさまでした。
今回は初めて問題を作る側に参加させてもらい、たくさんの高評価を頂いてとても嬉しいです!

https://www.youtube.com/watch?v=Y6voaURtKlM


さて、このSECCON TOWERこと腕木通信の塔について、少しだけ解説をしようと思います。
(解き方については、解けたチームがWrite Upなどを公開してくれる...と思いますので)

腕木通信(Semaphore Line)は、18世紀末から19世紀にかけてフランスで考案されて使われた、世界で最初の大規模通信網です。 考案したのはクロード・シャップというフランス人で、フランスに存在する腕木通信の塔のことを「シャップの塔」と呼ぶこともあるようです。
そもそも「セマフォ(Semaphore)」や「テレグラフ(Telegraph)」という用語は、このシャップさんが考案しました。
この辺りの詳しい話は、各言語版Wikipedia(日本語, 英語, フランス語)あたりを参照してください。

https://ja.wikipedia.org/wiki/%E8%85%95%E6%9C%A8%E9%80%9A%E4%BF%A1
https://en.wikipedia.org/wiki/Semaphore_line
https://fr.wikipedia.org/wiki/S%C3%A9maphore_(communication)

この腕木通信を再現したのが、今回のSECCON TOWERです。


素材は割り箸と秋月電子で800円で売っているサーボモーター3個、制御はArduinoで行なっています。

背景には、私が撮影した桜島の写真をネットプリントでA3サイズに印刷して使っています。
DSC_4693 | 鹿児島大学教育学部より桜島を望む | Kei Yoshimura | Flickr

ちなみに土台の部分にはセ○ンカフェの紙コップを使用し、塔の質感を演出しています。


Arduinoのコードはこちら
9SQ/SECCON_TOWER: Semaphore tower (Chappe tower) made by Arduino

Serialで待ち受けるArduinoに対して、1文字ずつ文字を送ることで動作します。
送られた文字に対応する腕木の形は、基本的に フランス語版 Wikipediaに記載されているChappe Code表を基準にしています。


https://fr.wikipedia.org/wiki/S%C3%A9maphore_(communication)#/media/File:Chappe.svg

しかし、このコード表には J が存在しません。使われている腕木のパターンは 36通りしかないため、使用頻度の低い J は文献によっては I で代替されていたりしました。
とはいえ J と I が混同されると何かと不便なので、今回の SECCON TOWER では & を J として扱っています。
このことは、問題動画の冒頭で紙に書き写している文章の一部から、補完可能です。


WELCOME TO SECCON CTF.
WE HOPE YOU WILL ENJOY THE GAME.
GOOD LUCK.

これに、flagの入っている PNG 画像をBASE32エンコードして流しました。

なぜ、BASE32なのか... 前述の通り Chappe Code では、36通りの組み合わせが使われています。素直に考えると BASE36 という選択肢もあります。
しかし今回は様々な理由で BASE32 を使った方が都合が良いことが多かったので、そうしています。
(特に、冒頭の8文字をデコードするだけで PNG のシグネチャを得られるのが最重要でした)
参考: RFC 4648 - The Base16, Base32, and Base64 Data Encodings


というわけで、作問者側が想定していた正攻法な解き方としては...

1. 腕木通信であることを認識し、Semaphore、Chappe towerなどのワードからChappe Code表にたどり着く
2. 50分の動画から、対応表を元に文字に戻す。(この手段は問わない)
3. BASE32デコードする
4. PNGファイルが出てくるので、開く
5. flagをget

そう。この腕木から文字を復元する作業について、手段は全く問わないのです。
画像処理が得意な人は画像処理で解くもよし、機械学習で解くもよし、人力で解くもよし。

この点について、発案者のきくちゃん先生からの熱いメッセージがあります。
時間内に効率よく文字に戻すにはどうしたらよいか、という命題に対し、各々が持てるリソースをどのように配分して投入するか。手段は問わない。
それこそが CTF における問題解決能力の腕の見せ所だと思います。
もし何らかのプログラム的な手法で解くことだけを狙うなら、動画の長さは50分程度ではなく5時間くらいにしちゃいます。
むしろ画像処理や機械学習を使わないと解けない、と思いこませることこそがミスリードでした。
人力で読むにしても、ある程度コンピュータに手助けしてもらったり、様々な工夫や手法があると思います。

私が解くとしたら... 動画から各形のフレームを取り出して、同じ形状をしているものは同じ文字として... やはり人力でやると思います。
プログラムで解くと思わせて、実は人力が最短?(かもしれない)問題なのです。

ちなみに... こんな裏話もあったり。

それから、今年はQRコードがなかった!!というあなた...

flag の PNG画像 は QRコードなので、半分ぐらい入力すれば、それっぽい画像が得られます。
読み取りに失敗してQRコードが壊れてた? QRコードの復元は、みなさんお手の物、ですよね!

解けた方は、ぜひWrite upを書いてくださいね!


追記:この問題について記述されているWrite upを貼っていきます。

SECCON 2016 Online CTF に参加しました (Write-up) | monolog
http://blog.monora.me/2016/12/seccon-2016-online-ctf-write-up/

SECCON 2016 予選 - /home/cympfh/
http://cympfh.hatenablog.jp/entry/2016/12/11/215023

PNG over Teregraph - TomoriNao SECCON 2016 Online
https://hackmd.io/s/SJVWBNtXx

SECCON TOWER 参加記のようなもの - Unpronounceable Name
http://tatarhy.hatenablog.jp/entry/2016/12/16/014821

SECCON 2016 Online CTF Write up PNG over Telegraph - Qiita
http://qiita.com/Liesegang/items/f6ac10b18064906a3808