본문으로 바로가기

HKWT-2013-0007 / Javascript Compressor

category Information Security 2013.02.07 20:34

개요

이번에 포스팅 하고자 하는 주제는 Javascript Compressor기능이다.

[그림 1. Jacascript 압축된 코드]

Javascript Compressor를 이용하여 단순한 코드를 이렇게 변형시켜 놓았다. Compressor는 압축기 라는 의미인데 IT용어들 중에는 Packed(패킹), Obfuscation(난독화)이라는 단어가 있는데 왜 Compressor라는 단어를 사용했을까? Dean Edwards의 사이트에 들어가보자. Dean Edwards는 위 코드와 비슷한 코드를 생성할 수 있는 알고리즘을 만든 사람이다. 그의 사이트에는 다음과 같이 적혀있다.

[그림 2. Dean Edwards's Javascript Packer]

Javascript Compressor/Obfuscation 툴 이름이 Packer이다. 분석가(혹은 프로그래머)가 소스코드를 한눈에 읽기 어렵게 만들어 놓았으니 Obfuscator(난독화), 여러 줄의 코드를 한줄로 묶었으니 Packed(패킹), 빈 공간의 절약으로 파일 용량을 줄일 수 있으니 Compressor(압축기)라고 생각한다. 분석가 입장에서는 딱히 구분지어 생각할 필요 없이 난독화라고 생각하는게 편할 것 같다. 조금 더 생각하면 몇 바이트 줄이고자 Compressor 기능을 사용할 개발자는 없을 것 같다.

웹 어플리케이션을 이용한 해제

Javascript Beautifier라는 사이트를 이용해보자. Javascript나 HTML 소스코드를 아름답게(?) 만들어 주기 위한 목적을 가진 사이트로 Syntax Highlighter, unpack, deobfuscate, decompressor등 가독성을 높여주는 사이트 이다. 또한 이 사이트와 비슷한 기능을 하는 다양한 Plugin과 tool들을 소개한다.

[그림 3. Javascript Beautifier]

보는 것과 같이 가운데 빈 공간에 소스코드를 넣고 "Beautify Javascript or HTML"를 눌러주면 된다. 웹 어플리케이션임에도 단축키(Ctrl+Enter)를 지원하는 센스를 가졌다. 위 사이트를 이용하여 그림 1을 해제해보면 다음과 같은 결과를 볼 수 있다.

[그림 4. 그림1 코드의 해제]

iframe의 src에 따라 악성코드를 유포하는지 정상적인지 알 수 있는 코드가 나타났다. 경험상 cookie값을 이용하여 기감염 체크, expires.setTime을 이용하여 시간계산 등 뻔한~ 악성코드 유포지로 리다이렉션 하는 javascript이다.

조금은 편한 수작업을 이용한 해제

두 가지 방법이 있다. 하나는 eval을 alert으로 바꾸어 alert창을 통해 풀린 내용을 보는 것과 xmp 태그를 이용하여 보는 방법이다. alert보단 xmp 태그를 이용하는 것이 좋은데 이유는 xmp 태그를 통해서 나타난 결과는 복사가 가능하기 때문이다.

먼저 xmp 태그를 이용한 해제이다. notepad를 열어 다음과 같이 코드 앞뒤로 코드를 추가한 후 html파일로 저장 후 실행하면 된다.

[그림 5. xmp 태그를 이용한 해제]

[그림 6. xmp 태그 실행결과]

실행 되기전에 소스코드를 보여주는 기능이기 때문에 cookie나 연산에 관련된 내용은 없는 것 같다. pre 태그 같은 경우는 소스코드를 출력하면서 pre 태그 안의 코드를 실행하기 때문에 사용하면 안된다.

다음으로는 eval을 alert으로 치환하여 내용을 출력하는 것이다. xmp태그를 사용할 때와 같이 다음과 같이 치환한 후 html파일로 저장 후 실행하면 된다.

[그림 7. alert 치환을 이용한 해제]

[그림 8. alert 사용의 결과]

alert을 이용한 해제는 xmp를 이용한 결과보다 Javascript Beautifier  이용한 결과에 가까운 것이 장점이지만, 해제된 코드를 복사할 수가 없다는 것이 단점이다. (Windows 계열에서는 Ctrl + C를 하면 복사가 된다.) 그 외에도 Javascript Beautifier에서 다양한 도구와 방법들을 알려주지만 Javascript Beautifier의 웹어플리케이션으로 해결 하는 것을 추천한다.

해제된 코드와 기존의 코드의 실험

그림 1의 decompressor를 한 결과를 이용하여 Dean Edwards의 packer를 이용하여 다시 compressor해보자.

[그림 9. Dean Edwards's Packer]

compressor한 결과와 그림 1의 소스코드를 비교해보면 다음과 같다.

[그림 10. 두 compressor 코드의 비교]

notepad++에서 compare기능을 이용하여 두 코드를 비교해 보았다. 왼쪽 코드는 function(p,a,c,k,e,d)로 시작하는 그림 1 코드이고, 오른쪽 코드는 function(p,a,c,k,e,r)로 시작하기에 Dean Edwards의 packer로 만든 코드임을 알 수 있다. 이 두 코드는 실행하면 똑같은 동작을 하지만 코드의 내용이 다르다. 이는 곧 compressor 할 때의 알고리즘 차이인데, 이 compressor 알고리즘은 Dean Edwards이 만든 것이므로 단순히 버전차이 인 것으로 추측하고 있다.

또 다른 Javascript Compressor

마지막으로 Javascript Compressor에 관심이 있다면 CompressorRater라는 사이트를 방문해보자. 이 사이트에서는 다양한 Compressor를 이용할 수 있을 뿐만 아니라 해당 Compressor에 Option을 넣어 테스트 할 수 있다. 어떤 Compressor를 사용했는지, 해당 Compressor에 어떤 option을 사용했는지, Compressor에 따른 Run Time과 size 변화, 압축률을 확인 할 수 있으며, 결과를 보여준다.


댓글을 달아 주세요

티스토리 툴바