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

2016年11月13日

AkiCartをちょっとだけアップデートしました

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

初めての東京の冬。いきなり寒くなって風邪気味です...

さて、6月に公開した、秋月電子通商のパーツで電子部品リストを作って一発で買い物かごに放り込めるサービス AkiCart について、少しだけ機能追加したのでご報告です。

1. パーツリストにコメント投稿できるようにしました
自分や他人が作ったリストに対してコメントを付けられるようにしました。
DISQUSを利用しています。(画像とかも投稿できます)
Qiitaのコメント欄やクックパッドのつくれぽ...みたいに使われれば理想的ですが、まぁ、とりあえず感想やら質問やらを書き込む場所としてお使いください。

AkiCartはリストの説明欄に特定のHTMLタグが使用可能で、説明や作り方などの記載もできるようになっています。
参考: ESP-WROOM-02でミニマルなIRKitクローンを作る | AkiCart

リストを公開する方も、完成後の画像や簡単なコード、GitHubリポジトリへのリンクなどを記入していただければ、もっと便利になると思います。(説明欄をリッチに使ってる人が自分しかいなくて悲しい...)
AkiCartだけで、パーツの一覧と個数、作り方、そしてコミュニティが完成すれば素敵だなぁと願っています。

2. 匿名公開を実装しました
今までは、リストの表示権限について3つ用意していました。

公開 : 誰でもリストを閲覧できる。トップページに表示される
限定公開 : URLを知っている人だけが閲覧できる。トップページには表示されない
非公開 : 自分以外は誰も閲覧できない。トップページにはもちろん表示されない

ここに新たに「匿名公開」という権限を追加しました。
匿名公開は、公開と基本的に同じですが、リスト作成者の名前が伏せられます。
アノニマス パーツ リストです。
リスト作って公開したいけど、自分の名前(Twitterアカウント)が晒されるのは嫌だ...という方は是非使ってみてください。

3. 検索機能を実装しました
簡易的ですが、検索することが出来るようにしました。
スペース区切りでAND検索できます。
現時点では、リスト名とリストの説明に含まれるキーワードで検索を掛けるため、リストに含まれている部品名では検索できません。(近いうちに対応させたい)
利用者のみなさん、リストに簡単で良いので説明を書きましょう!

4. HTTPSに対応しました。
Let's Encryptが正式サービスとなったので、これを使ってhttps化しました。
今のところ、まだhttpでもアクセス可能です。
近いうちにリダイレクトを掛けようと思っています。

とりあえず、こんなところです。

そのうちやりたいこと、としては
・パーツ1つに対して補足情報を付けられるようにする
・秋月電子以外にも対応(共立とか?)
などなど...

こんな機能が欲しいなどありましたら、このブログへのコメントやTwitter @9SQ で緩く受け付けています。


AkiCart

https://aki.prioris.jp/

2016年10月15日

e-statのshpを全国分取り込んで国交省の行政区域shpと比べてみる

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

久々にGISネタです。

国交省の国土数値情報ダウンロードサービスでダウンロードできる行政区域のShapefileは以前の記事でも取り扱いました。
国土数値情報 行政区域データは全国の行政界を記録したものですが、これは市区町村界レベルであって、大字(〜丁目)レベルの境界ではありません。(行政界なので当然なのですが)
そこで、現状無料で手に入る大字レベルのshpとして、総務省統計局のデータを利用してみることに。

e-Stat 政府統計の総合窓口

地図で見る統計(統計GIS) → データダウンロード → 国勢調査 → 平成22年国勢調査(小地域) 2010/10/01 → 男女別人口総数及び世帯総数 → 市区町村を選択 → 世界測地系平面直角座標系・Shape形式

これをダウンロードします。
ダウンロードするのですが... これを全国分となると、市区町村を選択してShapeを選んで...という作業をおよそ1900回繰り返さなければなりません。
一括でダウンロード出来ない理由は負荷軽減のためで、全国分欲しい人は地図屋からデータ買ってねという記載があるので、ちゃんと正攻法で買いましょう。
そもそも、このShapefileは数値情報を上に重ねたりグラフ化したりするためのもので、境界域を得る為に使用するものではありません。

...ただ、今回はスクリプト書いて全部ダウンロードさせてもらいました。(ごめんなさい)
一括ダウンロードのためのスクリプトは載せません。

