https://ctftime.org/task/10704
日本語は下
Writeup in English
The problem reminded me of "labyrinth" (Japanese Funny Website)
Where do you escape? Anyway, look at the source code. The following javascript code is embedded.
document.onkeydown = function(event) { event = event || window.event; if (event.keyCode == 27) { event.preventDefault(); window.location = "/chase/"; } else die(); }; function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function dietimer() { await sleep(10000); die(); } function die() { window.location = "/die/"; } dietimer();
The key code 27 is the Esc key, so if you press this, you can go to the next scene. Hmm? dietimer?
Returning from the source code, the United States was ruined.
It's Independence day.
Let's go /chase
I found from the source code. But I die immediately.
This looks good to follow in the source code base.
Look at the source code, you can find /leftt
. Let's look at this.
Shooting with the button will destroy the United States again, so look at the source code and change the destiny. Access /shoot
.
good.
Oh, look at the source code. I found door.js
is referenced.
If you open the file, you will see/open
.
Cheat but go there.
Um. the source contains the reference of open_sesame.js
.
Look at this and access to /fight
.
An alien appears!
Nothing happens when I try entering kick
.
Look at the source code, there is fight.js
, so open it.
Finally, a flag-like code came out.
// Run to scramble original flag //console.log(scramble(flag, action)); function scramble(flag, key) { for (var i = 0; i < key.length; i++) { let n = key.charCodeAt(i) % flag.length; let temp = flag[i]; flag[i] = flag[n]; flag[n] = temp; } return flag; } function check_action() { var action = document.getElementById("action").value; var flag = ["{hey", "_boy", "aaaa", "s_im", "ck!}", "_baa", "aaaa", "pctf"]; // TODO: unscramble function }
You can seriously examine the source code, but since the correct flag will be the rearrangement of the flag array, I will try to make it like that manually.
pctf {hey_boys_im_baaaaaaaaaack!}
One shot AC.
I wondered what hey boys im back
is ...
Independence Day.
日本語解説
微妙に迷宮を感じさせる問題だった。
アドベンチャーゲームオンライン『迷宮』(無料)|謎解き・宝探し・脱出・迷路・ネットゲーム
どこに逃げる? とりあえず、ソースコード見るか。 以下のようなjavascriptコードが埋め込まれている。
document.onkeydown = function(event) { event = event || window.event; if (event.keyCode == 27) { event.preventDefault(); window.location = "/chase/"; } else die(); }; function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function dietimer() { await sleep(10000); die(); } function die() { window.location = "/die/"; } dietimer();
キーコードの27はEscキーなので、これを押せば次の場面に進めるのね。 ん?dietimer?
ソースコードから戻るとアメリカが破滅していた。インディペンデンスデイやん。
とりあえず、ソースコードから拝借した/chase
にアクセスしてみるとすぐ死んでしまう。
これはソースコードベースでたどっていくのがよさそうだ。
ソースコードを見ると/leftt
へ誘導されている。こっちを見てみよう。
ボタンを使ってShootすると、またアメリカが滅ぶので、ソースコードを見て世界線を変えよう。/shoot/にアクセスする。
よかった
おー、とりあえずソースコードか。door.js
が参照されているので、中身を見ると、/open
が書いてある。
ずるをして、そちらを見てみよう。
うむ。ソースを見るとopen_sesame.js
が参照されているので、見る。/fight
があるので、飛ぶ。
ついにエイリアンが出てきた。kick
とかしてみても何も反応しない。ソースコードをみるとfight.js
があるので、見る。
やっと、フラグっぽいコードが出てきた。
// Run to scramble original flag //console.log(scramble(flag, action)); function scramble(flag, key) { for (var i = 0; i < key.length; i++) { let n = key.charCodeAt(i) % flag.length; let temp = flag[i]; flag[i] = flag[n]; flag[n] = temp; } return flag; } function check_action() { var action = document.getElementById("action").value; var flag = ["{hey", "_boy", "aaaa", "s_im", "ck!}", "_baa", "aaaa", "pctf"]; // TODO: unscramble function }
真面目にソースコードを検証してもいいが、正しいフラグはflag配列の並び替えだろうだから、それっぽいやつを人力で作ってみる。
pctf{hey_boys_im_baaaaaaaaaack!}
一発AC。
hey boys im back
って何だろうと思ってググったら…
やっぱり、インディペンデンスデイじゃないか。