XCTF_Web_新手练习区:simple_js(源代码详解)

第七题:simple_js (源代码详解)

在这里插入图片描述

目标

掌握有关js的知识

Writeup

  • 进入环境后我们遇到了输入密码,于是我们随便输入一个密码,点击确定
    在这里插入图片描述
    在这里插入图片描述
  • 之后啥也没有,于是我们看看源代码,哎,有东西,不错呦
<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>

源代码详解

执行流程:
一、首先定义了一个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"](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"));这个语法错误,并且没有没计算出来的是不是最后正确的值,也就是flag~
于是,我不用它这么无论pass_enc参数输入什么都显示FAUX PASSWORD HAHA的函数,咱也抛弃它一回,自己重新写代码执行它
<!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格式输入最后的flag!

注:

(1)split() 方法用于把一个字符串分割成字符串数组
语法:string.split(separator,limit)
参数                 描述
separator        可选。字符串或正则表达式,从该参数指定的地方分割 string Object。比如此题以逗号分割成字符串数组
limit            可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
举例:str="a,b,c,d,e,f,g";
var 1st = str.split(",",3);   对str以逗号进行分割,分割后的字符串数组内的值最多只能有3个,结果就是1st = [a,b,c]

(2)for 循环的语法如下:
for (语句 1; 语句 2; 语句 3) {
     要执行的代码块
}
语句 1 在循环(代码块)开始之前执行。
语句 2 定义运行循环(代码块)的条件。
语句 3 会在循环(代码块)每次被执行后执行。

(3)fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串。
语法:String.fromCharCode(n1, n2, ..., nX)
参数                 描述
n1, n2, ..., nX     必需。一个或多个 Unicode 值,即要创建的字符串中的字符的 Unicode 编码。

(4)prompt()方法用于显示可提示用户进行输入的对话框。
这个方法返回用户输入的字符串
语法:prompt(msg,defaultText)
参数                描述
msg                可选。要在对话框中显示的纯文本(而不是 HTML 格式的文本)就是弹框显示文本。
defaultText        可选。默认的输入文本,你输入什么弹框一开始出现里面的输入框就会默认显示你这个文本。

(5)var i,j,k,l=0,m,n,o,p = "";
这个表示声明变量i,j,k,l,m,n,o,p,只有l和p两个变量被赋值了,其它的变量都是不带值的,不带有值的变量,它的值将是undefined,后续代码中可以给它赋值。

(6)length
length 属性可设置或返回数组中元素的数目。
  • 30
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: pure_color xctf是一个CTF比赛平台,致力于举办和推广网络安全竞赛。 pure_color xctf的目标是为安全爱好者和专业人士提供一个学习、切磋和交流的平台。这个平台上举办的比赛覆盖了各种网络安全领域,包括但不限于网络攻防、密码学、逆向工程等。通过参与这些比赛,参赛者可以提升自己的技能,了解最新的安全威胁和攻击技术,锻炼解决问题的能力。 pure_color xctf的比赛模式多样,可以是个人或团队参与。参赛者需要在限定的时间内完成一系列的题目,这些题目可能包含漏洞分析、编程挑战、数据分析等。比赛过程中,参赛者需要运用各种技术手段,如渗透测试、代码审计、漏洞利用等,解决题目的要求。参赛者不仅需要具备网络安全相关的知识,还需要具备良好的团队合作和解决问题的能力。 此外,pure_color xctf也为参赛者提供了一个交流平台。比赛期间,参赛者可以在平台上与其他选手交流经验、讨论解题思路。参赛者也可以通过竞赛结果来评估自己的能力,并与其他选手进行切磋比拼。 总之,pure_color xctf是一个举办网络安全竞赛的平台,旨在为安全爱好者和专业人士提供学习和交流的机会,促进网络安全技术的发展。 ### 回答2: pure_color xctf 是一项竞技性的网络安全挑战赛。XCCTF 是全球知名的网络安全竞赛组织之一,而 pure_color 是该竞赛组织内的一项赛事。该赛事旨在提升参赛者的网络安全技能和知识,让他们在一个仿真的网络环境中进行攻防对抗。 在 pure_color xctf 中,参赛队伍将根据题目要求进行网络攻击和防御。这些题目有不同的难度级别,并涵盖了各种不同的网络安全技术和攻击类型。参赛队伍将需要利用他们的知识和技能,像真实的黑客一样去攻击系统漏洞,获取目标系统内的敏感信息或是直接控制目标系统。同时,他们也需要通过搭建防御策略和系统来保护自己的系统免受攻击。 pure_color xctf 不仅仅是一个交流学习的平台,也是一个展示能力的舞台。优胜的参赛队伍将会被邀请参加更高级别的网络安全竞赛和会议,进一步提升他们的技能并扩展职业网络。此外,pure_color xctf 也为参赛者提供了一个找到职业机会的平台,很多安全公司和组织会在赛事期间招聘优秀的选手。 总而言之,pure_color xctf 是一个有挑战性的网络安全竞赛,旨在通过攻击和防御对抗提升参赛者的技能,并为他们提供职业发展和展示的机会。同时,这个赛事也在促进网络安全领域的交流和合作,为提升整个网络安全行业的水平做出贡献。 ### 回答3: pure_color xctf 是一个CTF(Capture The Flag,夺旗赛)竞赛平台。CTF是一种网络安全竞赛,旨在让参赛者通过解决一系列的密码学、逆向工程、漏洞利用等问题来获取旗标,比赛者可以通过这些旗标来获取积分并竞争排名。 pure_color xctf 平台是一个为CTF竞赛提供的一个在线环境,类似于一个实验室,用于举办CTF比赛。在这个平台上,参赛者可以注册账号并加入已经发布的CTF赛事中。赛事中的题目被分为不同的难度级别,涵盖了各种安全领域的知识。参赛者需要通过解决题目中的任务来获取旗标,并将其提交到平台上进行验证。在比赛结束后,将根据参赛者解决的题目数量、用时、积分等因素来计算最终排名,并颁发奖励给获胜者。 pure_color xctf 提供了逼真的仿真环境,使得参赛者能够在一个安全的网络环境下进行实时的攻防演练。平台上的题目多样化且具有挑战性,旨在让参赛者将所学的理论知识应用到实际场景中去,并培养解决问题和团队合作的能力。同时,pure_color xctf 还为参赛者提供了交流平台,方便他们在比赛过程中与其他参赛者交流经验、技巧以及解题思路。 总之,pure_color xctf 是一个提供CTF竞赛平台的在线环境,旨在鼓励参赛者在安全领域中深入学习和实践,并通过解决各种挑战赛题目来提升技能和知识水平。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1stPeak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值