明治大学公認サークルNakano Computer Club(NCC)の合宿で、2日間に渡って開催されたOnsen CTFのWrite-upです。
チーム割りが良かったのか1位になれましたが、途中で追い抜かれそうになってかなり焦りました。
flagの形式はoctf{hoge_hoge}
でした。
15問ほど解けたので、できるだけ書いていきたいと思います。
(多分変な解き方をしているので、参考程度でお願いします。)
#Misc
###Who know this code?
Flag: octf{11011110101011011011111011101111}
2進数を16進数に変換するだけです。面倒なのでGoogle先生に任せます。
octf{DEADBEEF}
###Flag Slot!!!
問題ページのソースコードを見ると、p5.jsで動いてることがわかります。
配列に怪しげな数字が入っており、JSの関数String.fromCodePoint()
に通されてスロットが回っている様子なので、そのまま配列の中身をコピペして関数に通してみます。
String.fromCodePoint(111,99,116,102,123,85,110,105,99,111,100,101,95,105,115,95,86,101,114,114,114,121,95,70,117,110,125);
目押しで止めたり動画撮ってコマ送りにしたりする方法もあるみたいです(笑)
この方法なら10秒ぐらいで解けますね。
octf{Unicode_is_Verrry_Fun}
#Stego
###Do you see the truth?
問題のSTLファイルを普通のビューワーで開くと、マテリアルが適用されていないせいか片面しか見えません。
Cinema4Dで開いたら、見辛いですが全て見えました。
octf{5TL_M4G1C}
###It's Visible
2枚のノイズ画像が与えられます。なんとなく重ねて描画モードを乗算にしてみました。
ここではAEですが、PhotoshopでもProcessingでもなんでも良いです。
octf{45_1T_15}
#Crypt
###foolproof
ixrd`dubfwe?ua?akuoows?dein?jwt*
キーボードに注目してみると、最初の4文字がoctfだとするとiの右がo、xの右がc...といった感じで解けます。
ホームポジションが一つ右にずれた形ですね。
octf{finger_is_slipped_from_key}
###Nyctereutes procyonoides
6aatfta6aa3ta7tttt4tt66att7ttbaaaa53tt75at6aaaaaaattatatdt6ttdata6t5a72a5f5ttat6a6taa16t3ataa61taa74tttat69ttataatttaaa6atafa6attaet5faaat69ttaaa7ta35aatfttt73atatt6af5fttatt3ataattttaa6tta7tttttatatta2tt3t3tt617att42attt1ttatata7tttad
タイトルを日本語に訳すと「たぬき→tanuki→ta抜き」なので、tとaをエディタで置換し抜いてみます。
6f6374667b53756d6d65725f5661636174696f6e5f69735f736f5f3672336174217d
16進数が出てきました。URLエスケープの形式(%6f%63%74%66...)にしてアンエスケープしてみます。
octf{Summer_Vacation_is_so_6r3at!}
###Single Chain
Tikv ny i zcqghn jafjga otetvlss. Axwp csdfcw gvu zd bdoi zv bywhr ixve chibbhaugoc. Icc T gvxdb mbvp ge zqx xzpkt hugv eivbhvnv brzrwslxhxqi kbi srf hjp qnlwg my hb kwx. Hxrde D tphtf vsrkaprxr gvpj kxyho rn cg e npvc? Fus xzfm jb qtci d uxvjuox vg vzpxx wp z gkaii zmwdpzps. Wgk ztxkolf, lyzwa://sbcvbv.vih, fstqu://ehpxy.ob.yf, hl aqa. Jv qnmob lp sobycatl pl shpuh bnv xpeqa ebrq WOB. Vemn, qka'b hdvht kzx vjpudr urss. Bqo ryov zk ixpc{srz_dpxu_bqo_zrli_gjhvgaj}.
最初の方に注目してみます。
暗号: Tikv ny i...
平文: This is a...
(推測)
とりあえず、それぞれアルファベットの対応関係を考えてみます。
1文字目: T→T(変化なし)
2文字目: h→i(1文字後にずれている)
3文字目: i→k(2文字後にずれている)
4文字目: s→v(3文字後にずれている)
これより、n文字目ではアルファベットがn-1文字後にずれていると考えます。
ではflagを回収します。一番最後にflagっぽい文字列がありますので、この対応関係で解いていきましょう。
アルファベット表と紙があると解きやすいです。(というか本来はプログラム書くべきですがw)
ixpc{srz_dpxu_bqo_zrli_gjhvgaj}
1文字目: o→i(20文字後にずれている or 6文字前にずれている)
2文字目: c→x(21文字後にずれている or 5文字前にずれている)
...
octf{try_also_the_next_problem}
###Double Chain
問題ページに行くと5秒ごとに暗号が更新されるのですが、Single Chainと同じ法則の暗号がごく稀に出てくる事に気づきました。じっと睨んで待ちます。
ixpc{hmnggmfzl_dzomgs_ueukskpfmm_ju_mszlznceuau}
20回ぐらい更新したら出てきました。続きはぱいんつりーが解いてくれました。
octf{immediate_update_encrypting_is_interesting}
#Recon
###Europe
How to capture flag:
https://octf.now.sh/Europe?command=
# set correct command query
Hint:
https://octf.now.sh/Europe/hint
ヒントのページにアクセスすると、URLエスケープされたヒントの1文字がランダムに返ってきます。
{"index":21,"hint":"%E3%81%A8"}
mayoneko先輩曰く、now.shのサーバはいじめても良いらしいので、沢山リクエストを送ってみましょう。
Processingで、index順にhintを表示するプログラムを書いてみます。
String requestURL = "https://octf.now.sh/Europe/hint"; //hintのURL
String[] hints = new String[200]; //hintを格納する配列(長さは適当)
void setup(){
for( int i=0; i<300; i++ ){
JSONObject hint = loadJSONObject(requestURL);
hints[hint.getInt("index")] = hint.getString("hint");
}
for( int i=0; i<300; i++ ){
print(hints[i]);
}
}
そして、返ってきた結果がこちらです。
%E5%83%95%E3%81%AF%E3%81%AD%E3%80%81%E3%82%82%E3%81%86%E9%9F%B3null%E3%81%AA%E3%82%93%E3%81%8B%E3%81%A9%E3%81%86%E3%81%A7%E3%82%82%E8%89%AF%E3%81%8F%E3%81%A6%E5%90%9B%E3%81%AEnull%E3%81%A8%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%82%84%E3%81%91%E3%81%A9%E3%80%81%E3%81%A7%E3%82%82%E3%80%81%E3%81%82%E3%81%AE%E3%80%81%E3%81%9D%E3%81%AE%E3%80%81%E3%81%A0%E3%81%8B%E3%82%89%E6%A5%BD%E5%99%A8%E3%82%92%E6%8F%A1%E3%82%8B%E3%82%93%E3%81%98%E3%82%83%E3%81%AA%E3%81%8F%E3%81%A6%E3%80%81%E5%90%9Bnull%E6%89%8B%E3%82%92%E6%8F%A1%E3%82%8A%E3%81%9F%E3%81%84%E3%81%91null%E3%80%81null%E3%81%91%E3%82%8C%E3%81%A9%E3%82%82%E3%80%81%E3%81%A0%E3%81%91%E3%82%8C%E3%81%A7%E3%82%82null%E5%83%95%E3%81%AF%E3%82%82null%E3%80%81%E3%81%93%E3%81%86%E3%82%84%E3%81%A3%E3%81%A6%E9%9F%B3%E6%A5%BD%E3%82%92%E5%A5%8F%E3%81%A7null%E3%80%81%E5%90%9B%E3%81%AB%E8%A8%80null%E3%82%92%E4%BC%9D%E3%81%88%E3%82%8B%E3%81%9D%E3%81%AE%E8%A1%93%E3%81%97%E3%81%8B%E6%8C%81%E3%81%A3null%E3%81%AA%E3%81%84%E3%81%8B%E3%82%89null%E5%83%95%E3%81%AF%E5%90%9B%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E3%80%81%E6%AD%8C%E3%81%86%E3%80%81%E3%82%82%E3%80%81%E3%81%BC%E3%80%81%E5%83%95%E3%81%AE%E3%81%9F%E3%82%81null%E6%AD%8Cnull%E3%81%9Fnull%E3%82%93%E3%81%A7%E3%81%99%EF%BC%81
返ってくる結果がランダムなのでnullが入ってますが、支障はないでしょう。アンエスケープします。
僕はね、もう音nullなんかどうでも良くて君のnullとが好きなんやけど、でも、あの、その、だから楽器を握るんじゃなくて、君null手を握りたいけnull、nullけれども、だけれでもnull僕はもnull、こうやって音楽を奏でnull、君に言nullを伝えるその術しか持っnullないからnull僕は君のために、歌う、も、ぼ、僕のためnull歌nullたnullんです!
これを見てすぐにぱいんつりーが閃きました。
この問題のタイトルが「Europe」である理由が分かったらしいです。
愛の歌が溢れ出てきて止まらねえんだよ!|永野宗典 - ヨーロッパスタジオ
どうやら、このゲームでxを8回押したときに流れるセリフらしいです。
https://octf.now.sh/Europe?command=xxxxxxxx
にアクセスします。
{"status":"success!","flag":"octf{tknmt}"}
大正解でした。NCCのCTF問題をクリアするにはオタク知識も必要みたいです。
#Network
###easy ping
問題の.pcapngファイルを、パケット解析ソフトのWiresharkで開きます。
パケット解析は一回もやった事がなかったので、Googleで使い方を調べました。
octf{ping_2_you}
###easy packet
同じくWiresharkで開きます。
HTMLが見え隠れしてますね。ファイル>オブジェクトをエクスポート>HTTPを選択し、エクスポートして.htmlファイルにします。imageタグのコメントアウトを外すと、Base64エンコードされた画像としてフラグが表示されます。
###I input the flag 1
Wiresharkで開きましたが、今回は様相が違いますね。USB経由で送られたパケットみたいです。
Leftover Capture Dataの3バイト目が怪しげなので、時系列順に並べてみます。
10 0c 10 12 15 0c 16 18 1d 18 0e 12
Google先生に聞いたらUSBキーボードのKeymapを教えてくれたのでそれと照らし合わせます。
octf{mimorisuzuko}
三森すずこ
###I input the flag 2
I input the flag 1と同じように操作しますが、少し罠があります。1バイト目にLSHIFTキーを押している情報が入っているので、注意しながら解析します。
octf{USBKeyBoard}
#proce55ing
###GreatestClickMan
配布されたProcessingのコードを見てみると、millionMouse.jarを叩いてるみたいです。
正攻法では無いと思いますが、とりあえず.jarファイルを展開してみます。
$ jar xf millionMouse.jar
millionMouse.classをエディタ等で開いてみます。
octf{master_Takahashi}
#Web
###READ SOURCE
ソースコードを見ると画像ファイルがあるので、覗いてみます。
#まとめ
初めてのCTFでしたが、問題もしっかり作られておりとても楽しかったです。
Cryptに関してはたまたま解法が思いついただけなので魔人ではありません。
(普段からIQテストっぽい問題が好きなので、それが生きたのかも)
パケット解析に関しては全く知識がなかったのですが、今回学べたのでいい経験になりました。