読者です 読者をやめる 読者になる 読者になる

ナカザンドットネット

Android Developer's memo

ksnctfとやらをやってみた1

※一部解答が貼ってあるのでこれからチャレンジする人は気をつけてね!

こんなツイートがRTで流れてきた。

主にコンピュータセキュリティに関する問題を出題します。(後略)
http://ksnctf.sweetduet.info/


せ、セキュリティ(;゚д゚)ゴクリ…
今まで見て見ぬ振りをし続けてきた分野なので、スルーしようかと思ってしまったのですが、なんだか大学時代の後輩たちがチラホラと取り組んでいるのが見えたので、流石にしっぽ巻いて逃げ出すのもダサいかなと一念発起。
とりあえず行けるところまで行ってみようということで取り組んでみました。

以下、回答に関するネタバレあり。

1. Test Problem

コピペするだけなので普通に終了

2. Easy Cipher

「やっぱり僕には暗号とか無理だよ・・・」とたっぷり10分ほど悲壮感に浸りながら色々試してたらあっさり解けた。
仕掛けはすぐに分かったんですが、コードに落としこむまでに凄く時間がかかりました。実装力ねーわー。
主な原因は、無理にLuaを使ったため。文字列を文字とかcharコードに変換するやり方が分からなくて無駄に時間を食いましたとさ。
以下、僕の解答導出コード。

-- 大文字/小文字を保ったままアルファベット順で13個分文字をずらす関数
-- (スペースとピリオドは対象外)
local shift_thirteen = function(str)

	if str:match("[a-zA-Z]") then
		local char_byte = 0

		if str:match("[a-mA-M]") then
			char_byte = str:byte() + 26 - 13
		else
			char_byte = str:byte() - 13
		end
		
		return string.char(char_byte)
	else 
		return str
	end

end

local probrem = "問題文"
print(probrem) -- 処理前の文章を表示

local result = ""

for i=1, #probrem do
	-- i番目の文字を抜き出し
	local char_str = probrem:sub(i,i) 
	-- 13個ずらす
	local minus13ed = shift_thirteen(char_str) 
	result = result .. minus13ed
end 

print(result) -- 処理後の文章を表示

出来上がった文章を読んでみると、ちゃんとこの暗号(?)のやり方にも名前があるんですね。
知ってれば一瞬で解ける系だったんだろうなあ。

3. Crawling Chaos

一瞬で心折れたので終了。
な、な、な、なんなんだ。なんなんだヤダヤダ。
Nyaruko言語でも通せばいいのかと思ったけどそうでもないらしい。
また今度取り組んでみます。

2012/6/2追記 解けました

8. Basic is secure?

Basic認証の仕組みを知っていれば、割と素直に解けちゃう系。
僕の中では2問目より簡単でした。
こんだけ簡単に見れるんだから、パケットが第三者に読まれる可能性があるときにBasic認証使っちゃいけませんな。

10. #!

AjaxにつかうURLのハッシュかと思いきやそうではなく、スクリプト言語の1行目によくあるアレ。
知らなかったのでググってしまいました。半分負けみたいな気分。

シェルスクリプトであれば1行目に #!/bin/sh と書くと思うのですが、1行目の名前や挙動についてよく分かってなかったので調べてみました。
いまさら聞けない、#! で始まる1行目の名前とenv指定時の挙動 - プログラマ 福重 伸太朗 ~基本へ帰ろう~

おまじないと思って書いてたけど、コメント欄を見た感じだと色々と仕様で決まってるんだなあ。
やっぱりおまじないというイメージが抜けないw


今回はこれにてお開き。