ぶちのブログ

競プロとCTFが趣味なWebエンジニアのアウトプットの場

BCACTF write up (前半)

はじめに

BCACTFにソロで出場しました。
結果は156位でした。ちょうどよい難易度でとても楽しかったです!

t.co

問題数が多かったのですが、雑に方針を解説していこうと思います。

解けた問題解説

survey

/.*/正規表現にマッチするflagを入力すれば通る。つまり何を打っても通る。

hello-world

問題文のflagを入力する。

net-cat

言われたとおりにnc challenges.ctfd.io 30126を実行すればflagが出力される。

wuphf

twitterinstagramとdiscardに書かれている文字列を組み合わせればflagになる。

executable

まず逆アセンブリする。randの結果が1ではないときにjumpするJNE命令があるので、JE命令に書き換えると、正解側に分岐できる。出力されるbrainfuckのコードを実行するとflagが出力される。

basic-numbers

2進数8つを1ビットとみなして、asciiコードから逆変換すればフラグになる。irb上で以下のように実行した。

a="01100010 00110001 01101110 01100001 01110010 01111001 01011111 01110011 00110000 01101100 01110110 00110011 01100100 01011111 01100111 00110000 00110000 01100100 01011111 01110111 00110000 01110010 01101011"
a.split.map{|n| n.to_i(2).chr}.join

cracking-the-cipher

シーザー暗号。irb上で以下のように実行した。

a="vjg rcuuyqtf ku ngctpkpi_ecguct_ekrjgtu_ku_hwp!"
26.times{|i|puts(a.chars.map{|s|('a'..'z')===s ? ((s.ord+i)%26+'a'.ord).chr : s}.join)}

tupperware

調べてみるとタッパーの自己言及式というものがあるらしい。与えられた数字を頑張ってアラビア数字に直して、Tupper's Self-Referential Formula Playgroundに入力すると、flagの画像が得られる。アラビア数字に直すところは愚直に頑張ったが、最終的にはサイトでの出力とのdiffを見ていくつか直した。

a-major-problem

Mnemonic_major_systemというものっぽいので、wikipediaの通りに数字に変換して、最後にasciiコードから逆変換すればflagになった。

split-the-red-sea

画像に文字列が埋め込まれていた。

strings redsea.png | grep bcactf

bca-craft

与えられたファイルをstringsに食わせ続ける。最終的には、

strings BCACraft/datapacks/bcacraft/data/bca/functions/flag.mcfunction

によってflagが得られる。

file-head

headerが壊れたpngファイルが渡される。Hex Fiendを使って8バイトのシグネチャ89 50 4E 47 0D 0A 1A 0Aに書き換えると、flagが書かれた画像を開くことができるようになる。

of-course-rachel

google documentを使って画像から文字を抽出する。抽出できた文字列をHex Fiendでファイルにすると、一部が壊れたpythonスクリプトが得られる。 スクリプトの大部分は関係のない部分で、flagとして埋め込まれている数字を文字列に変換する関数だけ実行すれば、flagが得られる(関数も部分少し壊れているので、空気を読んで修正した)

open-docs

docsファイルはzipとして解凍できる。多くのファイルがでてくるが、全てテキストエディタで開いて探すと、flagがある。

study-of-roofs

画像の中に別の画像が埋め込まれている。binwalkで抽出すると、flagが書かれた画像が得られる。

binwalk -e dem_shingles.jpg

corrupt-psd

壊れたpsdファイルが与えられる。ここをみてヘッダーを8BPSに書き換えると開けるようになる。

the-flag-is

Hex Fiendで開くと、streamで文字列を出力していそうな部分が二箇所あります。ascii85でdecodeするとflagが得られる。

疲れたので後半に続きます。