题目叫做simple_js,题目描述为
小宁发现了一个网页,但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} )
打开网页之后是一个输入密码的框,自己随便输入点内容页面显示FAUX PASSWORD HAHA
,自己肯定时没密码的,直接看源代码,核心代码如下
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
}
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) );
上面定义了一个dechiffre(pass_enc)
的函数,String["fromCharCode"](dechifre("xxx"))
这个是把ASCII内容转换成字符串。剩下的就是打开页面之后都会出现的内容,参考意义不大,这里直接分析上面的这个函数
函数里面先定义了一个pass
,内容如下
70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65
大概率就是ASCII码,之后又定义了一个tab,内容如下
var tab = pass_enc.split(',');
pass_enc是传入的值,通过split(',')
进行切割,现在tab是一个数组,之后定义了一个tab2,内容如下
var tab2 = pass.split(',');
对pass进行分割现在tab2也是个数组,之后定义了其他的一些变量,如下
var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;k = j + (l) + (n=0);n = tab2.length;
这里真是懵,最开始看的时候以为i,j,k,l
都是0,一想不对。。。
最开始ijkmno
都应该是undefined
之后i
又被赋值了0,j
被赋值了tab
变量的长度,最后就是k,m,o
是undefined
之后i
=0
,l
=0
,p
=""
,j
=tab.length
,k
=tab.length
,n
=tab2.length
,赋完值之后进行了一个for循环,代码如下
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;
}
// 精简过后代码如下
for(i=0;i<tab2.length;i++){
// o=tab[i];
p += String.fromCharCode(tab2[i]);
if(i==5)break;
}
p += String.fromCharCode(tab2[i]);
这段主要是这个代码,之后又经过了一个for循环,代码如下
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
// 精简过后代码如下
for(i=0;i<tab2.length;i++){
// o = tab[i]
if (i>5&&i<(tab.length-1))p + = String.fromCharCode(tab2[i]);
}
p += String.fromCharCode(tab2[i]);
这段主要是这个代码,和上段基本一样,方法最后返回下面内容
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
他把tab2的第17个值转换成了字符串,并返回了p,这代码这是在闹着玩,弄到底也没处理传入的值,我服了😅,这代码的主要的作用就是把上面的ASCII转换成字符,直接转换pass变量发现内容为FAUX PASSWORD HAHA
,看样子知道题目的答案就是把传入函数的那传Hex编码转换成字符串
\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
转换之后变成这样
55,56,54,79,115,69,114,116,107,49,50
转换成字符串变成这样
786OsErtk12
这道题目的答案即
Cyberpeace{786OsErtk12}