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編碼轉換,得到:

 1 <script type="text/javascript">
 2     var a=prompt("輸入你的flag吧,少年!","");
 3     var b="f3373e36c677750779f5d04ff7885b3e";
 4     var c=/.+_.+_.+/gi;
 5     var d=0x0;
 6     var e=a.substr(0x8,0x5);
 7     if($.md5(e)==b.replace(/7/ig,++d).replace(/8/ig,d*0x2)){
 8         var f=a.substr(0x0/d,0x7);
 9         if(f.substr(0x5,0x2)=="js"&&$.md5(f.substr(0x0/d,d+0x3))=="d0154d5048b5a5eb10ef1646400719f1"){
10             r=a.substr(0xd);
11             if(r.charCodeAt(d)-0x19==r.charCodeAt(++d)-0x19&&r.charCodeAt(--d)-0x19==r.charCodeAt(--d)){
12                 var g=String.fromCharCode(0x4f);  
13                 g=g.toLowerCase()+g.toLowerCase();
14                 if(r.substr((++d)*0x3,0x6)==g.concat("easy")&&c.test(a)){
15                     d=String(0x1)+String(a.length)
16                 }
17             }
18         }
19     };
20     if(a.substr(0x4,0x1)!=String.fromCharCode(d)||a.substr(0x4,0x1)=="z"){
21         alert("額,再去想想。。")
22     }
23     else{
24         alert("恭喜恭喜!")
25     }
26 </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}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM