IDF-CTF-不难不易的js加密 writeup
2015-06-18 17:13
567 查看
题目链接: http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=28
知识点:js加密,js代码分析,md5解密,Unicode/Ascii码,正则表达式
思路:
点开链接后弹出一个窗口,要求输入flag,按F12可以看到窗口是用一段加密的js代码实现的,将这段js代码复制到站长工具中进行解密,得到解密后的js代码,然后将其中的Unicode码及Ascii码转换为相应的字符,结果如下:
分析代码,发现变量 a 就是我们要求的 flag。
经过 b.replace(/7/ig, ++d).replace(/8/ig, d * 0x2) 后变量 b 变为 f3313e36c611150119f5d04ff1225b3e,经 md5 解密后得到 jiami,这就是变量 e 的值,而 e = a.substr(0x8, 0x5)。
此时变量 d=0x01,d0154d5048b5a5eb10ef1646400719f1 经md5解密得到 wctf ,即 f.substr(0x0, 0x4)=‘wctf’,又 f.substr(0x5, 0x2) == “js”,且 f = a.substr(0x0, 0x7),这样又可以确定变量 a 的一部分。
此时变量 d=0x1,继续计算,可得 r = a.substr(13),r.charCodeAt(1) == r.charCodeAt(2),r.charCodeAt(1) - 0x19 == r.charCodeAt(0),得到了三个位置的代数关系。
此时变量 d=0x0,g=’oo’,r.substr(3, 6) == ‘ooeasy’,由 c.test(a) 为“真”结合 flag 一般为“wctf{…}”的格式可初步猜测变量 a=’wctf{js_jiami_xxooeasy}’。
计算 d=123,验证最后一个 if 语句可得猜测正确,条件转向“恭喜恭喜”。
知识点:js加密,js代码分析,md5解密,Unicode/Ascii码,正则表达式
思路:
点开链接后弹出一个窗口,要求输入flag,按F12可以看到窗口是用一段加密的js代码实现的,将这段js代码复制到站长工具中进行解密,得到解密后的js代码,然后将其中的Unicode码及Ascii码转换为相应的字符,结果如下:
<script type = "text/javascript" > var a = prompt("输入你的flag吧,少年!", ""); var b = "f3373e36c677750779f5d04ff7885b3e"; var c = /.+_.+_.+/gi; var d = 0x0; var e = a.substr(0x8, 0x5); if ($.md5(e) == b.replace(/7/ig, ++d).replace(/8/ig, d * 0x2)) { var f = a.substr(0x0 / d, 0x7); if (f.substr(0x5, 0x2) == "js" && $.md5(f.substr(0x0 / d, d + 0x3)) == "d0154d5048b5a5eb10ef1646400719f1") { r = a.substr(0xd); if (r.charCodeAt(d) - 0x19 == r.charCodeAt(++d) - 0x19 && r.charCodeAt(--d) - 0x19 == r.charCodeAt(--d)) { var g = String.fromCharCode(0x4f); g = g.toLowerCase() + g.toLowerCase(); if (r.substr((++d) * 0x3, 0x6) == g.concat("easy") && c.test(a)) { d = String(0x1) + String(a.length) } } } }; if (a.substr(0x4, 0x1) != String.fromCharCode(d) || a.substr(0x4, 0x1) == "z") { alert("额,再去想想。。") } else { alert("恭喜恭喜!") } < /script>
分析代码,发现变量 a 就是我们要求的 flag。
经过 b.replace(/7/ig, ++d).replace(/8/ig, d * 0x2) 后变量 b 变为 f3313e36c611150119f5d04ff1225b3e,经 md5 解密后得到 jiami,这就是变量 e 的值,而 e = a.substr(0x8, 0x5)。
此时变量 d=0x01,d0154d5048b5a5eb10ef1646400719f1 经md5解密得到 wctf ,即 f.substr(0x0, 0x4)=‘wctf’,又 f.substr(0x5, 0x2) == “js”,且 f = a.substr(0x0, 0x7),这样又可以确定变量 a 的一部分。
此时变量 d=0x1,继续计算,可得 r = a.substr(13),r.charCodeAt(1) == r.charCodeAt(2),r.charCodeAt(1) - 0x19 == r.charCodeAt(0),得到了三个位置的代数关系。
此时变量 d=0x0,g=’oo’,r.substr(3, 6) == ‘ooeasy’,由 c.test(a) 为“真”结合 flag 一般为“wctf{…}”的格式可初步猜测变量 a=’wctf{js_jiami_xxooeasy}’。
计算 d=123,验证最后一个 if 语句可得猜测正确,条件转向“恭喜恭喜”。
相关文章推荐
- 理解Javascript_15_作用域分配与变量访问规则,再送个闭包
- js this对象研究
- Web性能优化系列:10个JavaScript性能提升的技巧
- Windows下JavaScript环境搭建
- javascript中的继承特性
- Javascript之自定义事件
- ServiceStack.Text 的JSON序列号和反序列化
- js判断正整数
- 理解Javascript_14_函数形式参数与arguments
- JS高级编程5-作用域安全的构造函数
- 理解Javascript_12_执行模型浅析
- JavaScript Number 对象 Javascript Array对象 Location 对象方法 String对象方法
- JS高级编程4-函数节流
- js本地图片预览,兼容ie[6-9]、火狐、Chrome17+、Opera11+、Maxthon3
- 理解Javascript_10_对象模型
- JS高级编程3-函数柯里化
- JavaScript深究系列 [一]
- JS高级编程2-使用高阶函数
- js中两个对象的比较
- JS高级编程2-使用高阶函数