打开环境,浏览器弹出窗口提示我们输入密码
我们习惯性的查看页面源码,并且题目已经给我们提示:“simple js”
得到一串js代码,应该是让我们审计js代码没跑了o.o
function dechiffre(pass_enc){ //这一部分是定义了一个函数dechiffre,参数为pass_enc
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65"; //定义了pass字符串
var tab = pass_enc.split(','); //定义了tab变量,其中.split()方法是将一个字符串分割为字符数组,括号里单引号下的逗号是按逗号分割
var tab2 = pass.split(','); //tab2变量是对pass字符串进行的分割
var i,j,k,l=0,m,n,o,p = ""; // 定义了许多变量,其中未被赋值的变量为undefined
i = 0;
j = tab.length; //.length是返回tab数组的长度,j=36
k = j + (l) + (n=0);
n = tab2.length; // 先定义了n=0,k=18+0+0=18 然后给n赋值n=18
for(i = (o=0); i < (k = j = n); i++ ) //条件是i=0,i<18(把n的值赋给j,再把j的值赋给k)
{
o = tab[i-l]; //先把tab[i-1]的值赋给o但是我们会发现,后面紧接着有把tab2[i]的值赋给o,这一条语句相当于无用
p += String.fromCharCode((o = tab2[i])); //上面定义了变量p=“”,String.fromCharCode()方法是把Unicode编码转化为字符串
if(i == 5)
break;
} // 通过运行此程序段,并且加上document.write(p+”<br/>”);输出p的值我们发现p=FAUX P
for(i = (o=0); i < (k = j = n); i++ ){ // 第二个for循环,i=0,i<18,i++
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i])); //该条循环与上个循环相似,最终发现输出的p=FAUX PASSWORD HAH
}
p += String.fromCharCode(tab2[17]);
pass = p;
return pass; //完整的p是p=p=FAUX PASSWORD HAHA(假的密码哈哈)😢
}
//最终函数返回p,但仔细观察我们发现p始终与tab2挂钩,而tab2的值是pass分割成数组的值,pass是定值,也就是说我们函数的参数pass_enc在这个函数里无用!
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
以上我用注释的形式来为大家解释了每一条语句的作用,如果你是比我还萌的萌新,仔细看看肯定是会有收获的(狗头保命)
通过分析我们发现了我们传入的参数p对函数最后返回的结果毫无影响,因为无论我们输入什么都存到了tab里,而整个函数是对tab2这个数组的操作,无论我们输入什么,最终页面都返回给我们faux password haha,所以通过分析,那一串16进制的数字转码后应该就是flag了,因为它孤零零的在那里,前不着村后不着店,煞是诡异。。。
所以我们就自己写js代码,把他翻译出来,bingo!
首先我们先把那一串\x的给翻译成ascii,在python中自动完成:
然后直接调用fromCharCode方法得到flag
var password = String.fromCharCode(55,56,54,79,115,69,114,116,107,49,50);
console.log(password);
以上就是本题的解法,个人认为该题目还是有那么一丢丢难度的(毕竟我js不太好😶)