题目
小宁发现了一个网页,但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} )
题目分析与解题
随便输入进去
分析:
提示为js直接查看源代码
<html>
<head>
<title>JS</title>
<script type="text/javascript">
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) );
</script>
</head>
</html>
可以看到是一段js代码,好家伙直接开始审计。
总体
首先开头定义了一个函数dechiffre(),传入的参数为pass_en。跳过函数体,下面String[“fromCharCode”],里面是一串16进制调用dechiffre函数后的返回值。然后是h,就是开头的对话框,然后是alert dechiffre(h)的返回值。总体分析到此结束。
详细分析
主要的工作就在于分析给出的函数,里面传入的是那一串16进制,然后用split函数依据逗号将数据分离组合
tab里面存放的是传入的数据
tab2里面存放的是pass
再看返回值,只有最后有返回值返回的是p的值
两个for函数都是在对p进行改变,直接找到相应的代码
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]);
fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串
j = tab2.length,n=j=k.可以看到,第一个for循环到i = 5时结束而且是在前面语句赋值后才退出,而且在给p赋值的时候,表面上用了tab,最后却用的tab2。第二个for循环则是从i=6开始,一直到i = n -1时结束,正好是tab2的初最后一位的前面的所有字符。。。然后又加上tab2[17].正好就是全部的tab2.
所以!!!传进去的参数竟然没用到,无论你输入什么他都返回的同样的内容。因此猜测,传入的参数可能为flag
直接用python给输出一下
print("\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")
这样得到了相应的ASCII码然后再转化成字符串
得到答案整理一下
按照要求的格式
Cyberpeace{786OsErtk12}
答案
Cyberpeace{786OsErtk12}
总结
1.考察读代码的能力,然后需要对字符转换有一定的了解