ctfshow-红包题第四弹

题目链接:http://game.ctf.show/r1/

进去后发现就一个输入框,提示我们输入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啦

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章