NCC Onsen-CTF 2018 Write-up

明治大学公認サークル[Nakano Computer Club](https://meiji-ncc.tech/)（NCC）の合宿で、2日間に渡って開催されたOnsen CTFのWrite-upです。
チーム割りが良かったのか1位になれましたが、途中で追い抜かれそうになってかなり焦りました。
flagの形式は`octf{hoge_hoge}`でした。
15問ほど解けたので、できるだけ書いていきたいと思います。
（多分変な解き方をしているので、参考程度でお願いします。）

![Scoreboard](https://gyazo.com/3aea50fc8778247cf4b5646d8bf092d1/raw)

#Misc
###Who know this code?
```
Flag: octf{11011110101011011011111011101111}
```
2進数を16進数に変換するだけです。面倒なのでGoogle先生に任せます。

```
octf{DEADBEEF}
```
###Flag Slot!!!
![Screenshot from Gyazo](https://gyazo.com/b419085468b7088989391e773696c71f/raw)
[問題ページ](http://octf.ga/q/06)のソースコードを見ると、p5.jsで動いてることがわかります。
配列に怪しげな数字が入っており、JSの関数`String.fromCodePoint()`に通されてスロットが回っている様子なので、そのまま配列の中身をコピペして関数に通してみます。

```js

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ファイルを普通のビューワーで開くと、マテリアルが適用されていないせいか片面しか見えません。
![Screenshot from Gyazo](https://gyazo.com/60c7628245ae922be4eda022ecdddc9e/raw)
Cinema4Dで開いたら、見辛いですが全て見えました。
![Screenshot from Gyazo](https://gyazo.com/e3101abe9dcc29e3e02587dd4e290b03/raw)

```
octf{5TL_M4G1C}
```
###It's Visible
2枚のノイズ画像が与えられます。なんとなく重ねて描画モードを乗算にしてみました。
![Screenshot from Gyazo](https://gyazo.com/09bf6e2d85e56a08ad6ad422539cc636/raw)
ここでは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回ぐらい更新したら出てきました。続きは[ぱいんつりー](https://twitter.com/_pinetreee)が解いてくれました。

```
octf{immediate_update_encrypting_is_interesting}
```
#Recon
###Europe
```yaml
How to capture flag:
  https://octf.now.sh/Europe?command=
# set correct command query
Hint:
  https://octf.now.sh/Europe/hint
```
ヒントのページにアクセスすると、URLエスケープされたヒントの1文字がランダムに返ってきます。

```json
{"index":21,"hint":"%E3%81%A8"}
```
[mayoneko先輩](https://twitter.com/mayoneko_fms)曰く、now.shのサーバはいじめても良いらしいので、沢山リクエストを送ってみましょう。
Processingで、index順にhintを表示するプログラムを書いてみます。

```Java
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んです！
```
これを見てすぐに[ぱいんつりー](https://twitter.com/_pinetreee)が閃きました。
この問題のタイトルが「Europe」である理由が分かったらしいです。

[愛の歌が溢れ出てきて止まらねえんだよ!｜永野宗典 - ヨーロッパスタジオ](http://www.europe-studio.net/gmf/game/nagano/)

どうやら、このゲームでxを8回押したときに流れるセリフらしいです。
`https://octf.now.sh/Europe?command=xxxxxxxx`にアクセスします。

```
{"status":"success!","flag":"octf{tknmt}"}
```
大正解でした。NCCのCTF問題をクリアするにはオタク知識も必要みたいです。
#Network
###easy ping
問題の.pcapngファイルを、パケット解析ソフトのWiresharkで開きます。
パケット解析は一回もやった事がなかったので、Googleで使い方を調べました。
![Screenshot from Gyazo](https://gyazo.com/b154a3819df9e0f568e2b8907e1382bd/raw)

```
octf{ping_2_you}
```
###easy packet
同じくWiresharkで開きます。
![Screenshot from Gyazo](https://gyazo.com/71fbb437280c1d832ef85808267f5a96/raw)

HTMLが見え隠れしてますね。ファイル>オブジェクトをエクスポート>HTTPを選択し、エクスポートして.htmlファイルにします。imageタグのコメントアウトを外すと、Base64エンコードされた画像としてフラグが表示されます。
![Screenshot from Gyazo](https://gyazo.com/afac6d44cb90329bdb44140852e4933a/raw)
###I input the flag 1
Wiresharkで開きましたが、今回は様相が違いますね。USB経由で送られたパケットみたいです。
![Screenshot from Gyazo](https://gyazo.com/1893a9a8afd75428996d9984f3208f11/raw)
Leftover Capture Dataの3バイト目が怪しげなので、時系列順に並べてみます。

```
10 0c 10 12 15 0c 16 18 1d 18 0e 12
```
Google先生に聞いたらUSBキーボードの[Keymap](https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2)を教えてくれたのでそれと照らし合わせます。

```
octf{mimorisuzuko}
```
[三森すずこ](http://mimorin.com/)
###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をエディタ等で開いてみます。
![Screenshot from Gyazo](https://gyazo.com/a6e9783cef9b553eab8194ed7b455977/raw)

```
octf{master_Takahashi}
```
#Web
###READ SOURCE
ソースコードを見ると画像ファイルがあるので、覗いてみます。
![Screenshot from Gyazo](https://gyazo.com/8cb0e803e8de0d580ba7ef52ac96e400/raw)
#まとめ
初めてのCTFでしたが、問題もしっかり作られておりとても楽しかったです。
Cryptに関してはたまたま解法が思いついただけなので魔人ではありません。
（普段からIQテストっぽい問題が好きなので、それが生きたのかも）
パケット解析に関しては全く知識がなかったのですが、今回学べたのでいい経験になりました。