ctfshow-红包题第四弹
进去后发现就一个输入框,提示我们输入flag{}
不过输了后没反应,那么审查元素看看
可以发现是调用的ctfshow()这个函数
在chrome的console窗口调试下这个函数看下它干嘛的
格式化下代码方便审计
可以发现这是把js代码变量名16进制编码后再把代码逻辑复杂化
好我们来读下这串代码:
首先定义一个变量_0x4d832a
值为一个字典{}
字典里有一个键值对
键为'aTkul'
值为一个函数,其作用就是把传来的值return回这个值的函数
用人话来讲就是调用一个函数
到下面这串_0x4d832a[a0_0x138e('0x5')](我们);
就是一个字典调用,啥你问a0_0x138e('0x5')是啥??
问console
ok到这先好好理解上面这串最简单的加密逻辑,因为后面这整个js都是这玩意
js指的就是这玩意,套着script的皮却是css的后缀,佛了
理解完后就可以往下跟进了
也就是跟进我们()这个函数
因为压缩过就只能把全部js全复制出来格式化,当然你想手工提取出来也行(有更好的方法请在评论说出来,感谢各位师傅了)
ok跟进到这如果理解清楚上面说的,那么就能很清楚第一行就是定义一个字典
里面的值先不细看
往下看是一堆变量,然后到一个判断
那么从判断开始一步一步往上推
两个值
_0x491b2b=调用_0xd8e338['UIVfT']这个函数,传递的值为getEncodeString,_0x35b4d3[a0_0x138e('0xa')(0x0, 0xd)
这里有三个函数,第二个看名字就知道干啥的就不跟进了
第一个就是调用上面字典的UIVft值
就是把传进来第二个的值当作第一个值的实参
人话讲就是getEncodeString(_0x35b4d3[a0_0x138e('0xa')](0x0, 0xd))
ok那看最后一个函数,先把16进制转成10(方便看)
getEncodeString(_0x35b4d3[a0_0x138e('10')](0, 13))
接着看a0_0x138e('10')这个是啥就行了
放到console
getEncodeString(_0x35b4d3.substr(0, 13))
这意思很明显了,继续往上找_0x35b4d3这个变量
跟上面用的一样的方法a0_0x138e('0xa')也就是调用substr函数
继续找_0x1f7275
反转字符串_0x1ef9ff,继续
把两个参数相加
这两个参数等于
很明显就是把getEncodeString(_0x6ab3ec)+hex_md5(_0x6ab3ec)
那么重要的就是搞清楚这个_0x6ab3ec是啥
也就是说获取页面输入的getEncodeString(reverseStr(flag再进行两段加密之和))
逻辑很清楚了,就是把我们输入的flag和flag进行比较
那么我们找到比较的这个变量就ok啦
和上面一样的审计方式
加密后的flag找到!
那么按照我们输入的加密逻辑逆过来就能解密了
getEncodeString(reverseStr("2xsrn72z4wurn7k5ewp5nx3x6wqjm72z4wxbn33zcgwzm"))
就差最后一步了getEncodeString("mzwgcz33nbxw4z27mjqw6x3xn5pwe5k7nruw4z27nrsx2")
因为这是Encode的函数,所以得跟进去看怎么加密(出题人没给Decode,当时看到这一大串.以为要自己手写,心态蹦了...)
我们可以试试用这函数加密看得到的密文是怎样的
什么!!?竟然是mzwgczy,
S这不就是base32吗!!!
......好了不装了老实分析下getEncodeString吧
好了我分析完了发现是base32加密
你呢?
最后解密就得到flag啦