IDF实验室—不难不易的js加密
查看源代码
<html>
<head>
<script src="/tpl/wctf/Public/js/lib/jquery.js"></script>
<script src="/tpl/wctf/Public/js/lib/md5.js"></script>
</head>
<body>
<script type="text/javascript">
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('4 a=1d("\\T\\Q\\Z\\10\\5\\Y\\n\\S\\X\\L\\W\\V\\x","");4 b="\\5\\j\\j\\0\\j\\h\\j\\k\\11\\k\\0\\0\\0\\3\\2\\0\\0\\C\\5\\3\\p\\2\\i\\5\\5\\0\\q\\q\\3\\u\\j\\h";4 c=/.+w.+w.+/P;4 d=t;4 e=a.1(O,y);9($.A(e)==b.B(/7/D,++d).B(/8/D,d*z)){4 f=a.1(t/d,R);9(f.1(y,z)=="\\1b\\M"&&$.A(f.1(t/d,d+E))=="\\p\\2\\6\\3\\i\\p\\3\\2\\i\\q\\u\\3\\n\\3\\h\\u\\6\\2\\h\\5\\6\\k\\i\\k\\i\\2\\2\\0\\6\\C\\5\\6"){r=a.1(15);9(r.m(d)-o==r.m(++d)-o&&r.m(--d)-o==r.m(--d)){4 g=l.H(1e);g=g.v()+g.v();9(r.1((++d)*E,1c)==g.19("\\h\\n\\M\\18")&&c.16(a)){d=l(s)+l(a.17)}}}};9(a.1(F,s)!=l.H(d)||a.1(F,s)=="\\12"){K("\\13\\L\\14\\1a\\N\\N\\J\\J")}U{K("\\I\\G\\I\\G\\x")}',62,77,'x37|substr|x30|x35|var|x66|x31|||if||||||||x65|x34|x33|x36|String|charCodeAt|x61|0x19|x64|x38||0x1|0x0|x62|toLowerCase|_|uff01|0x5|0x2|md5|replace|x39|ig|0x3|0x4|u559c|fromCharCode|u606d|u3002|alert|uff0c|x73|u60f3|0x8|gi|u5165|0x7|x67|u8f93|else|u5e74|u5c11|u5427|x6c|u4f60|u7684|x63|x7a|u989d|u518d|0xd|test|length|x79|concat|u53bb|x6a|0x6|prompt|0x4f'.split('|'),0,{}))
</script>
</body>
</html>
把eval换成alert,得到源码,将其中的十六进制和UNICODE编码转换,得到:
<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>
现在根据代码中的判断条件去反向猜解flag
变量a就是我们要猜的flag
变量b是一串MD5值
变量c是正则表达式
变量d是十六进制数字0
变量e是从flag中下标为5的地方开始取5个字符
第7行:变量e经MD5加密后的值与变量b替换后的值相等,替换规则是先把b中的7替换成1(++d),再把8替换成2.得到e经过MD5加密后的值为“f3313e36c611150119f5d04ff1225b3e”,解密得“jiami”,也就是flag从下标为8的地方开始为"jiami"
第8行:变量f为flag从头开始截取7个字符,注意这时d的值经过第7行运算后变为1.
第9行:变量f从下标5处截取两个字符为“js”,也就是flag的下标5和下标6对应的字符为“js”,并且f的前四个字符(也是flag的前4个字符)的MD5值为“d0154d5048b5a5eb10ef1646400719f1”,解出得“wctf”,flag的形式为wctf{XXXXX},所以下标为4的字符为“{”.
先来看第20行:String.fromCharCode(d)将一个UNICODE值返回成字符,这里截取的是下标为4的字符,也就是“{”,由此可以反向解出d的值为123.
第15行:这里是d最后一次进行运算,d是两个字符串“1”和flag长度的拼接,d为123,得出a.length的值为23
有了flag的长度,现在可以构造出flag的形式,用“?”代替未知字符,现在已知flag为wctf{js?jiami?????????}
第10行:变量r是从flag下标13开始截取到最后
第11行:r.charCodeAt(d)是将d转成UNICODE字符,注意此时d的值为1,这里d经过几次运算,值在变化,为了分析简单,我把每次运算的值替换为数字就是这样
r.charCodeAt(1)-0x19==r.charCodeAt(2)-0x19&&r.charCodeAt(1)-0x19==r.charCodeAt(0)
这段代码的意思是r的下标1与下标2的字符相同,下标为1的字符减去0x19就是下标0的字符
第12,13行:g最后的值为“oo”
第14行:r.substr((++d)*0x3,0x6),之前d为0,这里就是r.substr((1)*0x3,0x6),从r下标为3开始截取6个字符为g.concat("easy"),也就是“ooeasy”,这时flag为wctf{js?jiami???ooeasy}. c.test(a)是说flag的形式符合变量c(正则表达式),里面包含两个不相邻下划线“_”,所以flag为wctf{js_jiami_??ooeasy},从第11行代码知道剩下的两个字符相等,r下标为0的字符就是“_”,可以得出剩下的两字符为“xx”
最终得出flag: wctf{js_jiami_xxooeasy}
IDF实验室—不难不易的js加密的更多相关文章
- IDF-CTF-不难不易的js加密 writeup
题目链接: http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=28 就是这里 → http://ctf.idf.c ...
- IDF 实验室部分题目WriteUp
前天花了一个下午的时间刷了几道IDF实验室的题目, 这个网站实在是有点冷清, 题目也比较少, 所以就被我和师兄们刷榜了2333... 因为我最先开始做, 所以就干脆刷到第一去了. 题目很水, 切莫见怪 ...
- IDF实验室-CTF训练营-牛刀小试CTF
自从开始玩CTF后,发现这个游戏还是比较有意思,发现了一个练习场地IDF实验室:http://ctf.idf.cn/ 刷刷里面的题目,今天完成了其中的牛刀小试,分享一下解题思路: 1. 被改错的密码 ...
- js加密后台加密解密以及验证码
该文档为转载内容: 加密解密 1 前端js加密概述 2 前后端加密解密 21 引用的js加密库 22 js加密解密 23 Java端加密解密PKCS5Padding与js的Pkcs7一致 验证码 1 ...
- 翻译小工具制作,Python简单破解有道JS加密!
写这篇文章之前,我记得我以前好像公布一次.百度翻译的接口把版本号修改可以得到老版本,而老版本是没JS加密的,有道的呢也是一样的. ! 不过今天的教程不会这么low,咱们今天就老老实实把有道翻译的JS破 ...
- 昆仑游戏[JS加密修改]
昆仑游戏:http://www.kunlun.com/index.html JS加密修改 BigTools=window.BigTools;//重点 RSAKeyPair=window.RSAKeyP ...
- web主题公园版权信息破解:script.js加密文件
很多人会使用web主题公园网站的免费worldpress主题,但它的主题又都被加了版权信息,故意让人找不到版权信息的修改位置. 你如果去footer.php里面删除版权信息(技术支持:web主题公园) ...
- js加密的密文让PHP解密(AES算法)
JS加密代码如下 <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/aes ...
- RSA加密前端JS加密,后端asp.net解密,报异常
RSA加密前端JS加密,后端asp.net解密,报异常 参考引用:http://www.ohdave.com/rsa/的JS加密库 前端JS加密代码: function GetChangeStr() ...
随机推荐
- NVIC配置中的分组详解
在配置优先级的时候,要注意一个很重要的问题,中断种类的数量. NVIC只可以配置 16 种 中断向量的优先级,也就是说,抢占优先级和响应优先 级的数量由一个 4 位的数字来决定, 把这个 4 位数字的 ...
- CefSharp禁止弹出新窗体,在同一窗口打开链接,并且支持带type="POST" target="_blank"的链接
1.实现ILifeSpanHandler接口,代码如下: using CefSharp; using CefSharp.WinForms; using System; using System.Col ...
- C#操作字符串之常用函数总结
1:使用string.Join 泛型集合快速转换拼接字符串. 2:使用 string.Split 将字符串截断转换成字符数组. 3:使用 string.Substring,string.Remove ...
- LD算法的C++实现(基于编辑距离的文本比较算法)
算法看这里: http://www.cnblogs.com/grenet/archive/2010/06/01/1748448.html 用数组实现: #include <iostream> ...
- 《Python黑帽子:黑客与渗透测试编程之道》 Web攻击
Web的套接字函数库:urllib2 一开始以urllib2.py命名脚本,在Sublime Text中运行会出错,纠错后发现是重名了,改过来就好: #!/usr/bin/python #coding ...
- django模型中, 外键字段使用to_filed属性 指定到所关联主表的某个字段
在django项目的开发过程中,在设计模型时一开始将主键设置成了一个自定义的字段,但是在创建搜索索引时却发现必须要存在一个id的字段,并且为主键(不知道是否是项目一开始就这样配置的原因), 但此时表结 ...
- Django 项目 实现重定向并进行反向解析
一.项目路由配置urls.py中 from django.conf.urls import include, url from django.contrib import admin # 匹配应用 u ...
- jzoj5864
本來這道題該100的,沒想到考試沒想最短路,直接跑暴力了 實際上這道題有原題跳樓機 那道題在模x的意義下統計答案 現在,我們要統計n個數的答案 30pts為提高組原題 剩下70pts,可以記dis[i ...
- 用navicat远程连接mysql:Can't connect to MySQL server (10060)
出现这种现象的原因有两个,一个是当前用户被mysql服务器拒绝,另外一个原因是3306端口被被防火墙禁掉,无法连接到该端口.解决方法如下: 1.设置远程用户访问权限: // 任何远程主机都可以访问数据 ...
- 双向链表的实现——java
实现类: /** * Java 实现的双向链表. * 注:java自带的集合包中有实现双向链表,路径是:java.util.LinkedList * * @author skywang * @date ...