{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/ksnctf-crawling-chaos/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"a7ffd28c-c8d3-503a-89cb-5b2bc1bfaee8","excerpt":"こんにちは。 私にはセキュリティの知識は全くと言っていいほど無いのですが、 今日突然SECCONに参加する予定の友達に、 「この問題、JavaScriptなんだけど、解ける？」 と聞かれたので、見てみました。 問題は、ksnctfというサービスの、Crawling Chaos…","html":"<p>こんにちは。<br>\n私にはセキュリティの知識は全くと言っていいほど無いのですが、</p>\n<p>今日突然SECCONに参加する予定の友達に、<br>\n<strong>「この問題、JavaScriptなんだけど、解ける？」</strong></p>\n<p>と聞かれたので、見てみました。<br>\n問題は、<a href=\"http://ksnctf.sweetduet.info/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ksnctf</a>というサービスの、<a href=\"http://ksnctf.sweetduet.info/problem/3\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Crawling Chaos</a>という問題です。</p>\n<p>問題は<a href=\"http://ksnctf.sweetduet.info/q/3/unya.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ここ</a>に書いてあります。<br>\nページを開くと、</p>\n<p>あるのは入力フォームと送信ボタンだけ。あとは、</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\"><span class=\"token punctuation\">(</span>ᒧᆞωᆞ<span class=\"token punctuation\">)</span><span class=\"token operator\">=</span><span class=\"token punctuation\">(</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">ᆞωᆞ</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span>ᒧᆞωᆞ<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>ᒧうー<span class=\"token operator\">=</span><span class=\"token operator\">-</span><span class=\"token operator\">!</span><span class=\"token operator\">!</span><span class=\"token punctuation\">(</span><span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">ᆞωᆞ</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>にゃー<span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span>〳ᆞωᆞ<span class=\"token punctuation\">)</span><span class=\"token operator\">=</span><span class=\"token punctuation\">(</span>ᒧᆞωᆞ<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span>〳ᆞωᆞ<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>〳にゃー<span class=\"token operator\">=</span><span class=\"token operator\">-</span> <span class=\"token operator\">-</span><span class=\"token operator\">!</span><span class=\"token punctuation\">(</span>ᒧᆞωᆞ<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>ᒧうー<span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span>ᒧᆞωᆞ<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>ᒧうーｰ<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span>〳ᆞωᆞ<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>〳にゃー…</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p><strong>(」・ω・)」うー!(/・ω・)/にゃー</strong></p>\n<p><strong>…は？</strong></p>\n<p>この問題を解いてみました。</p>\n<!--more-->\n<h2 id=\"このサービスの問題の解き方\" style=\"position:relative;\"><a href=\"#%E3%81%93%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E5%95%8F%E9%A1%8C%E3%81%AE%E8%A7%A3%E3%81%8D%E6%96%B9\" aria-label=\"このサービスの問題の解き方 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>このサービスの問題の解き方</h2>\n<p>このサービスは、</p>\n<blockquote>\n<p>主にコンピュータセキュリティに関する問題を出題します。各問題からFLAG_123456xyzという形式の答え（Flag）を探してください。Twitterでログインすると、ランキングに参加できます。</p>\n</blockquote>\n<p>とトップページにあるように、<br>\n問題から、<code>FLAG_*****</code>という文字列を何らかの方法で取得し、<br>\n<a href=\"http://ksnctf.sweetduet.info/problem/3\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">解答ページ</a>に送信するという形式のようです。</p>\n<p>先ほどの文字列から、答えが何なのか全く想像がつきません。笑</p>\n<h2 id=\"なんだこの文字列は\" style=\"position:relative;\"><a href=\"#%E3%81%AA%E3%82%93%E3%81%A0%E3%81%93%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%81%AF\" aria-label=\"なんだこの文字列は permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>なんだこの文字列は</h2>\n<p><strong>※長いし貼っても意味が分からないので、コードの全文は問題を読んでみて下さい。</strong></p>\n<p>まず前提として、<strong>このうーにゃーjsは、有効なJavaScript</strong>です。<br>\njsでは、<strong>マルチバイト文字を変数名などの識別子として利用</strong>できます。</p>\n<p>例：</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> あいうえお配列 <span class=\"token operator\">=</span> <span class=\"token string\">\"あいうえお\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nあいうえお配列<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> <span class=\"token string\">\"あいうえお\"</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span></code></pre></div>\n<p>とこんな感じで、さも当たり前のように全角の文字も扱うことができます。</p>\n<p>とりあえずminifyされてて見難いので、カンマごとに改行してみました。<br>\nすると、<strong>37行目が、異様に長い</strong>です。</p>\n<p>見てみると、うーにゃー達を<code>+</code>で連結しています。<br>\nここで何らかの文字列を生成しているんだろうなぁ、と予想したものの、</p>\n<p><strong>まだ全く答えの想像がつきません。</strong><br>\nそもそも顔文字が多すぎて<strong>コードを読む気すら起きません</strong>。</p>\n<h2 id=\"偶然の発見\" style=\"position:relative;\"><a href=\"#%E5%81%B6%E7%84%B6%E3%81%AE%E7%99%BA%E8%A6%8B\" aria-label=\"偶然の発見 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>偶然の発見</h2>\n<p>こういう問題は初めて挑んだので、気持ち悪いし解けないしでヤケになり<br>\nそのコードを<strong>jsファイルとして保存して、Nodejsから実行</strong>してみました。</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/4a22535754be62b59f16306fd1e716ac/0a47e/c2261ba9a74cecec9931fd139464b87a.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 18.562874251497007%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'73\\'%20viewBox=\\'0%200%20400%2073\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M0%2037v36h10l11-1%204-2c3%200%204%200%204%202-1%201%200%201%202%201s3%200%203-2l2-2%202%201h7c1-1%202-1%203%201l2%201h1l1%201%201-2v-2l1%202c0%202%201%203%203%200h2c2%202%209%203%2011%200h11l7-1%201-1%201%201%201%203%201-2c-1-1%200-2%201-2l1%202c0%202%200%202%202%201%202-2%202-2%203-1%202%203%206%202%207%200%200-3%202-3%201%200%200%202%200%202%201%201%201-2%202-2%206-2h6c1-2%202-1%203%201%200%202%200%202%201%201h2c1%201%201%201%201-1-1-1%200-2%201-2l1%202c0%202%201%203%203%200h2c2%203%207%203%207%200l1-2%201%201c-1%203%200%203%202%201h2c2%202%203%203%202%201l1-2%201%202%203-1c2-2%202-2%202%200h1c1-2%204-3%204-1h1c0-2%203-1%203%201%201%202%201%202%202%201l1-2%201%202c-1%201%202%202%203%200l-1-1v-1h7l1%203%201-2v-2l2%202c0%202%201%202%20109%202h110V0H0v37m271-17c-1%201-14%202-19%201-2-1-2%200-2%203l2%201%201-1v-2l1%204c0%201%201%201%202-1l2-1c0%202%202%203%203%201h3l2-1%202-1h8c1%202%2012%202%2012%200h1l3%202v-2c-1-1-1-1%202-1%202%201%203%200%203-1l-2-2-2%201-6%201-7%201h-2l-1-1-2-1h-4M4%2040l-1%202c1%203%208%204%209%201%200-1%201-1%202%201h1c0-2%200-2%201-1%202%202%204%203%204%201h3c0-2%202-3%202-1%201%202%206%202%206%201h12c0%202%206%201%207-1v-2l-2%201-1%201v-2c0-2%200-2-2-2l-2%201c0%201-3%202-13%202-11%200-14-1-14-2h-2l-4%201-3-1H4m180%2012v3h17c1%201%202%200%202-2%202-3%202-3%202-1s1%203%208%203c6%200%207-1%207-2h1c0%202%201%202%201%201%202-2%200-4-6-3l-7-1c-3-2-6-1-7%202%200%202%200%202-2%200-1-1-2-2-3-1l-3-1h-4l-2%201c-1%203-3%202-3%200-1-2-1-2-1%201m-88-1c-1%202%202%203%206%204l4-2h1c0%202%207%202%208%200%201-1%201-1%201%201h1c0-2%201-2%201-1l1%202v1l1-1h9c9%200%2010-1%2010-2%200-3-5-3-6-1h-1l-12-1a369%20369%200%2001-24%200m224%200c-1%202%202%203%206%203%203%201%204%200%204-1h1c1%202%207%202%208%200%201-1%201-1%201%201v2l1-2c1-2%201-2%201%200-1%201%200%202%201%202l1-1h9c9%200%2014-1%2014-3s-9-2-10%200h-1l-12-1h-11l-9%201-1%201-1-1c1-2-1-3-2-1M109%2061c1%202%200%203-1%201l-9-1H79l-9%201-1%201-1-2c1-1%201-1-1-1l-2%201%203%203c5%201%207%201%207-1h1c1%202%208%202%208%200h1c0%202%200%202%202%201h1v2l2-2h10c11%200%2014-1%2011-4-2-1-2-1-2%201m84%201l1%203h20c0%202%202%201%203-2%200-2%200-2%201%200s8%202%209%201h1c-1%203%201%202%202%200s1-3-1-3l-8%201-2-1c-2-3-3-3-3%201-1%202-2%202-3%200l-2-1-2-1h-5l-2%201h-3c0-1-1-1-2%201-2%201-2%201-2-1l-1-2c-1%200-2%201-1%203\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/4a22535754be62b59f16306fd1e716ac/5251b/c2261ba9a74cecec9931fd139464b87a.webp 167w,\n/static/4a22535754be62b59f16306fd1e716ac/7390e/c2261ba9a74cecec9931fd139464b87a.webp 334w,\n/static/4a22535754be62b59f16306fd1e716ac/e88ff/c2261ba9a74cecec9931fd139464b87a.webp 600w\"\n              sizes=\"(max-width: 600px) 100vw, 600px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/4a22535754be62b59f16306fd1e716ac/21521/c2261ba9a74cecec9931fd139464b87a.png 167w,\n/static/4a22535754be62b59f16306fd1e716ac/86d36/c2261ba9a74cecec9931fd139464b87a.png 334w,\n/static/4a22535754be62b59f16306fd1e716ac/0a47e/c2261ba9a74cecec9931fd139464b87a.png 600w\"\n            sizes=\"(max-width: 600px) 100vw, 600px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/4a22535754be62b59f16306fd1e716ac/0a47e/c2261ba9a74cecec9931fd139464b87a.png\"\n            alt=\"jQueryっぽい文字列\"\n            title=\"jQueryっぽい文字列\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p><strong>？ ？ ？ ？ ？ ？</strong></p>\n<p>なぜでしょう、<strong>jQueryっぽい文字列</strong>が出てきています。<br>\nログには<code>$ is not defined</code>と出ています。</p>\n<p>jQueryを読み込んでないので実行が止まったようです。<br>\n<strong>Nodejsありがとう。ありがとう。</strong></p>\n<h2 id=\"コードの理解\" style=\"position:relative;\"><a href=\"#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E7%90%86%E8%A7%A3\" aria-label=\"コードの理解 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>コードの理解</h2>\n<p>コードの断片が出てきたということは、<br>\nおそらくやたら長い37行目は、jsコードを生成しているようです。</p>\n<p>うーにゃーjsを下から順にダンプしていったら、見つけました。<br>\nカンマ区切りでいうところの、41行目です。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">$</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span><span class=\"token function\">$</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"form\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">submit</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">var</span> t<span class=\"token operator\">=</span><span class=\"token function\">$</span><span class=\"token punctuation\">(</span><span class=\"token string\">'input[type=\"text\"]'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">val</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">var</span> p<span class=\"token operator\">=</span><span class=\"token function\">Array</span><span class=\"token punctuation\">(</span><span class=\"token number\">70</span><span class=\"token punctuation\">,</span><span class=\"token number\">152</span><span class=\"token punctuation\">,</span><span class=\"token number\">195</span><span class=\"token punctuation\">,</span><span class=\"token number\">284</span><span class=\"token punctuation\">,</span><span class=\"token number\">475</span><span class=\"token punctuation\">,</span><span class=\"token number\">612</span><span class=\"token punctuation\">,</span><span class=\"token number\">791</span><span class=\"token punctuation\">,</span><span class=\"token number\">896</span><span class=\"token punctuation\">,</span><span class=\"token number\">810</span><span class=\"token punctuation\">,</span><span class=\"token number\">850</span><span class=\"token punctuation\">,</span><span class=\"token number\">737</span><span class=\"token punctuation\">,</span><span class=\"token number\">1332</span><span class=\"token punctuation\">,</span><span class=\"token number\">1469</span><span class=\"token punctuation\">,</span><span class=\"token number\">1120</span><span class=\"token punctuation\">,</span><span class=\"token number\">1470</span><span class=\"token punctuation\">,</span><span class=\"token number\">832</span><span class=\"token punctuation\">,</span><span class=\"token number\">1785</span><span class=\"token punctuation\">,</span><span class=\"token number\">2196</span><span class=\"token punctuation\">,</span><span class=\"token number\">1520</span><span class=\"token punctuation\">,</span><span class=\"token number\">1480</span><span class=\"token punctuation\">,</span><span class=\"token number\">1449</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">var</span> f<span class=\"token operator\">=</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>length<span class=\"token operator\">==</span>t<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>f<span class=\"token operator\">=</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> i<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span>i<span class=\"token operator\">&lt;</span>p<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span>i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token operator\">!=</span>p<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>f<span class=\"token operator\">=</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>f<span class=\"token punctuation\">)</span><span class=\"token function\">alert</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"(」・ω・)」うー!(/・ω・)/にゃー!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span><span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>f<span class=\"token punctuation\">)</span><span class=\"token function\">alert</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"No\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>こんな文字列が出てきます。<br>\nおそらく、この文字列を<code>Function(jsコード文字列)()</code>と実行するんだと思われます。 <strong>無駄な努力し過ぎだろ…</strong></p>\n<p>コードさえ見つけてしまえば、問題が解ける可能性は一気に高まります。<br>\nこいつを読んでみます。</p>\n<h2 id=\"デコードする\" style=\"position:relative;\"><a href=\"#%E3%83%87%E3%82%B3%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B\" aria-label=\"デコードする permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>デコードする</h2>\n<p>このコードは、</p>\n<ol>\n<li><code>form</code>タグがsubmitされたら、</li>\n<li><code>p</code>という正解文字列を表す配列と照合して</li>\n<li>正解なら<code>\"(」・ω・)」うー!(/・ω・)/にゃー!\"</code></li>\n<li>不正解なら<code>\"No\"</code>とアラートで出す</li>\n</ol>\n<p>という動作をしています。</p>\n<p>正解の文字列を得るには、<code>p</code>が何を表しているのかさえわかれば良さそうなので、<br>\n配列pとその扱い方の部分だけを抜き出してみます。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> t <span class=\"token operator\">=</span> <span class=\"token function\">$</span><span class=\"token punctuation\">(</span><span class=\"token string\">'input[type=\"text\"]'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">val</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">var</span> p <span class=\"token operator\">=</span> <span class=\"token function\">Array</span><span class=\"token punctuation\">(</span><span class=\"token number\">70</span><span class=\"token punctuation\">,</span><span class=\"token number\">152</span><span class=\"token punctuation\">,</span><span class=\"token number\">195</span><span class=\"token punctuation\">,</span><span class=\"token number\">284</span><span class=\"token punctuation\">,</span><span class=\"token number\">475</span><span class=\"token punctuation\">,</span><span class=\"token number\">612</span><span class=\"token punctuation\">,</span><span class=\"token number\">791</span><span class=\"token punctuation\">,</span><span class=\"token number\">896</span><span class=\"token punctuation\">,</span><span class=\"token number\">810</span><span class=\"token punctuation\">,</span><span class=\"token number\">850</span><span class=\"token punctuation\">,</span><span class=\"token number\">737</span><span class=\"token punctuation\">,</span><span class=\"token number\">1332</span><span class=\"token punctuation\">,</span><span class=\"token number\">1469</span><span class=\"token punctuation\">,</span><span class=\"token number\">1120</span><span class=\"token punctuation\">,</span><span class=\"token number\">1470</span><span class=\"token punctuation\">,</span><span class=\"token number\">832</span><span class=\"token punctuation\">,</span><span class=\"token number\">1785</span><span class=\"token punctuation\">,</span><span class=\"token number\">2196</span><span class=\"token punctuation\">,</span><span class=\"token number\">1520</span><span class=\"token punctuation\">,</span><span class=\"token number\">1480</span><span class=\"token punctuation\">,</span><span class=\"token number\">1449</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> i<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">&lt;</span>p<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token punctuation\">(</span>i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!=</span> p<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> f <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>tはフォームのinputタグに入力した文字列です。<br>\n<strong>tを1文字ずつASCIIコード化して、i+1を乗算した文字列</strong>が、答えなようです。</p>\n<p>なら逆に、pをi+1で除算し、ASCIIコードから文字列化すれば答えになるはずです。<br>\nfor分の中身を変えて確認してみます。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> str <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> i<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">&lt;</span>p<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> str <span class=\"token operator\">+=</span> String<span class=\"token punctuation\">.</span><span class=\"token function\">fromCharCode</span><span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">/</span> <span class=\"token punctuation\">(</span>i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>str<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>こいつを問題ページのフォームに貼り付けてみると、</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 429px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/7581ae1b53c9c83b8c5a71e00e674542/3d026/5ed78b8482e49764873c864276ccfece.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 37.724550898203596%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'150\\'%20viewBox=\\'0%200%20400%20150\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M3%2029L1%2041c-1-1-1%2023-1%2054v55h199l200-1c2%200%202-6%202-55l-1-52-1%203v-3c0-3%200-3-1-1s-1%200-1-5c0-10-2-22-2-16v4H4v-4l-1%209m1%2057l1%2061h390V25H4v61m290-44v6l-1%206h12l12-1-2-1-2-2c0-2%200-2%201-1%202%203%203%202%202%200v-5c-2-2-5-3-5-1h-3c-3-1-4%201-1%202l2%203h-4l1%201%201%202h-4c0%202-3%201-3%200l2-2c2%200%202-1%202-3l-1-3a587%20587%200%2001-9-1M48%2045c-18%207-24%2027-12%2042%206%208%2020%2011%2029%207l-6%201h-4l2-4%205-8c2-4%202-5-2-3-4%203-8%202-13-2-3-4-3-12%201-16%203-3%203-3%2019-3l12-1c0-2-5-8-10-10-6-4-15-5-21-3m144%202c0%205%203%208%204%205h1c0%202%203%201%204-2v-2l1%202c1%202%203%203%205%203s2%200%201-1c-2-1-2-1-1-2l3%201%204%202c2%200%202%200%201-1v-2c2-2%202-2%202%201l2%202c2%200%202%200%201-1l-1-4c1-2-1-3-3-1h-1c-1-1-3-1-4%201-2%201-2%201-3-1h-6l-2%201h-4c-1%201-2%201-3-1h-1M49%2063c-6%206-1%2018%208%2017%207-2%2011-10%206-16-3-4-10-4-14-1m255%2050c-2%201-2%204-2%208%200%2012-3%2011%2037%2011h36l1-2%202-8-2-9-1-2h-35c-32%200-35%200-36%202m1%202v13c0%202%203%202%2035%202h35v-16l-35-1c-33%200-35%200-35%202\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/7581ae1b53c9c83b8c5a71e00e674542/5251b/5ed78b8482e49764873c864276ccfece.webp 167w,\n/static/7581ae1b53c9c83b8c5a71e00e674542/7390e/5ed78b8482e49764873c864276ccfece.webp 334w,\n/static/7581ae1b53c9c83b8c5a71e00e674542/649fd/5ed78b8482e49764873c864276ccfece.webp 429w\"\n              sizes=\"(max-width: 429px) 100vw, 429px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/7581ae1b53c9c83b8c5a71e00e674542/21521/5ed78b8482e49764873c864276ccfece.png 167w,\n/static/7581ae1b53c9c83b8c5a71e00e674542/86d36/5ed78b8482e49764873c864276ccfece.png 334w,\n/static/7581ae1b53c9c83b8c5a71e00e674542/3d026/5ed78b8482e49764873c864276ccfece.png 429w\"\n            sizes=\"(max-width: 429px) 100vw, 429px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/7581ae1b53c9c83b8c5a71e00e674542/3d026/5ed78b8482e49764873c864276ccfece.png\"\n            alt=\"うーにゃー\"\n            title=\"うーにゃー\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>答えは、ここに書いてしまうと面白くなさそうなので、<br>\nこの問題に興味を持った方↑のコードを実行してみて下さい。</p>","timeToRead":5,"frontmatter":{"title":"【(」・ω・)」うー!(/・ω・)/にゃー!】 ksnctfのCrawling Chaosを解いてみた","tags":["JavaScript"],"date":"September 27, 2013","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='154'%20viewBox='0%200%20400%20154'%20preserveAspectRatio='none'/%3e","aspectRatio":2.5891472868217056,"src":"/static/f50751b2f21c91184d76d64faaecde92/1746d/featured-image.jpg","srcSet":"/static/f50751b2f21c91184d76d64faaecde92/466a3/featured-image.jpg 334w,\n/static/f50751b2f21c91184d76d64faaecde92/1746d/featured-image.jpg 529w","srcWebp":"/static/f50751b2f21c91184d76d64faaecde92/116fa/featured-image.webp","srcSetWebp":"/static/f50751b2f21c91184d76d64faaecde92/cd98f/featured-image.webp 334w,\n/static/f50751b2f21c91184d76d64faaecde92/116fa/featured-image.webp 529w","sizes":"(max-width: 529px) 100vw, 529px"}}}}}},"pageContext":{"slug":"/ksnctf-crawling-chaos/","previous":{"fields":{"slug":"/automate-cookie-clicker-with-js/"},"frontmatter":{"title":"CookieClikerをjsから操作してみる","tags":["JavaScript"]}},"next":{"fields":{"slug":"/updated-renew-blog-design/"},"frontmatter":{"title":"ブログのデザインをリニューアルしました","tags":["Git","Wordpress"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}