不难不易的js加密

来源:互联网 发布:医疗器械软件风险管理 编辑:程序博客网 时间:2024/05/22 14:44

网页源码:

<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编码

注:JavaScript eval() 函数定义和用法

eval就是把字符串转成可执行代码。例如:eval("alert('test')");
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
语法
eval(string)

参数 描述

string 必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。

返回值

通过计算 string 得到的值(如果有的话)。

说明

该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数。

如果试图覆盖 eval 属性或把 eval() 方法赋予另一个属性,并通过该属性调用它,则 ECMAScript 实现允许抛出一个 EvalError 异常。

抛出

如果参数中没有合法的表达式和语句,则抛出 SyntaxError 异常。

如果非法调用 eval(),则抛出 EvalError 异常。

如果传递给 eval() 的 Javascript 代码生成了一个异常,eval() 将把该异常传递给调用者。

提示和注释

提示:虽然 eval() 的功能非常强大,但在实际使用中用到它的情况并不多。

实例

例子 1

在本例中,我们将在几个字符串上运用 eval(),并看看返回的结果:

<script type="text/javascript">eval("x=10;y=20;document.write(x*y)")document.write(eval("2+2"))var x=10document.write(eval(x+17))</script>

输出:

200427

例子 2

看一下在其他情况中,eval() 返回的结果:

eval("2+3")// 返回 5var myeval = eval;// 可能会抛出 EvalError 异常myeval("2+3");// 可能会抛出 EvalError 异常

可以使用下面这段代码来检测 eval() 的参数是否合法:

try  {     alert("Result:" + eval(prompt("Enter an expression:","")));     }catch(exception) {     alert(exception);     }

<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是一串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}



0 0
原创粉丝点击