CyberRebeatCTF Write-up

概要

2018/9/8 15:00 ~ 9/9 15:00 に開催されたCyberRebeatCTFのwrite-upです

チームGrowthKeysとして参加しました(お疲れさまでした~)
一時は8位くらいまで上昇しましたが、最終順位は24位、3432ptでした

CTFに誘われたのが1週間前なのでバイナリも暗号も何もわかりません、Webと競プロだけをやりました(いつもやってることと大して変わらないじゃん)
少し遅れて参加したところすでに半分くらい埋まっていたのでやることがほとんどありませんでした

全完していないのでまずは強い人たちのブログを見てください

keymoon.hatenablog.com

kobaryo222912.hatenablog.com

ecasd-qina.hatenablog.com

https://shiho-elliptic.tumblr.com/post/177894007289/cyberrebeat-ctf-writeup

解法

White page(Web)

指定されたページに移動するとLOGINと書かれたボタンがぽつんとあります
idとpasswordを入力する欄が欲しいのでおもむろに開発者ツールを開きます(ChromeならF12です)
Elementsタブから要素を展開してみるとこうなります

f:id:miozune:20180909164732p:plain

style="visibility:hidden"が悪さをしている気がするので右クリックからEdit attributeなりEdit as HTMLなりしてこれを消します

f:id:miozune:20180909164913p:plainf:id:miozune:20180909164919p:plain

やったね

感想

それはそう

Visual Novels(Programming)

典型ナップザックDPらしいと聞いて見てみるとなるほどナップザックだ
入力が少し面倒なのでsplitでゴリゴリします(形式指定は桁の関係でバグりやすいので注意しましょう)
長さが与えられないので最後に'end'と手打ちします

W = int(input())
data = []
while True:
    s = input()
    if s != 'end':
        data.append(list(map(int, s.split(']')[0].split('[')[1].split(', '))))
    else:
        break
# print(data)
n = int(len(data))
dp = [[0 for j in range(10010)] for i in range(1000)]
for i in range(n):
    dp[0][i] = 0

for i in range(n):
    for w in range(W+1):
        if w >= data[i][0]:
            dp[i+1][w] = max(dp[i][w], dp[i][w-data[i][0]]+data[i][1])
        else:
            dp[i+1][w] = dp[i][w]

print(dp[n][W])

ncで自動実行する方法があるらしいのですが面倒なのでshellからコピペしました

感想

AtCoder400点易くらい?
picoCTFちょこっとやった時にncを触ってたのでよかった

Opening Movie(Misc)

  • おもむろにConsoleを開きます
  • 次のコードを叩きます
let i = 0;
const ctfrun = () => {
    document.getElementsByTagName('button')[0].click();
    i += 1;
    console.log(`clicked ${i} times!`);
    // 147秒だけど止まるのが怖いので
    setTimeout(ctfrun, 150000);
}
ctfrun();
  • 12時間ほど待ちます
  • flagが出てきます、やったね

想定解は他のブログを見てください(投げやり)

感想

24時間以内に終わるのは作問者の慈悲だなあと思いました(あるいはテスト不足)

感想

UploaderなりSignatureなり解きたかったです
Web触ってるのでセキュリティは身につけないといけないということを実感しました、ちょっとずつ精進していきたいです