BCACTF write up (前半)
はじめに
BCACTFにソロで出場しました。
結果は156位でした。ちょうどよい難易度でとても楽しかったです!
t.coBCACTFにぼっち出場してました(156位)
— ぶち (@betit0919) June 16, 2019
結構健闘したつもりです! pic.twitter.com/tASry0Dniq
問題数が多かったのですが、雑に方針を解説していこうと思います。
解けた問題解説
survey
/.*/
の正規表現にマッチするflagを入力すれば通る。つまり何を打っても通る。
hello-world
問題文のflagを入力する。
net-cat
言われたとおりにnc challenges.ctfd.io 30126
を実行すればflagが出力される。
wuphf
twitterとinstagramと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が得られる。
疲れたので後半に続きます。