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>

XCTF-高手进阶区:NaNNaNNaNNaN-Batman相关推荐

  1. 攻防世界web高手进阶区ics-05(XCTF 4th-CyberEarth)WriteUp

    文章目录 解题部分 总结: 解题部分 题目来源 攻防世界web高手进阶区ics-05(XCTF 4th-CyberEarth) 1.拿到题目以后,发现是一个index.php的页面,并且设备-没有显示 ...

  2. 攻防世界 web高手进阶区 10分题 weiphp

    前言 继续ctf的旅程 开始攻防世界web高手进阶区的10分题 本文是weiphp的writeup 解题过程 进入界面 点击 进入一个登陆界面 没有注册 那肯定得找源码了 惯例源码+御剑 发现git泄 ...

  3. 攻防世界 Reverse高手进阶区 2分题 reverse-for-the-holy-grail-350

    前言 继续ctf的旅程 攻防世界Reverse高手进阶区的2分题 本篇是reverse-for-the-holy-grail-350的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数 ...

  4. 攻防世界 web高手进阶区 9分题 favorite_number

    前言 继续ctf的旅程 开始攻防世界web高手进阶区的9分题 本文是favorite_number的writeup 解题过程 进入界面 简单的代码审计 首先是个判断,既要数组强等于,又要首元素不等 然 ...

  5. 攻防世界 Crypto高手进阶区 3分题 wtc_rsa_bbq

    前言 继续ctf的旅程 攻防世界Crypto高手进阶区的3分题 本篇是wtc_rsa_bbq的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一个无后缀文件 扔 ...

  6. 攻防世界高手进阶区——dice_game

    攻防世界高手进阶区--dice_game 题目里面啥都没有. 一.分析文件 checksec 只有栈溢出保护关闭了,其他都是开着的. 运行 可以看出是要猜数字,猜对50次. ida逆向 __int64 ...

  7. 攻防世界高手进阶区 ——forgot

    攻防世界高手进阶区 --forgot 看了半天,啥也没看懂,做出来了才发现啥也不是. 一,分析文件 checksec 还好,只开启了堆栈不可执行. 运行一下 翻译了一下,应该是判断邮箱是否合乎规矩. ...

  8. forgot [XCTF-PWN][高手进阶区]CTF writeup攻防世界题解系列13

    题目地址:forgot 本题是高手进阶区的第二题,恭喜大家已经进入高手行列!好假好假,哈哈哈! 废话不说,看看题目先 这个题目有很长的描述,但是都是废话,不去管他了. 照例下载附件,做下安全检查 ro ...

  9. 攻防世界 Crypto高手进阶区 3分题 你猜猜

    前言 继续ctf的旅程 攻防世界Crypto高手进阶区的3分题 本篇是你猜猜的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一串16进制 504B03040A ...

  10. 攻防世界 Misc高手进阶区 7分题 Russian-zips

    前言 继续ctf的旅程 攻防世界Misc高手进阶区的7分题 本篇是Russian-zips的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一个压缩文件 解压要 ...

最新文章

  1. 2021年2月程序员工资统计,又拖后腿了……
  2. 2018.2.27 9周5次课
  3. java vertx http_佛系学习Vert.x之创建你的HttpServer
  4. Jmail的使用,可以发送给多人
  5. mybatis源码学习(三):MappedStatement的解析过程
  6. 【qduoj - 1012】反转数字(模拟,水题)
  7. OllyDBG完美教程(超强入门级)
  8. SpringBoot系列: CommandLineRunner接口的用处
  9. python函数降低编程复杂度_Python重构此函数,将其认知复杂度从19降低到允许的15...
  10. php微信投票刷票,微信投票程序源码
  11. 高维数据可视化之t-SNE算法
  12. Windows网上邻居 授权访问设置
  13. 宝塔+云锁nginx自编译web防护 防御CC效果极佳
  14. python名片管理系统2.0_python名片管理系统代码
  15. CC2530定时器1使能
  16. linux下解压iso镜像文件方法
  17. 软件安全实验——lab7(缓冲区溢出3:返回导向编程技术ROP)
  18. 移动硬盘加密后在linux中如何使用方法,移动硬盘加密的方法你都知道吗?
  19. DC的逻辑综合与优化
  20. 【GHM (AAAI‘2019)】

热门文章

  1. cmake指定gcc版本
  2. Nginx-Lua模块的执行顺序
  3. Scala入门到精通——第二十五节 提取器(Extractor)
  4. HBase中Bloomfilter类型的设置及使用的理解
  5. [转]vc中socket编程步骤
  6. 两种驱动系统运行的方式--分时的方式
  7. Spark Mllib里的如何对两组数据用斯皮尔曼计算相关系数
  8. 微博预计要火一阵的SleepSort之Shell及C实现
  9. Oracle over函数学习
  10. 机器学习 —— 基础整理(一)贝叶斯决策论;二次判别函数;贝叶斯错误率;生成式模型的参数方法...