攻防世界-密码学-flag in your hand

1. 题目信息

题目给了两个文件:index.html与script-min.js。

2. 分析

先分析index.html的逻辑,第58行:

<input type="button" value="Get flag!" onclick="getFlag()" />

结合浏览器打开index.html的效果,我们知道点击 'Get flag!' 按钮时会调用getFlag()函数;

getFlag()函数的定义在第32行:

function getFlag() {
	var token = document.getElementById("secToken").value;
	ic = checkToken(token);
	fg = bm(token);
	showFlag()
}

在显示flag之前会调用checkToken(token)与bm(token)两个函数,我们先看一下显示flag的showFlag()函数,它定义在第39行:

function showFlag() {
	var t = document.getElementById("flagTitle");
	var f = document.getElementById("flag");
	t.innerText = !!ic ? "You got the flag below!!" : "Wrong!";
	t.className = !!ic ? "rightflag" : "wrongflag";
	f.innerText = fg;
}

可以看到是通过ic的布尔值判断我们是否输入正确的token,而ic由函数checkToken(token)返回,跳转到script-min.js中定义函数checkToken的地方看一下:

function checkToken(s) {
    return s === "FAKE-TOKEN";
}

难不成FAKE-TOKEN就是正确的token?当然不是,还是抱着希望去试了一下,果然不是!那么问题只能出在函数bm中,它改变了ic的布尔值!

于是去看一下函数bm,它定义如下:

function bm(s){
	return rb(rstr(str2rstr_utf8(s)));
}

函数str2rstr_utf8与rb并没有改变ic的布尔值,是rstr调用的函数ck改变了ic的布尔值;函数ck的定义如下:

function ck(s){
    try {
        ic
    } catch (e) {
        return;
    }
    var a = [118, 104, 102, 120, 117, 108, 119, 124, 48,123,101,120];
    if (s.length == a.length) {
        for (i = 0; i < s.length; i++) {
            if (a[i] - s.charCodeAt(i) != 3)
                return ic = false;
        }
        return ic = true;
    }
    return ic = false;
}

看到这里明白了,checkToken就是个幌子,这里才决定ic布尔值!对函数ic的输入参数(字符串)s,只有s与列表a等长,且s每个字符在ascii表中的序号比列表a中每个对应元素小3时,ic才为True。

于是可以写个python脚本求一下这里会让ic=True的s:

a=[118,104,102,120,117,108,119,124,48,123,101,120];
print ''.join([chr(x-3) for x in a])

得到s为security-xbu字符串。

综上,当函数ck的输入为字符串security-xbu时,会使ic的布尔值为True,从而得到正确的flag;通过分析调用过程,函数ck的输入为str2rstr_utf8(token),那么token为何值时str2rstr_utf8(token)为字符串security-xbu呢?是不是要写个str2rstr_utf8的逆程序?其实不用,我们将script-min.js中的函数bm改一下,如下:

function bm(s){
	//return rb(rstr(str2rstr_utf8(s)));
	return rb(rstr(s))
}

刷新index.html,填入security-xbu,就可以得到正确的flag!

原文地址:https://www.cnblogs.com/coming1890/p/13497305.html