結論としては、やはり地図屋から買った方がいいです。
しかし、同じことを企む人たちのために、何故そういう結論に至ったのか書き残そうと思います。

まずは、視覚的に比較するためにShapefileを取り込みます。
e-Statから手に入れたデータはzip化されてますので、まずは解凍。

unzip \*.zip

出てきたShapefileをQGISで結合します

1. ベクタ → データマネジメントツール → 複数のシェープファイルを1つに結合する
2. フォルダのレイヤによって選択する にチェック
3. 入力ファイルで .shpファイルを全て選択して、エンコードにSift_JISを選択 → Open
4. 出力シェープファイルで保存先を選んでエンコードにUTF-8を選択 → Save
5. OK で処理開始

この段階で結合されたshpができあがるのですが、CRS(測地系)がEPSG2454(JGD2000)になっていると思うので、今後扱いやすいようにEPSG4326(WGS84)で保存し直します。

1. 結合処理が終了して、レイヤに追加されたデータを右クリックして名前を付けて保存
2. パスに保存先を選び、CRSにEPSG4326(WGS84)を選択してOK

これで準備完了。


千代田区の大手町1丁目を選択してみました。
なんだか良さそうな雰囲気。

では、すこしズームアウトして湾岸部を見ましょう。


なんだか海岸線とは思えない鋭利なラインが目立ちます。
この上に国交省 行政区域データを重ねてみます。


どうやら、海域の一部も含まれているので、陸地の境界域として利用するにはイマイチでしょう。
(こういう海域が取り込まれている部分が全国の海岸部分に沢山あるので、1つ1つ手で除去とかアホみたいに時間掛かることはしません)

それと、もう1点。
これは統計局のデータではなく国交省のデータの問題なのですが...


中央の濃い赤は統計局shpの皇居、周囲の赤は国交省shpの千代田区です。
周囲の境界をよーく見てみると...


濃い赤の選択部分は統計局shpの八重洲1丁目、周囲の赤は国交省shpの千代田区です。
八重洲1丁目が千代田区と中央区に跨がっています。
こういうポイントが全国各地に山ほどあります。

どちらのデータに問題があるのか、原典として使われている地図を調べてみないと分からないですが、おそらく国交省行政区域データの方が粗いのではないかと思われます。
ベクタなので、点の数が増えれば複雑な形状にもフィットする境界を描けて、逆に点の数が少ないと簡素な境界しか描けません。
もちろん、点を増やせばデータサイズも増えます。

ということで、結論ですが...

1. 大字レベルのShapefileが必要なら地図屋さんから買いましょう。
2. 厳密な市区町村界が欲しいなら、購入した大字レベルのShapefileから市区町村レベルで地物の結合をして生成しましょう。

以上です。

普通、業務でこういったGISデータを利用されている方にとっては当然なのでしょうが、個人であれこれやるとぶつかりそうな問題だなぁと思ったので書いておきます。

2016年9月20日

ミニマルなIRKitクローンを作ってiOSから家電を制御する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
どうも、お久しぶりです。生きてます。

さて、iOS 10が配信開始されて新たに登場した「ホーム」アプリのおかげで、日本ではあんまり注目されてなかったHomeKitが熱くなってるみたいです。(個人的感想)

HomeKitではPhilips Hueを操作できたりするのですが、そもそも対応していない家電を対応させるためのDIY的手法も色々存在しています。
例えば、HomebridgeとIRKitを組み合わせた方法。
Raspberry PiにHomebridgeを入れて、homebridge-irkitでIRKitを叩くみたいなお手軽スマートハウスのやり方は検索すれば山ほど出てきます。
そしてここで使われるIRKit、赤外線リモコンの信号を送受信できるオープンソースハードウェアなのですが、大人気なんですね。
在庫切れ入荷予定無しで手に入らないんだけど(キレ)という声も周囲にチラホラあったり。

というわけで、欲しいけど無いなら作りましょう。
自分で作ると安いし、面白いですし...

回路はこんな感じ。

必要な部品は以下の通り。
ESP-WROOM-02でミニマルなIRKitクローンを作る



もしESP-WROOM-02とかブレッドボードとか抵抗とか...持ってるなら、赤外線LEDと赤外線リモコン受信モジュールだけ買っちゃってください。

私はオリジナルのESP-WROOM-02搭載ボードとプロトタイプ・シールド基板を作っているので、これを使ってサクッと作りました。


