死神のミッション 1日目
ヒント▶
解説▶
答えは「カンゲイ」(ショック→カンゲイ)。死神のミッション 2日目
ヒント▶
解説▶
答えは「スパーク」。死神のミッション 3日目
ヒント▶
解説▶
答えは「カンムリ」。死神のミッション 4日目
ヒント▶
解説▶
答えは「ネクスト」(NEXT→ネクスト)。死神のミッション 5日目
ヒント▶
解説▶
答えは「マスター」。死神のミッション 6日目
ヒント▶
解説▶
答えは「リスタート」。理由はわからん。おまけをチェックして。死神のミッション 7日目
ヒント▶
解説▶
答えは「あいことば」。死神のミッション Final Mission
ヒント▶
解説▶
答えは「ゲームスタート」。おまけ
6日目のミッションがあまりにも意味不明過ぎて、CTFの能力に頼る羽目になった。日本人の開発者は無能だと世界中で言われていたのでちょっぴり期待してた。ソースに目を通したところ、案の定目立った部分があった。
<script>
(function()
{
let date = new Date().getTime();
window.quizDataPath = "../../js/mission.json?" + date;
})();
</script>
../../js/mission.json
のところはいわばパストラバーサルの証で、サーバーの他のディレクトリにファイルがあると証明している。
https://www.jp.square-enix.com/shinsubarashiki/shibuya/mission/special/
→ https://www.jp.square-enix.com/shinsubarashiki/shibuya/mission/special/../../js/mission.json
→ https://www.jp.square-enix.com/shinsubarashiki/shibuya/js/mission.json
そのパスを確認するとなんと…
{
"data": [
{
"num": 1,
"answer": "e382abe383b3e382b2e382a4",
"hint": {
"txt": "104の前にいたヤツが惜しいところまでたどりついていたぞ。お前の能力で心の声を見てみたらどうだ?",
"link": "../../"
},
"success":"おめでとう。1日目のミッションクリアだ。<br>まだ気は抜くな。<br>死神のゲームは始まったばかりだ。",
"share": "1日目のミッションをクリア!",
"hash": "#死神のミッション #新すばせか",
"shareurl": "clear.html"
},
...
}
外部アクセス可。ファイルの中身がプレーンテキストで丸出し。しかもanswerも当たり前のように書いてある。けど何らかのアルゴリズムにハッシュ化されている模様。今までの答えと比較してみよう。
カンゲイ → e382abe383b3e382b2e382a4
スパーク → e382b9e38391e383bce382af
カンムリ → e382abe383b3e383a0e383aa
ネクスト → e3838de382afe382b9e38388
マスター → e3839ee382b9e382bfe383bc
???? → e383aae382b9e382bfe383bce38388
言うまでもないけど明らかにパターンがある。ただのURLエンコードじゃん。ハッシュ化でもされていない。
>>> from urllib.parse import unquote
>>> str = "e382abe383b3e382b2e382a4"
>>> unquote("%"+"%".join([str[i:i+2] for i in range(0, len(str), 2)]))
'カンゲイ'
>>> str = "e383aae382b9e382bfe383bce38388"
>>> unquote("%"+"%".join([str[i:i+2] for i in range(0, len(str), 2)]))
'リスタート'
呆れたw
明日のミッション楽しみにしてるよ!