题目描述:
小宁发现了一个网页,但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} )
- 进入场景就弹了一个框,让输入密码
- 随便输入一个密码,提示假的密码
3. 根据题目描述得知此题和js有关,打开开发者工具,找到该网页的js代码
4. 我们对这段代码进行简单的审计
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
,然后看主程序,调用了String
类的静态方法fromCharCode
,而fromCharCode
方法接收的参数是一系列的数字,即ascii码,然后返回ascii码对应的字符,就是将ascii码转换为字符。
6. 然后我们需要知道dechiffre
函数的返回值,dechiffre
函数就是传入一个字符串,然后进行一系列操作,返回字符串,
7. 下一行h = window.prompt('Enter password');
是接收输入框里的内容并赋值给h
8. alert( dechiffre(h) );
将内容进行dechiffre函数处理,再将返回值弹出来
9. 我们先尝试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"
会返回什么,
10. 返回的英文意为假的密码,我们尝试输入其他字符串,发现结果还是一样。
10. 所以我们知道了,正是由于dechiffre函数作乱才导致我们拿不到真正的密码
11. String
类的静态方法fromCharCode是返回一个字符串,但这里却没有输出出来,肯定有猫腻,这应该就是本题的关键点
12. 我们知道,fromCharCode函数的参数应该是一系列数字,但是这里却传了dechiffre函数的返回值,而dechiffre的返回值是一个固定的字符串,所以这里的参数有问题
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"));
-
再看这里dechiffre函数传入的是一个十六进制的字符串,观察一下容易发现,
\x2c
出现了很有规律,而\x2c
对应ascii码表中的英文逗号(,
), -
fromCharCode函数参数正是一系列逗号分割的数字,然后将其最为ascii码,再转换为ascii码对应字符串,最后返回
-
所以,我们先将十六进制字符串转换为一系列的数字
- 这里有个小技巧,可以直接控制台输出该字符串就会自动转换为相应的字符
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=4d10e42c04c540139d6ef3972b27b377.png)
- 最后,我们将这一系列逗号分割的数字作为fromCharCode函数的参数传进去,果然返回了一个神奇的字符串,格式化下就是我们要找的flag
- 本题完成