KSNCTF#3 Crawling Chaosを解く

今回は
http://ksnctf.sweetduet.info/problem/3
を解きます。
![screenshot-ksnctf.sweetduet.info-2019.07.14-16_39_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/f52898a9-b970-cd21-dc1a-ae98e1cd80b4.png)

問題とか何も書いてなくただ
http://ksnctf.sweetduet.info/q/3/unya.html
のURLだけ。

開くとこんなページに
![screenshot-ksnctf.sweetduet.info-2019.07.14-16_40_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/bc9a7964-378d-5066-87d1-27930044ab13.png)

入力できる場所あるので適当に入力して見たら
<img width="1280" alt="スクリーンショット 2019-07-14 16.49.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/da083942-b744-9fa8-c27b-8726d50c4921.png">
NOって言われました。

とりあえずヒントを探すために右クリックから要素でデバック画面を開く
htmlを全部出してみると
<img width="1280" alt="スクリーンショット 2019-07-14 16.57.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/345ad752-72bd-d53b-66e0-eda09995d511.png">
なんかめっちゃうーにゃー言ってる...

わからなかったらGoogle検索したらこんなサイトを見つけた
![screenshot-sanya.sweetduet.info-2019.07.14-17_18_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/fd6fe04d-a577-c152-cdc9-4b711920e3a1.png)

Javascriptをうーにゃーに変更してくれるみたい。
とりあえずページ内のうーにゃーをconsole出力してみる
console.log(うーにゃー)

エラー・・・
<img width="553" alt="スクリーンショット 2019-07-14 17.20.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/ec284efb-fe5e-56bc-4952-0842c2a2d1cb.png">

最後の+と...をとったらエラーは消えてなんか出てきた

<img width="556" alt="スクリーンショット 2019-07-14 17.21.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/5c1392ed-b1ef-6744-8a51-7c2adcc2557d.png">

uから始まるこれはUNICODE
なんか特徴的だったから覚えてた。

前回使った
https://cryptii.com
を使ったらなんかうまくいかない・・・
![screenshot-cryptii.com-2019.07.14-17_24_39 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/c3fe6c3d-8780-d458-4d05-4b7df741c372.png)


別サイトでやってみたらうまく行った
https://www.kwonline.org/u_esc_seq.php
![screenshot-www.kwonline.org-2019.07.14-17_25_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/b65b2b4c-1102-0bf6-7e46-8cbe669f85aa.png)


```javascript
$(function ()
 { 
     $("form").submit(function () { 
         var t = $('input[type="text"]').val(); 
         var p = Array(70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449); 
         var f = false; 
if (p.len
```

なんか・・・・足りてなくね・・・
ここで1時間ぐらい悩んでました。

色々と試してふと直接保存してscriptをみてみたら
<img width="334" alt="スクリーンショット 2019-07-14 17.36.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/f40c696b-13ad-b008-26a8-645f805b3bde.png">

unya.htmlが2万文字超え
ブラウザが1万文字

あれ・・・・データが途中までしか表示されてませんでした。

Chrome側の仕様なのかな？

unya.htmlのほうのうーにゃーをconsole.log()してみると
<img width="546" alt="スクリーンショット 2019-07-14 17.39.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/75cbf0f1-c206-1d4c-aa71-42f1f3b676b5.png">

ソースコード付きで帰ってきました。

綺麗にみやすくしたのがこれ

```javascript
$(function () {
    $("form").submit(function () {
        var t = $('input[type="text"]').val();
        var p = Array(70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449);
        var f = false;
        if (p.length == t.length) {
            f = true;
            for (var i = 0; i < p.length; i++) {
                if (t.charCodeAt(i) * (i + 1) != p[i]) {
                    f = false;
                    if (f) {
                        alert("(」・ω・)」うー!(/・ω・)/にゃー!");
                    }
                }
            }
        }
        if (!f) {
                alert("No");
            return false
        }
    });
});
```

とりあえず必要な情報だけ取り出しましょう。
というかpとfしかいらないですよねこれ

```javascript
$(function () {
    // $("form").submit(function () {
        // var t = $('input[type="text"]').val();
        var p = Array(70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449);
        var f = false;
        // if (p.length == t.length) {
            f = true;
            for (var i = 0; i < p.length; i++) {
                if (t.charCodeAt(i) * (i + 1) != p[i]) {
                    f = false;
                    if (f) {
                        alert("(」・ω・)」うー!(/・ω・)/にゃー!");
                    }
                }
            }
        // }
        if (!f) {
                alert("No");
            return false
        }
    // });
});
```
大事な部分
charCodeAt(i) * (i + 1) != p[i]

charCodeAtは文字を数字にするものらしい。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt

ということはあのプログラムはpに当てはまる数字の文字であれば正解を返してくれるという感じ

なのでpを文字に置き換えるプログラムに書き換える。
文字→数字はCharCodeAt
数字→文字はfromCharCode

ここからはもう簡単

``` javascript
        var p = Array(70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449);
        var f = true;
            for (var i = 0; i < p.length; i++) {
                console.log(String.fromCharCode(p[i]/(i+1)))
            }
```
このコードを
http://ksnctf.sweetduet.info/q/3/unya.html
のConsoleで打ってやれば
<img width="1280" alt="スクリーンショット 2019-07-14 18.18.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/1dd36e02-e0e3-33f0-97c5-804482889369.png">

FLAGが出てきました。

あとはこれを入力すれば
![screenshot-ksnctf.sweetduet.info-2019.07.14-18_20_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262914/1cc110de-30e6-9e20-a79b-e125bb0cd89e.png)

GG

htmlをそのままダウンロードしないといけないのに注意すればあとは楽そう。