g2uc

TeamBlog

[REVERSE]线上赛 0x07 Just enjoy it

0x07 Just enjoy it
操作内容:

引言.

这一题感觉还是有点难的,访问网址后经分析可知,提交的flag的验证算法在js文件里,也就是不经过网络直接本地计算,因此我们直接把网页保存到本地进行调试.

打开其js后可看出js进行了简单的混淆,为了能看的清楚一点,我用脚本进行了简单的处理.

经调试后发现其代码中有几处反调试,不得不说js有的反调试还蛮隐秘的,比如最显眼的反调试函数是_0x0113这个函数,其功能是断下调试器并不停刷新console控制台,一开始我是直接把这个函数删除掉的,但是到后面就踩坑了,这个下面再说.

经过简单处理后的代码大概是这样:

至少我们可以比较清晰的看到运行的流程,接下来我们分几部分来讲flag的验证过程.

1.

很简单的运算,就是把”XTeWlU!P”的ASCII码值加上0x0f即可得到flag的前八个字节”gctf{d0_”.

2.

这一段起初我直接忽视掉了,因为完全不影响返回的结果,但其实这段代码也透露出了一个重要的信息,即经过几个判断后将flag的第0x15(21)之后一位的字符替换为”@”.具体判断内容下面再说.

3.

这段代码计算检测的flag的9-16位的内容的正确性,不过其具体的算法我没有研究,只是通过输入类如”azAz019_”这样不同类型的头尾字符,然后调试查看0x8bce计算的返回内容,将这八位内容推测了出来”y0u1ik3”.

4.

接下来这段函数就是最有意思的一段了,图中所示的是原本未经修改的函数.

经过分析可知其功能为验证flag的18-20位是否正确,但是算法中隐藏着一处反调试,就是第103行的代码,其功能是检测开头我们所说的反调试函数_0x0113是否存在,若未定义该函数则会抛出异常,返回0x2提示”gg”.删掉这段命令即可解决,不过一开始我一直以为这是算法的一部分,坑了我挺久.

因为这段算法是不可逆的,因此我写了个脚本,枚举了符合该算法的所有字符串,然后放着先看下面的代码.

5.

最后这一段就比之前的简单多了,首先是判断flag中是否存在字符”7”且该字符是否不在末尾,满足条件则把”7”移动到flag的末尾.

其次是通过位异或计算flag的最后八位是否符合,由此可推出最后八位是”@u_5e3}7”,又因为”7”被置尾,所以正确的后八位应该是”7@u_5e3}”.

结尾.

根据目前得到的结果,flag应该是这样的:gctf{d0y0u1ik3?!!!...7@u_5e3}

?是代表未知的字符,!!!是代表步骤4中得到的很多符合验证条件的字符串,…是代表可以随便写也可以不写的字符串(因为js中的算法并未对长度做出明确的要求).

不过在步骤2中我们提到的算法里有这么一句判断:

inputFlag[“substr”](0x10, 0x1) == inputFlag[“substr”](0xb, 0x1)

判断flag的第12位和第17位是否相等,由此可判断未知的字符?应该就是”_”,

所以现在flag是gctf{d0y0u1ik3!!!...7@u5e3}

你会发现,有无限多的flag可以满足这个计算条件,不过按照常理来说,flag应该是最短的那个,

像这样gctf{d0y0u1ik3!!7@u5e3}

只有步骤4中flag的18-20位是最随机的,因此我枚举出所有第20位是”7”的内容.

gctf{d0y0u1ik3th7@u5e3}

但是经hash后不符合题目要求中的正确哈希值.因此排除.现在我们考虑多一位长度的情况:

gctf{d0y0u1ik3!!!7@u5e3}

经过脚本批量判断后发现,还是没有一个值符合题目所给的哈希值,难道我们的思路错了吗?其实在步骤2的代码还有作用.你会发现他在判断若第22位内容为”_”则将其变为”@”,是的,

因此正确的flag应该是这样的形式:gctf{d0_y0u_1ik3_!!!7_u_5e3}

此时再用脚本进行枚举对比即可成功拿到flag.

FLAG值:

gctf{d0_y0u_1ik3_wh47_u_5e3}

发表评论:

搜索
标签列表
网站分类
文章归档
站点信息
  • 文章总数:20
  • 页面总数:0
  • 分类总数:4
  • 标签总数:7
  • 评论总数:1
  • 浏览总数:566
控制面板
您好,欢迎到访网站!
  查看权限

Powered By Z-BlogPHP 1.5.2 Zero

Copyright g2uc Rights Reserved.

公告

请把不属于分类中比赛的题目wp发布在essay分类!另外,题解文章请记得在标签里标注题目类型!