SECCON finals 2016: 参加記
http://2016.seccon.jp/news/#140
チームBinary Oishiとして、ちひろさん, レンジさん, じょにーさんとの$4$人で参加した。 なお決勝進出はSECCON大阪大会での勝利による。
競技中の動き
1日目
せっかくのking of hillだしjeopardyはやりたくないこと、first bloodもないので後回しでも点数が変わらないことから、4人全員がjeopardyは無視する作戦をとった。
私はまず1問目を読んだ。 ジャンルがPPCならほぼ解けると見做してよく、その可能性があったのでこれをやる。しかし違ったので放棄。
5問目がヘブライ語でshellcodeという話だったので、レンジさんに代わってもらう。 見てみるとやれば解ける問題なのでやる。 しかし最近この手のをやってなかったのでとても時間がかかり、そのまま競技時間が終了する。
他の3人も特に成果はなく、1日目終了時で唯一の$0$ptのチームであった。
夜
ホテルでひたすらshellcodeを書いてた。 書けた。
2日目
書いたshellcodeを提出したら弾かれた。
バイナリの実行にはxinetd
の設定等が必要であったが、面倒がって雑にバイナリパッチを当てていたことによる環境の差異が原因。修正に少し時間は取られた。
defense keywordを書き込むと点数になるというルールであり、これをやってみたかったのでやった。
取得/送信の自動化もついやってしまった。
自動化しても残り時間から$40$点程度しか得られないとは分かっていたが、欲求に抗えなかった。
websocketなのでnpm install socket.io-client
してnodejs a.js
で実行。
var io = require('socket.io-client');
var socket = io.connect('http://10.0.1.1:8000');
function updateFlagword(data){
flagwords = data['flagwords'];
for (var i = 0; i < flagwords.length; ++ i) {
if (flagwords[i]['team_name'] == 'Binary Oishi') {
console.log(flagwords[i]['flagword']);
}
}
process.exit();
}
socket.on('flagword', updateFlagword);
socket.emit('flagwords');
ちひろさんがjeopardyのpwnを通す。 これで最下位を脱出。 私もjeopardyをする。revをひとつ通す。
終了間際、もうひとつのrevを見ると自明だった。 しかし時間が足りず、終了後5分経ってからflagが出た。
反省
- shellcodeを書くの遅すぎる
- (shellcode問は別だけど) jeopardyに集中すべきだったのでは?
他
成績について、あまりよくはなかったけれどking of hillができたので満足。
shellcodeの問題は、後から聞くと過去問の使い回しであり古いwriteupからコピペしてアドレスを修正すれば通るらしい: SECCON CTF 2014: Holy shellcode。 すごく楽しんで解いていたのに、これを聞いてなんだか悲しい気分になった。 そもそもこの手のshellcode芸のブームは2012年ごろで、2014年の時点で久し振りに見たと感じるようなものだったらしい。 この手のコーディングが好きな身としては、CTFを始めるのが遅すぎたように感じる。 ついでに類問DEFCON 2013: penserを紹介してもらったので、暇になったらやる。