6.3.1 web HCTF2017 babycrack
题目解析
题目就不用多说了,很容易发现是 JavaScript 代码审计。
整个文件的变量名/函数名可以看作是混淆了的,分析一下整个文件的结构:
——
|- _0x180a,关键字的替换数组
|- 匿名函数,对数组元素进行重排
|- _0xa180,取出对应索引的数组元素
|- check,主要的分析函数
|- test,主要的运行函数这道题结合浏览器进行动态调试,可以节省很多脑力。
首先是重排,这里不需要去深究到底逻辑原理,让引擎代替你去把数组重排好即可。结合程序员计算器和 CyberChef 分析更加方便。
解题流程
这样我们可以直接进入 check 函数进行分析。
以上部分可以看成是准备部分,这一部分的难点在于多次处理了数组,在动态调试时,很多函数如果多次执行就会产生与原答案不同的数组结构,因此,每次执行都需要重新初始化。
单独来分析,其实最初我看掉了一个括号,结果弄混了符号优先级,导致觉得这个条件没有意义。
这个条件是说,**第一段的最后两个字符的 16 进制和 ‘{’ 的 16 进制异或后,对第一段的长度求余应该等于 5 **。
这里可以先进行如下猜测
第一段,已经有 ‘hctf{’ 了,这里正好去最后两位,先猜测第一段一共只有 7 位,这个猜测是后验的,先不细说。
理解这个函数极为重要,通过随机输入进行测试,输出结果有些眼熟,像是 base64 但不对,比对后确定是 base32 编码,知道这个就不用再去多解读它了。同时,这里也有一个 debug 需要删除
这一句是说,**第三段做 base32 编码,取等号前的部分,再进行 16 进制和 0x53a3f32 异或等于 0x4b7c0a73 **
因此,flag 暂时如下 hctf{x_x_iz_x_x}
这一句是说,第四段和第三段一样编码后,和 0x4b7c0a73 异或等于 0x4315332
flag hctf{x_x_iz_s0_x}
首先是,**分割的两部份长度相等,第一部分和第二部分 16 进制异或等于 0x1613 **,这个条件只能后验,也先不管。
首先,0x2f9b5072 == 798707826
所以,第二段一共有 7 个字符,前四个字符为 rev3,带入上面的后验条件 0x1613
flag hctf{?_rev3rse_iz_s0_?}
题目的 hint 提示,每一段都有意义,因此我们这里做个爆破,假设第一段的长度在 6-30 之间,我们可以算出 n,在用 n 去算第五段前四位。
代码:
从结果中可以看到大多数字符都没有意义,除了 h4r 让人遐想联翩,可惜还是不全,但是结合已经分析出的 flag,猜测应该是 h4rd。
flag hctf{??_rev3rse_iz_s0_h4rd?}
第五段的第六位重复两次不等于倒数第 5-8 位,这个条件也让人摸不着头脑。
第五段倒数第 2 位等于第五段第五位加 1
第五段第 7-8 位去掉 0x 等于第五段第 7 位的 ascii 码*第五段长度*5
第五段第五位为 2,第五段 7-8 位等于第五段第 8 位重复两次
结合 hint
由以上条件可以推出以下 flag
先假设 2 和 3 之间没有数字了,这时 7-8 位还未知但是 7-8 位相同,这时的方程
爆破代码:
output:
验证前面的后验条件可以确定如下 flag
只剩下最前面的两位,为了方便,利用题目提供的 sha256 结果,我就不回溯条件在判断,直接进行碰撞。
output:
Last updated
Was this helpful?