攻防世界-密码学-flag in your hand
题目信息
题目给了两个文件:index.html与script-min.js。
分析
先分析index.html的逻辑,第58行:
1 | <input type="button" value="Get flag!" onclick="getFlag()" /> |
结合浏览器打开index.html的效果,我们知道点击 ‘Get flag!’ 按钮时会调用getFlag()函数;
getFlag()函数的定义在第32行:1
2
3
4
5
6function getFlag() {
var token = document.getElementById("secToken").value;
ic = checkToken(token);
fg = bm(token);
showFlag()
}
在显示flag之前会调用checkToken(token)与bm(token)两个函数,我们先看一下显示flag的showFlag()函数,它定义在第39行:
1 | function showFlag() { |
可以看到是通过ic的布尔值判断我们是否输入正确的token,而ic由函数checkToken(token)返回,跳转到script-min.js中定义函数checkToken的地方看一下:
1 | function checkToken(s) { |
难不成FAKE-TOKEN就是正确的token?当然不是,还是抱着希望去试了一下,果然不是!那么问题只能出在函数bm中,它改变了ic的布尔值!
于是去看一下函数bm,它定义如下:
1 | function bm(s){ |
函数str2rstr_utf8与rb并没有改变ic的布尔值,是rstr调用的函数ck改变了ic的布尔值;函数ck的定义如下:
1 | function ck(s){ |
看到这里明白了,checkToken就是个幌子,这里才决定ic布尔值!对函数ic的输入参数(字符串)s,只有s与列表a等长,且s每个字符在ascii表中的序号比列表a中每个对应元素小3时,ic才为True。
于是可以写个python脚本求一下这里会让ic=True的s:
1 | a=[118,104,102,120,117,108,119,124,48,123,101,120]; |
得到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改一下,如下:
1 | function bm(s){ |
刷新index.html,填入security-xbu,就可以得到正确的flag!