SECCON 2013 北海道大会に参加しました / writeup

SECCON 2013 北海道大会に参加してきました。

チーム dodododo ( @akiym さんと @goldcard さんと @ayako119 さんとのチーム)として参加してきましたが、足手まといマンになってしまってつらいです…

解いた問題

「スロットマシーン」(Web,300pt) と「熱いメッセージ」(Web,100pt) の二問です。

スロットマシーン

f:id:lmt_swallow:20131204142330p:plain

こういう問題です。これで所持金が $10,000,00 (もう一桁多い?)を超えれば flag が帰ってくる仕様でした。
状況を整理すると、

A:
・start ボタンを押すと、

 {
	"hash"	:	[keccak32で計算したhash,SHA-3かなんかっぽい], 
	"bet"	:	[任意の整数], 
	"action":	"spin"
} 

といったリクエストを投げる
・それに対してのレスポンスは、

 {
 	"status":"OK",
 	"result":[任意の三桁 or 二桁(1桁は確認してない) の整数],
 	"return":[あたりなら1以上の整数,はずれなら0(記憶が曖昧)
} 

となっていた。
・bet > 自分の持ち金 の時レスポンスは {"status":"error"}
B:
・スロットを止め終わった瞬間に、

 {
 	"hash"	:[リクエストと同様なhash], 
 	"action":"finish"
 } 

といったリクエストを投げる
・このとき

{
	"status":"OK",
	"amount":[当たり外れで増減した結果の残額]
} 

といったレスポンスが帰ってくる。

この時、bet は入力フォームにおいて1桁という制限がかかっていましたが、リクエストを直に投げる or HTML 書き換えてしまえば bet は bet <= 自分の持ち金 の範囲にすることが可能でした。
また、Bのリクエストを送るまではAで発行されたresult(スロットの出目)での当たり外れによるamountの増減はありません。(@akiym さんに教えてもらったようなもので、僕自身はほとんどといてない…)
ここから言えるのは、「とりあえずAのリクエスト投げて、あたりの時だけBのリクエストを投げれば、amountは上昇し続ける」ということでした。
以上、ここまでで攻略法はわかったので、あとはリクエストを投げるスクリプトを書くだけで終わりです。
Firefox のJSコンソールで書いたせいで手元に残っていませんが、Aのリクエスト投げて、result > 0 なら Bのリクエストを投げる、というスクリプトを書けば良いです。(これに手こずったのでプログラミング力無し)

熱いメッセージ

s=0 & (k=0 | k=-3)[ output(8+k); k:=k-3; s:=0; ]
s=0 & c < 2 [ output(12); c:=c+1; s:=0; ]
s=0 & c = 2 [ output(15); s:=2; ]
s=2 [ output(27); output(0); s:=3]
s=3 [ output(19-a); s:=4; ]
s=4 & a=0; [ a:=14; s:=3; ]
a=14 [ output(3); output(3); a:=1; ]
a<13 [ output(15); a:=a+1; ]
b=0 [ output(14); b:=100; ]

こういったPLMAM1と呼ばれる言語のスクリプトが渡されます。コレによる出力が Flag なんだそうです。
1. ググります。
2.[見つけました。](http://rikai.jst.go.jp/koushien/tournament/img/2013/jitsugi03_jitsugi_manual.pdf)
3.読みます。
4.紙とペンを用意します。
5.手動で走らせます。
6.出力: HELLO, SECCOOOOOOOOOOOON
やるだけでしたがスクリプト書くより早く解けたかなあと思います。


まとめ

この二問しか解いていません。(デデドン)
人権を得られずに迷惑ばかりかけた二日間ですが、やはり実際の会場でやる CTF は面白いですね。
精進します。
SECCON全国は高校入試(3/5だったかな?)との兼ね合いでまだ定かではありません…会えたら誰かお寿司奢ってください。


dodododo の他のメンバーの writeup

@ayako119 さんのwriteup
@akiym さんのwriteup
@goldcard さんのwriteup