前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2021年12月 攻防世界-简单题-WEB-012(simple_js)

【愚公系列】2021年12月 攻防世界-简单题-WEB-012(simple_js)

作者头像
愚公搬代码
发布2021-12-27 08:10:37
5200
发布2021-12-27 08:10:37
举报
文章被收录于专栏:历史专栏

文章目录


一、simple_js

题目链接:https://adworld.xctf.org.cn/task/task_list?type=web&number=3&grade=0&page=1

二、使用步骤

1.点击获取在线场景

在这里插入图片描述
在这里插入图片描述

2.进入页面

随便输入密码测试下

在这里插入图片描述
在这里插入图片描述

没发现有用得东西,我们看看源代码

代码语言:javascript
复制
<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>

3.源码分析

执行流程:

一、首先定义了一个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十六进制数转换成字符串,python下print即可,或网址:https://www.bejson.com/convert/ox2str/ 输出结果55,56,54,79,115,69,114,116,107,49,50

二、执行String[“fromCharCode”](dechiffre("55,56,54,79,115,69,114,116,107,49,50 "));

三、调用了dechiffre,执行dechiffre函数

String[“fromCharCode”](dechiffre("55,56,54,79,115,69,114,116,107,49,50 ")); (1)先将"55,56,54,79,115,69,114,116,107,49,50 "带入dechiffre函数执行,即dechiffre(pass_enc)=dechiffre("55,56,54,79,115,69,114,116,107,49,50 ")

(2)接着我们看到了pass变量,暂时先放着

(3)因为pass_enc=“55,56,54,79,115,69,114,116,107,49,50” 将pass_enc字符串分割成字符串数组,赋值给tab参数,所以: tab=[55,56,54,79,115,69,114,116,107,49,50] 注:tab此时是字符串数组!!!

(3)随后也对pass分割 tab2=[70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65]

(4)变量赋值代码分析:var i,j,k,l=0,m,n,o,p = “”;i = 0;j = tab.length; 一开始i,j,k,m,n,o,没有赋值,为undefined,其它参数l=0,p="",后来i被赋值=0,j被赋值为11

(5)第九行此时n被赋值为0,所以k=11+0+0,最后等于11 注:这里的(l)其中是英文字母l,不是数字1

(6)第十行中,n=18

(7)第一个for循环,精简一下代码: for(i = 0; i < (18); i++ ) {o = tab[i-l];p += String.fromCharCode((o = tab2[i])); if(i == 5)break;} 解释:前面的o=tab[i-1]是无用的,因为后面会被o=tab2[i]的值重新覆盖 第一次循环:o=tab[0];p=p+String.fromCharCode((o = tab2[0]) =>o=70;p=""+String.fromCharCode(70)=>p=英文字母F 第二次… 第三次… 第四次… 第五次… 所以,这个for循环,最后的p为(尽管没有输出出来,这里我们知道就好)FAUX P

(8)第二个for循环,精简一下代码: for(i = 0; i < 18; i++ ){ o = tab[i-l]; if(i > 5 && i < 17) p += String.fromCharCode((o = tab2[i])); } 解释:这里的for循环和上面的差不多,注意这里的p值由于第一次for循环执行后现在已经是FAUX P了 加上第一次for循环的p值,最后的p为FAUX PASSWORD HAH

(9)p += String.fromCharCode(tab2[17]); 因为tab2=[70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65] 所以:p=FAUX PASSWORD HAH + A 因此,最后的p为FAUX PASSWORD HAHA

(10)pass = p;return pass; 即 pass = FAUX PASSWORD HAHA;return FAUX PASSWORD HAHA; 最后函数输出为FAUX PASSWORD HAHA

嗯哼???这个函数就执行完了???我的tab数组怎么没有用到???,我一开始带进来的参数呢?去哪了?别想了,输出值虽然用到了带进来的参数(就是分割后的tab数组),但是for循环那里人家直接使用tab2数组相关代码的值,根本没有用到tab数组的值,所以由于代码逻辑问题,你传入的dechiffre的参数pass_enc是没有任何意义的

四、dechiffre函数执行完成后,继续执行其它的代码 h = window.prompt(‘Enter password’); alert( dechiffre(h) ); h=你输入弹框内的内容 之后alert弹出dechiffre(h)的值,由前面所有的代码可知,代码里p的值与tab无关,因为最终都会被tab2的值替代,所以我们无论输入什么,也就是pass_enc=h,无论输入的这个h等于什么,不管tab能否被分割成字符串数组,是否存在,都只会利用到tab2。通俗点讲,有关tab的参数与值都可以视为没有,因此,pass_enc参数是什么也就没有意义了

五、最后,结论就是,无论我们在弹框中输入什么值,都只会返回FAUX PASSWORD HAHA

我就猜想,会不会String"fromCharCode";这个语法错误,并且没有没计算出来的是不是最后正确的值,也就是flag~

自己重新写页面执行代码

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
    var n=String.fromCharCode(55,56,54,79,115,69,114,116,107,49,50);
    document.write(n);
</script>
</body>
</html>

最后结果为:786OsErtk12

flag为:Cyberpeace{786OsErtk12}


总结

js源码分析,需要了解js相关技术分析流程找到flag

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、simple_js
  • 二、使用步骤
    • 1.点击获取在线场景
      • 2.进入页面
        • 3.源码分析
        • 总结
        相关产品与服务
        腾讯云代码分析
        腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档