まとめ
insecureというチームでSECCON九州大会に参加し、見事に優勝をかっさらいました。よかったです。
各チームの机には、小袋や中袋に入った電子機器(っぽいの)や配線キットが並んでいました。内訳は大体つぎのような感じです。
- Raspberry Pi (型番わからず)
- なんかよくわかんないモータとかトランジスタなど(みてない)
- Attiny13a (avrマイコン)
- AvrIsp Mark II
- PS/2←→USBな機器
- 24LC256(EEPROM)
- などなど
配線キットやテスタもありました。あとラジオペンチとニッパもありました。めっちゃいいやつを貸してもらったらしいのですが、私は触る機会が無くて残念。
さて、これはこれはとやばそうな感じがしてるし、私どこまで戦えるかなーという不安がいっぱいでしたが、いいところまで喰らいついていく自信はありました。チームメイトが強力だったので。
OPENING
今回のSECCON九州大会では、11チーム33名が参加するとのことでした。一人で参加のチームが2つもありやばかったです。あと、CTF for ビギナーズの方々がHIRUMADEとか言ってさらっと飛び入り参加してたのがやばやばでした。
さて、大会の形式ですが、Jeopardyというやつでした。全部で5問各100点で、それぞれの問題のFirst Blood には +10 pts されます。5問しか無いと点差がつきにくく、First Bloodを何個とれるか、というのも重要そうだなぁと思っていました。
ここから、WriteUpのようなものを書くつもりですが、詳しいことは、師匠のブログを見るといいかもしれません。
コンピュータ技術を学んでいくブログ: SECCON 2016 九州大会のWrite Upと感想
1 なんか水道局員になるやつ
関東は干上がっているので水道局員になりIoTで水の流れを制御するらしいです。問題自体は、「回路も機材もやるから、Raspberry Piでモータ動かせ」というようなものでした。師匠が経験と勘とでぼぎょぎょと組んだ回路とプログラムがいい感じに動いて、First Bloodをもらえた問題でした。詳しいことは師匠が書いてくれるはずです。
2 なんか特命を受けるやつ
酒場のような場所(ギルド?)でマイクロチップに入った特命を受けた私たちは……。
マイクロチップとは、ずばり 24LC256 のことです。これは、「EEPROM」という不揮発性のメモリらしいです。8本足の小さなムカデですが、32KBも容量あるらしいです。
ということで、これは、まず特命が何かを知って(ここで100pt)、その特命を果たす(これがまた100pt)という二段組の問題でした。
この問題のFirst Bloodは1時間しか参加しないと言っていたHIRUMADEで、開始40分とかでどこのチームよりも早くポイントを得ていました。
私達も随分あとになって続くことができました。最初は、師匠のPicKit2をつかってデータを吸い出そうとしましたが、これがうまく行かず、いろいろ試行錯誤して、私が持ってきていた、JapaninoというArduino互換機を使いました。
Google先生に尋ねれば、Arduinoで24LC256のデータを吸うような接続の例はたくさんあったので、ちょろっとコードを書いて(これも、ArduinoのエディタもってるテンプレートにEEPROMからデータを吸うものがあり、それを少しいじるだけでした。しかし、実際には、ググったさきで出たコードを使いました)、データを吸いました。
#include <Wire.h> #define disk1 0x50 void setup() { Serial.begin(9600); Wire.begin(); unsigned int address = 0; byte b = 0XFF; int flag = 0; while (address < 32 * 1024) { b = readEEPROM(disk1, address); if (b == 0xFF) { flag = 1; } if (flag != 0) { if (b == 0xFF) { flag += 1; if (flag > 4) { break; } } flag = 0; } Serial.println(b, HEX); address++; } } void loop() {} byte readEEPROM(int deviceaddress, unsigned int readaddress) { byte rdata = 0xFF; Wire.beginTransmission(deviceaddress); Wire.send((int)(readaddress >> 8)); Wire.send((int)(readaddress & 0xFF)); Wire.endTransmission(); Wire.requestFrom(deviceaddress, 1); if (Wire.available()) { rdata = Wire.receive(); } return rdata; }
256Bytesほどすって file してみると、どうやら tar gz ということがわかり、伸張しようとしましたが、エラーを吐かれました。ちゃんと最後まで取れていなかったようです(というのは後でわかって、しばらくは「こわれた tar.gz からデータを修復する問題に違いない」と思って時間をかけていました)。とはいえ、 xxx.txt というファイルが得られ、最初のフラグ SECCON{assemble this circuit}
が得られました。一緒に xxx.jpg というファイルが有るらしいということはわかったのですが、この時点ではデータは得られず、死んでいました。
ずっと後になって、forで256Byte吸っていたのを、while で無限に吸えば 32KB データが出てくることがわかり(このとき、256 Byte しか詰まってないと思っていた。なんか直感的にちっちゃいROMだしそうなのかな、と思っていた)、改めて tar.gz を伸張すると、下のような回路図が xxx.jpg であり、その回路を制御する Raspberry Pi 用のプログラム xxx.py が存在することがわかったのですが、これが終了10分前とかで、回路の作成、Flagの推測が間に合いませんでした。ちなみに、回路は乱数を生成するようなものらしいのですが、詳しくは多分師匠かthrustくんが書いてくれます。
完全に私の落ち度で100pt を失ってしまい、チームメイトには申し訳ないです。
3 Bad USB を拾うやつ
なんか秘密結社のうっかりさんが空港でひっかかって、あやしげなチップを押収したので解析せよとのことでした。これが Attiny13a です。これはどのチームも解いていたのですが、理由は簡単で、配布された資料の手順を愚直に実行すれば(Attiny13aをPCに接続しよう! プログラムを書き込もう! どんな動きをするかみてみよう!などが詳しく説明されていました)、FLAGが見える仕組みでした。
Attiny13a用のプログラムを解析する方法もあったようですが、これをやっているチームはいませんでした。
とにかく、ちゃんと手順通りにやって 100pt 入れました。PS/2 ←→ USB をしてくれる機器が不調で、機器を交換してもらってうまくいきました。
4 リモコンを妨害する奴
リモコンが効かなくなる現象を解消するという仕事を受けました。
実際にやることは、Raspberry Piの「赤外線受光モジュール」のようなものを用いて、リモコンを妨害している光を受け取り、それを解析することのようでした。
モジュールが死んでいてたり、回路が難しかったりしましたが、運営のHINTをたくさんうけ、光を解析することには成功していたようです。あとはDecodeだけのようでしたが、どの規格のものかわからず、Decodeできていなかったというのがつらいところです(これは師匠がきっと書いてくれる)。
おわり
というような問題を解いて5時間。スコアボードは以下のようになっていました。
感想
1(First Blood), 2[a], 3番の問題を解き 310 pts だった我々 insecure は、堂々の優勝となりました。まさか優勝できるとは、まるで思っていなかったので、(もう少しで解ける問題があったと悔しい思いをしながらも)とても嬉しかったです。チームメイトのそれぞれが活躍しており、いいバランスだったと思います。あと5分あれば、もう100点取れていたし、さらに10分もあれば全完できていたな……と思いました。そこは今後の課題ですね。
優勝したので、1月末に開催される SECCON Intercollege に今年度も出場できます。今年は、出場が決まった一番最初のチームになりました。やったー。
さらに、副賞として、Raspberry Piでめっちゃ遊べる本(英語。著者のサイン入り)を頂きました。部活で活用できたらいいな……英語読めないな……。