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>