中身のソフトウェアはIRremoteESP8266とaJSONを使って100行程度で実現しています。
コードはこちら。
9SQ/minIRum: A minimal implementation of infrared sender/receiver like IRKit by ESP8266

Arduino core for ESP8266をArduinoに入れて、コードをビルドしてESP-WROOM-02に書き込んであげてください。

あとは、IRKitみたいに GET /messages で最後に受信したリモコンのコードが取得できるので、これをメモしておいて...
POST /messages にこれを投げてあげれば、リモコンと同じように発光してくれます。
もし、エアコンなどの長めのコードを飛ばすリモコンの場合は、IRremoteESP8266/IRremoteESP8266.hの#define RAWBUF 100を200とかにしてあげれば取れるかも。

あとはHomebridgeと組み合わせれば、このようなことが出来ます。

Raspberry PiにHomebridge諸々を入れるのは、検索すればいっぱい記事が出てくると思います。
ただ、Raspbianはapt-getで取れるnodeが古かったりするので、楽をしたいならArch Linux(RasPi2/RasPi3)をお勧めします...
pacman -S git python2 nodejs npm nss-mdns avahi
systemctl enable avahi-daemon
systemctl start avahi-daemon
npm install -g homebridge
npm install -g homebridge-irkit
mkdir .homebridge
cd .homebridge
nano config.json
config.jsonは以下のような感じで。
irkit_hostは適宜変更してください。
{
    "bridge":
    {
       "name": "Homebridge",
       "username": "B8:27:EB:4D:31:D7",
       "port": 51826,
       "pin": "031-45-154"
    },

    "accessories": [
        {
            "accessory": "IRKit",
            "name": "ライト",
            "irkit_host": "minirum-a492cd.local",
            "on_form": {"format":"raw","freq":38,"data":[3550,1700,500,400,500,400,450,1300,500,1300,500,400,450,1300,500,400,500,400,450,450,450,1300,500,400,500,400,450,1300,450,450,450,1300,500,400,450,1300,500,450,500,400,500,1300,500,400,500,400,450,450,450,450,450,1300,500,400,500,1300,500,1300,450,450,500,1300,500,400,500,400,500,400,450,450,500,1300,500,400,500,450,450,1300,500,400,500,400,450]},
            "off_form": {"format":"raw","freq":38,"data":[3550,1700,500,400,500,400,450,1300,500,1300,450,450,500,1300,500,400,500,400,500,400,500,1300,500,400,500,400,500,1300,500,400,450,1300,500,400,500,1300,450,450,500,400,450,1300,500,400,500,400,450,450,450,450,500,1300,450,1300,450,1300,450,1300,450,450,500,1300,450,450,450,450,450,450,450,1300,500,1300,500,400,500,400,450,1300,500,400,500,400,500]}
        }
    ]
}
ちなみに、この赤外線コードはPanasonic製のシーリングライトのON/OFFです。

homebridgeを立ち上げて、iPhoneとペアリングします。
homebridge
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] Loaded plugin: homebridge-irkit
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] Registering accessory 'homebridge-irkit.IRKit'
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] ---
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] Loaded config.json with 1 accessories and 0 platforms.
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] ---
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] Loading 1 accessories...
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] [ライト] Initializing IRKit accessory...
Scan this code with your HomeKit App on your iOS device to pair with Homebridge:
                       
    ┌────────────┐     
    │ 031-45-154 │     
    └────────────┘     
                       
[Tue Sep 20 2016 03:31:29 GMT+0900 (JST)] Homebridge is running on port 51826.

iOS 10のデバイスで「ホーム」アプリを起動して「アクセサリを追加」、Homebridgeが表示されるのでコードを入力してペアリングを完了させます。
Homebridgeを追加したら、configに書いたアクセサリ(上記例では「ライト」)が表示されると思うので、これを追加すれば制御できるようになります。

Raspberry PiでのHomebridgeの自動起動は以下を読むと早いです。
Arch Linuxなら、Running Homebridge on Bootup (systemd)のセクションです。
https://github.com/nfarina/homebridge/wiki/Running-HomeBridge-on-a-Raspberry-Pi

homebridge-irkitではON/OFFの単純操作しかできないので、そのうち色々なコードを叩けるhomebridgeのプラグインでも書こうかな...
ちなみに、Raspberry Piにhomebridge-cmdを入れて、GPIOにSSRを繋いであげれば、リモコンの無いAC100Vの機器もON/OFFできます。

