XCTF-高手进阶区:NaNNaNNaNNaN-Batman

XCTF-高手进阶区:NaNNaNNaNNaN-Batman

在这里插入图片描述

目标:

  • 了解js代码(eval函数、splice函数)
  • 了解正则

Writeup

(1)这里没有目标环境,只有一个附件,好吧,那我们就下载下来

  • 我这里先用sublime.txt打开看看
    在这里插入图片描述
  • 复制的源码:
<script>_='function $(){e=getEleById("c").value;length==16^be0f23233ace98aa$c7be9){tfls_aie}na_h0lnrg{e_0iit\'_ns=[t,n,r,i];for(o=0;o<13;++o){	[0]);.splice(0,1)}}}	\'<input id="c">< οnclick=$()>Ok</>\');delete _var ","docu.)match(/"];/)!=null=["	write(s[o%4]buttonif(e.ment';for(Y in $='	')with(_.split($[Y]))_=join(pop());eval(_)</script>
  • 原来是js代码,那么我们接下来右键用浏览器打开查看:
    在这里插入图片描述

(2)那么我们就来进行js源代码分析:

  • _等于一个$函数内容
_='function $()
  • 一个输入框
<input id="c">< onclick=$()>Ok</>\');
  • 核心代码:
    eval函数,这是执行函数;这里执行了_变量中的内容也就是''中的内容,但是,要注意的是,它并没有执行$()函数,仅仅执行了字符串而已(从而导致乱码),因而页面html页面没有任何显示,只显示了input标签的内容,但是我们想让源代码正常显示出来,不进行执行,那么,我们就用到了alert弹窗(将eval函数改为alert),将乱码的$()函数源码完整显示出来
    这里可以使用浏览器打开,也可以将修改后的源代码放入控制台执行(放入控制台需要注意删除script前后标签)
    浏览器打开:
    在这里插入图片描述
    控制台打开:
    在这里插入图片描述
    在这里插入图片描述
    整理后如下图所示:
function $(){
var e=document.getElementById("c").value;
if(e.length==16)
   if(e.match(/^be0f23/)!=null)
      if(e.match(/233ac/)!=null)
         if(e.match(/e98aa$/)!=null)
             if(e.match(/c7be9/)!=null){
             var t=["fl","s_a","i","e}"];
             var n=["a","_h0l","n"];
             var r=["g{","e","_0"];
             var i=["it'","_","n"];
             var s=[t,n,r,i];
             for(var o=0;o<13;++o){
             document.write(s[o%4][0]);s[o%4].splice(0,1)}
             }
}
document.write('<input id="c"><button οnclick=$()>Ok</button>');
delete _

又要分析上面这幅图的代码了…
我们的终极目标是打印出document.write(s[o%4][0]);s[o%4].splice(0,1)}
因此我们要满足关键变量e的条件

e.length==16
e.match(/^be0f23/)!=null
e.match(/233ac/)!=null
e.match(/e98aa$/)!=null
e.match(/c7be9/)!=null

这里又用到了正则表达式
^表示开头一定要匹配到be0f23,$表示结尾一定要匹配到e98aa,其它的只要匹配到就好,没有位置要求
于是我们构造e的值

e=be0f233ac7be98aa

将上面的核心代码后缀改为html格式,打开如下图所示
在这里插入图片描述
框中输入e的值be0f233ac7be98aa,点击Ok(当然你也可以在原来获得的web100文件浏览器执行的输入框中输入be0f233ac7be98aa)
得到flag:
flag{it’s_a_h0le_in_0ne}

注1:当然,如果大家觉得构造麻烦,可以直接执行获取flag的核心代码,代码如下

<script>
var t=["fl","s_a","i","e}"];
             var n=["a","_h0l","n"];
             var r=["g{","e","_0"];
             var i=["it'","_","n"];
             var s=[t,n,r,i];
             for(var o=0;o<13;++o){
             document.write(s[o%4][0]);s[o%4].splice(0,1)}
</script>

注2:
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。
注释:该方法会改变原始数组。

语法
arrayObject.splice(index,howmany,item1,.....,itemX)
参数	                         描述
index	                     必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany	                     必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX	         可选。向数组添加的新项目。

测试代码:

<script>
var t=["fl","s_a","i","e}"];
var n=["a","_h0l","n"];                       
var r=["g{","e","_0"];
var i=["it'","_","n"];            
var s=[t,n,r,i];
o=0;
document.write(s[o%4][0]);s[o%4].splice(0,1);//输出fl;随后删除fl
/*
代码运行详解:
第一步:document.write(s[0][0]);s[0].splice(0,1);
第二步:document.write(t[0]);t.splice(0,1);
第三步:document.write("fl");删除t["fl","s_a","i","e}"]中第一个位置,一个项目,即删除fl
*/
document.write("<br>");
document.write(t);
</script>
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

1stPeak

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

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

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

打赏作者

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

抵扣说明:

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

余额充值