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

hamayanhamayan's blog

Client-side-again [picoCTF 2019 Web 200]

https://ctftime.org/task/9517

前提知識

解説

dont-use-client-sideと見た目が似ているので、とりあえずソースコードを見る。
同じような感じになっているが、ちょっと難読化されている。
名前変更の難読化だけなので、頑張って読み解くと、解ける。
_0x5a46が使われてるけど、エスパーすると、シフトされている感じがするので、なんとなく使う。

var _0x5a46 = ['55670}', '_again_0', 'this', 'Password\x20Verified', 'Incorrect\x20password', 'getElementById', 'value', 'substring', 'picoCTF{', 'not_this'];
(function (_0x4bd822, _0x2bd6f7) {
    var _0xb4bdb3 = function (_0x1d68f6) {
        while (--_0x1d68f6) {
            _0x4bd822['push'](_0x4bd822['shift']());

        }
    };
    _0xb4bdb3(++_0x2bd6f7);
}
    (_0x5a46, 0x1b3));
var _0x4b5b = function (_0x2d8f05, _0x4b81bb) {
    _0x2d8f05 = _0x2d8f05 - 0x0;
    var _0x4d74cb = _0x5a46[_0x2d8f05];
    return _0x4d74cb;

};
function verify() {
    checkpass = document[_0x4b5b('0x0')]('pass')[_0x4b5b('0x1')];
    split = 0x4;
    if (checkpass[_0x4b5b('0x2')](0x0, split * 0x2) == _0x4b5b('0x3')) {
        if (checkpass[_0x4b5b('0x2')](0x7, 0x9) == '{n'){
        if (checkpass[_0x4b5b('0x2')](split * 0x2, split * 0x2 * 0x2) == _0x4b5b('0x4')) {
            if (checkpass[_0x4b5b('0x2')](0x3, 0x6) == 'oCT') {
                if (checkpass[_0x4b5b('0x2')](split * 0x3 * 0x2, split * 0x4 * 0x2) == _0x4b5b('0x5')) {
                    if (checkpass['substring'](0x6, 0xb) == 'F{not'){
                    if (checkpass[_0x4b5b('0x2')](split * 0x2 * 0x2, split * 0x3 * 0x2) == _0x4b5b('0x6')) {
                        if (checkpass[_0x4b5b('0x2')](0xc, 0x10) == _0x4b5b('0x7')) {
                            alert(_0x4b5b('0x8'));
                        }
                    }
                }
            }
        }
    }
}
  }
  else {
    alert(_0x4b5b('0x9'));
    }
}

雑にきれいにするとこんな感じ。
0x4b5b('0x2')のようなやつがあるが、これは間接的に配列0x5a46を参照している。
参照順はシフトされているので、前の問題を参考に、順番をエスパーするとフラグが復元できる。