2016年6月4日

秋月で買える電子部品でリスト作成して色々できるサービスを作った

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

大きな地震があったりでバタバタしてたら4月5月と過ぎて6月になっていました...
というわけで2か月ぶりのブログ更新。

タイトル通り、秋月電子通商で扱っている電子パーツでパーツリストを作成、公開、共有、そして秋月の買い物かごに一括して放り込めるWebサービスを作りました。

その名も AkiCart
http://aki.prioris.jp/
(ちょっとダサいネーミングだったかも)

そう、秋月通販をよく使っている人は知っている... 秋月の買い物かごはセッション切れで放置してるとすぐに消えることを...

そこで、このサービスでは秋月で扱っている商品をリストに登録して保存し、リストのページにある「まとめてカートに入れる」ボタンを押すことで、いつでも秋月の買い物かごに商品をまとめて登録できるようにしました。


Twitterでログインすると、ダッシュボードが登場、ここから新しいパーツリストを作成できます。
作成するパーツリストは、アクセスレベルが公開(Public)、限定公開(Unlisted)、非公開(Private)の3種類から選択可能。
公開を選ぶとAkiCartのトップページにリストされる(こともある)ようになり、限定公開を選ぶとリンクを知っている人だけが閲覧可能なリストになり、非公開は文字通り自分しか見れないリストができます。


商品の追加はリストの画面からもできるのですが...
AkiCartの一番の特徴は、超超超便利なブックマークレット。
秋月の商品画面でブックマークレットをクリックすると、一発で作成したリストに追加できます。


ブックマークレットをブラウザに追加しておくと、秋月のページでクリック→個数の変更がない場合はそのままEnterを押すだけでドンドン追加できます。
AkiCartのブックマークを押して登録完了するまで最短2秒くらい。


作ったリストは一括して買い物かごに入れるだけでなく、CSV形式でダウンロードしたり、印刷専用のレイアウトで印刷することもできます。
高専とか大学とかで、事務の人に「これ買ってください」って渡すのも楽チンですね。

〜ここからはちょっとだけ技術的な話〜

今までは、買いたい商品のページをブラウザでブックマークしておいて、買うときに一挙に開いてカートに追加するという作業で購入していました。
流石にこれどうにかならんのか?というのと、何やら秋月の一括通販コード入力画面はリファラをチェックしてないから別サイトからPOSTできるという話を聞きまして...


一括通販コード入力画面からの遷移を見てみると、いつものカート画面(cart.aspx)に対して quick: True を指定して、あとはclass1_xに通販コードのハイフンの左側の英字1文字、goodsにハイフン右側の数字5文字、そしてqtyに数量を入れて、これを繰り返したものをPOSTしてあげればカートに入ることが分かりました。
そしてやはりリファラをチェックしてないので、このページ以外からPOSTしても普通にカートに入ることも確認。
これらを元にして、AkiCartができた...という訳です。
ちなみに、AkiCartの任意のリストページのソースを見ると、まとめてカートに入れるボタンの近くにtype="hidden"でいっぱいinputが転がってますw

バックエンドはEVI(地震火山詳報)でも使っているDjango(Python)です。
ここ数ヶ月触ってなかったので結構忘れてて、調べながらコード書いてたので時間が掛かりました...
6/3のAM2時頃に作り始めて、途中寝たり飯食ったりした時間を抜くと15時間くらいかな...?
バグとかセキュリティ的なアレを発見したら、Twitterでリプライ頂けると非常にありがたいです。

早速要望として、リスト間で商品を移動できるようにしたいとか、リストをブログなどに埋め込めるようにしたい、という意見が出ているので、ぼちぼちアップデートしていきたいと思います。

これとは別件で、そこそこ実用的かつ面白いものづくりのプロジェクトも進んでいるので、また報告できるタイミングになったらブログなどなどに書きたいと思います。

追記 : ブログパーツ(埋め込み用コード)できました。


公開もしくは限定公開のリストであれば、リストページの右サイドバー下に「埋め込みコード」の欄があるので、これをコピーして貼り付ければOK!

Recent Photos from Atelier (Flickr)

作業場で撮影した写真をアップロードしています。記事にする前の試作なども公開中です。