文章目录
- simple_js
- 题目描述:
- 题目场景:
- 解题思路
simple_js
题目描述:
小宁发现了一个网页,但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} )
题目场景:
解题思路
尝试了一下随便输入密码,显示如下:
按下F12查看页面元素,发现JS代码:
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) );
对代码进行审计,发现无论输入什么密码都会显示之前的画面,函数中传入的变量根本没有被调用,去除一些多余的变量:
function dechiffre(){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab2 = pass.split(',');
var i;
var p = "";
for(i = 0; i < n; i++ ){
p += String.fromCharCode((tab2[i]));
}
return p;
}
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) );
代码解释:
1、String["fromCharCode"]
这个语句是一种非标准语法的写法,它实际上是等价于标准语法中的 String.fromCharCode
。
String.fromCharCode()
函数用于从一些Unicode字符值中返回一个字符串,String.fromCharCode()
方法的返回值为String类型,其返回值为Unicode数值所表示的字符串。
2、"\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"
是使用**十六进制(hexadecimal)**表示的ASCII编码
\x35 表示 ASCII 码 53,对应字符 '5'。
\x2c 表示 ASCII 码 44,对应字符 ','。
依此类推,这个字符串代表的是以下的字符序列:
"55,56,54,79,115,69,114,116,107,49,50"
document.writeln( String.fromCharCode( 65, 66, 67, 68, 69, 70, 71 ) ); // ABCDEFG
document.writeln( String.fromCharCode( 78 ) ); // N
document.writeln( String.fromCharCode( 20013, 22269 ) ); // 中国
document.writeln( String.fromCharCode() ); // (空字符串)
阅读完代码之后,我们发现上述dechiffre()的主要作用就是对含有逗号的数字字符串进行解码,将每个数字转换为其对应的unicode字符。所以我们将16进制编码的字符串放进函数的代码中运行:
<html>
<head>
<title>JS</title>
<script type="text/javascript">
function dechiffre(){
var pass = "\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";
var tab2 = pass.split(',');
var i;
var p = "";
for(i = 0; i < tab2.length; i++ ){
p += String.fromCharCode((tab2[i]));
}
return p;
}
alert(dechiffre());
</script>
</head>
<body></body>
</html>
得到flag为Cyberpeace{786OsErtk12}