攻防世界web刷题 新手区 simple_js (代码解读加思路分析)

题目

小宁发现了一个网页,但却一直输不对密码。(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.考察读代码的能力,然后需要对字符转换有一定的了解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值