CTF（Crawling Chaos）のwriteupを書いてみた

## 備忘録
問題を見るとリンクがあるので飛んでみる。
![DB973E20-7381-4FFC-ADBD-153E7D47C842_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/11e99b07-a7e7-46a3-a5b4-127f15100995.jpeg)

テキストボックスに入力しても何も変化がないので、開発者ツールでネットワークを調べる。
![C60A114E-208D-464A-A251-047AC122740D_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/57686c1c-de35-433c-814e-fb52b249448f.jpeg)

すると、jquery.min.jsがブロックされている。
![0A1DA3BB-6B74-4A7F-AD5D-A51C53025592_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/d2bc793a-6b21-4c10-8967-1226d6947372.jpeg)

どうやらjquery.min.jsはAPIにアクセスしているみたい。
![CB9182D0-A2B0-4D46-B9C7-17F1EF53F2F0_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/98c9d316-55a5-46f1-a26d-b0c14ac01611.jpeg)

ソースコードを見ると、scriptタグで意味不明の「う〜にゃ〜」が出てくる。調べると、これはJSを難読化しているらしい。
![711D2AE0-5D68-4E7E-9896-F56120F31B74_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/405b7b9b-01d1-405d-a7eb-ad034a363552.jpeg)

続いて発生しているエラーを調べてみる。これは、今見ているWebサイトがHTTPSなのにAPIへはhttpでアクセスしてるよってエラー。つまり、APIへHTTPSでアクセスすればいいと予想できる。
![15EF56A2-1DB0-4296-99CD-01F205C3914D_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/0f393229-45ce-4184-8d33-fc09fdf0f750.jpeg)

とりあえずAPIにHTTPSでAPIにアクセスするようエディターにソースコードをコピペしローカルでブラウザ起動（最初は左下のGo Liveでサーバーとして起動したため、src部分が相対パスで認識されうまくアクセスできなかった…）
![39CF9D87-0214-49F8-A522-9B98823305C9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/de699025-cda4-453b-9be9-d0a5aca4a2ad.png)

テキストボックスに入力すると無事アラートが出るように！
エラーも消えてスッキリしたが、「う〜にゃ〜」は謎のまま。
![55D4A78A-D203-4D6F-89D9-EA6DA0C8DA4A_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/ffe41ba5-936f-4e4b-bbe2-105fbbf50dd1.jpeg)

「う〜にゃ〜」の部分をconsole.logで囲って出力してみる。
![647E228F-B9FF-4680-A41C-A9B6023456B0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/9d94eaae-f8d4-4400-96e3-79c9030043f9.png)

すると、infoに大量の文字列が！
\\u00などはuniコードエスケープシーケンスらしい。
最後らへんの$(function(){ 以降はJSのコードっぽいのでコピペしてAIに整形させてみた。
![E9DEB21E-9E72-41D0-AB6D-67A9EE2C97A5_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/56091565-c266-4158-b746-2a03a8ac8b03.jpeg)

コードを読むと、入力した配列のi文字目とi+1をかけた結果が配列pのi文字目と一致すれば「(」・ω・)」うー!(/・ω・)/にゃー!」アラートが出るらしい。
![CD09D010-596B-473C-B93E-CE73D4E1B59A_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/e922177c-a1b2-4d69-9957-a90d3664681a.jpeg)

条件が分かったので仕様を満たすコードを作る。
```
// 入力文字列のi番目のuniコードの数値✖️(i+1)が配列pのi番目と一致すればOK
// つまり、t.charCodeAt(i)=p[i]/(i+1)が成立するuniコードを調べる

p = Array(70, 152, 195, 284, 475, 612, 791, 896, 810, 850, 737, 1332, 1469, 1120, 1470, 832, 1785, 2196, 1520, 1480, 1449);
input = ''
for (let i = 0; i < p.length; i++) {
    let charCode = p[i]/(i+1);
    input += String.fromCharCode(charCode);
    console.log(input);
}
```

作ったコードをindex.htmlに組み込むと、以下のようにフラグが出力される。
（フラグバレ防止のため、表示しているのは最初の部分のみ）
![BD253B37-8AA0-4A18-9197-0D4BBDA0A765_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/34c85bc7-3f60-460f-a528-36a9ab7670c2.jpeg)

フラグを入力すると無事「う〜にゃ〜」アラートが表示される
![260B628F-8E9A-449D-B369-9DE674A0A17B_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/726633bb-be92-4427-8482-5cc4c9d942cd.jpeg)

フラグを入力すると無事クリア！
![777885EB-4718-417E-8FEF-338753BB7BC4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3667133/b6f6fd30-db28-4e5d-aa26-fb64f7c26713.png)

解いた問題を２週間振りに振り返ったが、解くのにかなりの時間かかった。定期的に振り返らないと一瞬で忘れそう^^;