はまやんはまやんはまやん

hamayanhamayan's blog

Welcome to Earch [b01lersCTF 2020]

https://ctftime.org/task/10704

日本語は下

Writeup in English

The problem reminded me of "labyrinth" (Japanese Funny Website)

f:id:hamayanhamayan:20200316182423p:plain

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?

f:id:hamayanhamayan:20200316182754p:plain

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.

f:id:hamayanhamayan:20200316183205p:plain

Shooting with the button will destroy the United States again, so look at the source code and change the destiny. Access /shoot.

f:id:hamayanhamayan:20200316183321p:plain

good.

f:id:hamayanhamayan:20200316183459p:plain

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.

f:id:hamayanhamayan:20200316183901p:plain

Um. the source contains the reference of open_sesame.js. Look at this and access to /fight.

f:id:hamayanhamayan:20200316184038p:plain

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 ...

f:id:hamayanhamayan:20200316184430p:plain

Independence Day.

日本語解説

微妙に迷宮を感じさせる問題だった。
アドベンチャーゲームオンライン『迷宮』(無料)|謎解き・宝探し・脱出・迷路・ネットゲーム

f:id:hamayanhamayan:20200316182423p:plain

どこに逃げる? とりあえず、ソースコード見るか。 以下のような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?

f:id:hamayanhamayan:20200316182754p:plain

ソースコードから戻るとアメリカが破滅していた。インディペンデンスデイやん。 とりあえず、ソースコードから拝借した/chaseにアクセスしてみるとすぐ死んでしまう。 これはソースコードベースでたどっていくのがよさそうだ。 ソースコードを見ると/lefttへ誘導されている。こっちを見てみよう。

f:id:hamayanhamayan:20200316183205p:plain

ボタンを使ってShootすると、またアメリカが滅ぶので、ソースコードを見て世界線を変えよう。/shoot/にアクセスする。

f:id:hamayanhamayan:20200316183321p:plain

よかった

f:id:hamayanhamayan:20200316183459p:plain

おー、とりあえずソースコードか。door.jsが参照されているので、中身を見ると、/openが書いてある。 ずるをして、そちらを見てみよう。

f:id:hamayanhamayan:20200316183901p:plain

うむ。ソースを見るとopen_sesame.jsが参照されているので、見る。/fightがあるので、飛ぶ。

f:id:hamayanhamayan:20200316184038p:plain

ついにエイリアンが出てきた。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って何だろうと思ってググったら…

f:id:hamayanhamayan:20200316184430p:plain

やっぱり、インディペンデンスデイじゃないか。