datchの日記

気がついたら社会人。気になる技術的なことについて少しずつ書いていけたらと思っております。

【SECCON2014】予選に参加した話

どうも、最近研究をしなければいけないけど、どうアプローチしていいのか分からずに四苦八苦している者です。
以前、セキュリティ関連の講義に参加したということで今回はSECCON2014予選 7/19(土)に参加しました。
ということで今回はそのお話。

参加した経緯



セキュリティ関連の特別講義*1に参加したいのでどれだけ力が付いたか試したいし、そもそもセキュリティ系のコンテストってどんなことするか分からなかったので問題の内容を知りたいというのもありました。
一緒に講義に参加した後輩を誘いましたが、その日は駄目ということで一人で突撃。
そもそも参加しようとしたのが、3日前の7/16(水)で周りの人を誘うのにも勉強時間もなければ、そもそも出る問題すらも把握してなかったので、仕方なくですね。

結果



まずは結果からですが、練習問題を覗いて一問しか解けなかった(´;ω;`)
個人参加だった点や、初めてのセキュリティ系コンテスト、問題の下見という意味合いが強く、解けない問題はすぐに諦めてしまったのが敗因。
頑張ればもう数問は解けたかもだけど、やはり中途半端な気持ちでコンテストには参加してはいけないということですね。

問題内容



さて、問題が1問しか解けないということでそんなに難しい問題だったのか?と知りたい人も居ると思うので自分が触れた問題とそのアプローチを振り返っていきたいと思う。

練習問題

問題の形式はCTF(Capture the flag)で与えられたファイルや問題文からflagという文字やそれに類する物を探して、そこから答えとなる文字列を見つけるというもの。
その練習問題として問題文にこのように与えられているのでそれを入力するだけ。

FLAG{seccon2014}

このパケットを解析せよ

pcap拡張子のファイルが置かれていたので、Wiresharkを使用して通信の中身を見てみる。
見てみるとどうやらFTP通信を行っているようで、パスワードやIDがもろ筒抜けだ。
しかし、そこが重要ではなく更に見てみるとflag.txtというファイルをやり取りしているのが見えた。
その次のTCP通信で行っているデータの中身が、「RkxBR3tGN1AgMTUgTjA3IDUzQ1VSM30=」となっておりそれをそのまま入力。
それは当然弾かれたので、ハッシュ関数で生成されたものかと思い、ハッシュ解析を使ってみるが駄目。
ここで既にアイディアが無くなり諦めて次へ。

詰将棋

以下のような画像が与えられた。

独自の動作をする駒が加えられた、特殊な将棋のようだ。
将棋とか小学生の時に嵌って以来、全然やってないや。
スクリプトを書かないほうが早そうなので頭で考えた。
以下の手順で正解かと思ったが、銀では詰めず…

  1. 22銅
  2. 12王
  3. 5特
  4. 同王
  5. 10金打
  6. 6又12王
  7. 11金
  8. 同王
  9. 10平
  10. 16王
  11. 15金
  12. 23王
  13. 29銀

金が欲しい、と思ってグヌヌしてたら金を残す方法があったみたい。
ほとんど正解だったので惜しいし、粘り弱すぎだよ自分。

x86アセンブラを読もう

以下のようなアセンブラが記述されている。

PUSH EBP
MOV EBP,ESP
SUB ESP,8
MOV DWORD PTR SS:[EBP-4],0
MOV DWORD PTR SS:[EBP-8],1
JMP SHORT test.0136101F ($+$にジャンプ)
MOV EAX,DWORD PTR SS:[EBP-8] <span style="color:#ff0000">$@$</span>
ADD EAX,1
MOV DWORD PTR SS:[EBP-8],EAX
MOV ECX DWORD PTR SS:[EBP-8] <span style="color:#ff0000">$+$</span>
CMP ECX DWORD PTR SS:[EBP+8]
JG SHORT test.01361032 ($-$にジャンプ)
MOV EDX DWORD PTR SS:[EBP-4]
ADD EDX DWORD PTR SS:[EBP-8]
MOV DWORD PTR SS:[EBP-4],EDX
JMP SHORT test.01361016 ($@$にジャンプ)
MOV EAX,DWORD PTR SS:[EBP-4] <span style="color:#ff0000">$-$</span> 
SUB EAX,2
MOV ESP,EBP
POP EBP
RETN
...
PUSH EBP
MOV EBP,ESP
PUSH ECX
MOV DWORD PTR SS:[EBP-4],0
PUSH FF
CALL test.01361000(上の関数に移動)
ADD ESP,4
MOV DWORD PTR SS:[EBP-4],EAX
MOV EAX DWORD PTR SS:[EBP-4]
PUSH EAX
PUSH OFFSET "FLAG{%d}\n"
CALL DWORD PTR DS:[<&MSVCR100.printf>]
ADD ESP,8

これ、先週、先々週の記事でアセンブラを眺めてなかったらおそらくそっ閉じの問題だった。

main(下のアセンブラ)で上の関数を呼び出し、その結果をprintfするプログラムだとすぐに気づいた。
じっくりアセンブラを呼んで見ると上の関数で参照している変数は全部で3つで名前を以下のように定める。

  • SS:[EBP-4] -> sum
  • SS:[EBP-8] -> counter
  • SS:[EBP+8] -> limiter

既に名前でどのような役割か気づいた人も多いかな?
やっぱり名前をつけると分かりやすいね。命名って大事!
それぞれをアセンブラで眺めると以下のようになっているのが読み取れる。

  • adder = 0
  • counter = 1
  • limiter = 0xFF (255)

そして、さらに眺めてみると以下の比較でループを抜けるかどうか、という処理をしているのが分かる。

CMP ECX DWORD PTR SS:[EBP+8]

どうやらlimiter以下の時にループし続けるようだ。
後はこれをソースコードの形式に落とし込めばおk.

sum = 0;
counter = 1;
while(counter < 0xff)
{
  sum += counter;
  counter++;
}
sum -= 2;

// FLAG{32638}

唯一、これだけ解けました。

箱庭SQLiチャレンジ

アプリケーションが渡されたので実行すると、番号を入力するボックスと実行ボタンのみがある。
どうやらIDの検索キーを入力するようだ。
SELECT文を使用しているので、後は全件表示を行ってみる。
以下の値を入力してSQLインジェクションを行ってみた。

SELECT * FROM なにか WHERE id = '1' OR 'a' = 'a';
-- 入力値 : 1' OR 'a' = 'a

が、5件しか情報が出てこない…
これから先どうすればいいか分からない。
てっきり、全件表示すればFLAGが出てくると思ったが…
諦めた。

箱庭XSSチャレンジ

以下の様なHTMLが与えられるので、指定のフォームにalert('XSS');のダイアログを表示させられるようにXSSする文字を入力すればおk。

<html><body>
「XSS」と書かれたalertボックスを表示させてください。<br>
<form action="http://www.example.jp/" method="get">
<input type="text" name="p" style="width:80%" value="">
<input type="submit" value="Send">
</form>
</body></html>

ただし、使用した文字が次に使えなくなっていく。
まずは大人しく以下を入力。

"><script>alert('XSS');</script>

すると次の段階では以下の文字が使用禁止になる。
「script」「alert」「XSS」。
次は以下のようにソースコードを難読化し、デコードする手法を用いてXSSを行った。

"onmouseover="
var code = '';
var t = '097108101114116040039088083083039041';
for(var i = 0; i < t.length; i+=3)
{
	var c = t.substr(i, 3);
	c = String.fromCharCode(c);
	code+=c;
}
eval(code);"

そしたら、次は以下が使用禁止になった。
「script」「alert」「XSS」「onmouseover」「code」「t」「097108101114116040039088083083039041」「for」「i」「0」「length」「3」「c」「substr」「String」「fromCharCode」「eval」
色々禁止しすぎだろうwww
もう分からん。むりぽ

重ねてみよう

アニメーション付きのgif画像があり、それを重ねて欲しいらしい。
よっしゃ、こりゃ画像処理じゃないか!
俺の出番来た!勝つる!
OpenCV使って実行しようとしたら、分解したgif画像が読み込めない。
調べてみたらgifは対応していないようだ。
だから、jpg変換した。
そたら、エラー出た
いみわからな
もうだめ
うま かゆ

参加してみて



前日にBacktrackLinuxなどでセキュリティ診断ツールを色々と用意してましたが、正直ほとんど使いませんでした。
問題の内容がある程度の低レイヤーの部分の知識を要求される問題が多く、なかなか苦労しました。
今回は非常に残念な結果になったのもあったり、ランキングがリアルタイムで更新されているのを見ていて、自分の無力さを思い知りました。
この感覚、競技プログラミングやっていた時にも味わいましたが、やはりいきなり頂上の実力を見せつけられると色々と来るものがありますね。
反面、自分に対するおごりなども無くせて良い作用もあったりします。
紹介出来ない問題では競技プログラミングみたいな問題もあり、また競技プログラミング再開したくなりました。
来年は社会人になりますが、チームを組んでガチで参加したいと思います。

終わりに



昨年、先輩たちが参加したISUCON2014が今年もあるみたいなので是非参加したいです。
ということで、内定者の方で一緒にチームを組んでくれる方を募集しています。

*1:というより、有料のセミナー