훈훈훈

자바스크립트(JavaScript) 난독화 개념 & 실습 본문

정보보안/악성코드

자바스크립트(JavaScript) 난독화 개념 & 실습

훈훈훈 2018. 10. 26. 03:29


이번에는 JavaScript 난독화에 대해 다루어볼려고 한다.

난독화는 소스 코드를 보호하는 목적으로 사용한다.

하지만 때론 이 기법이 악의적인 목적으로 사용될 경우 악성코드를 보호하는 기술로 이용된다.

그렇기 때문에 악성코드를 분석하는 입장에서 난독화된 코드를 해석하는 기법은 매우 중요하다고 할 수 있다.

이제 난독화가 무엇인지 어떻게 진행하는지 살펴보자. 




- 난독화란 ? 

: 컴퓨터는 이해할 수 있지만, 사람이 코드를 보았을떄 이해하기 어려운 수준으로

  만드는 것이라 정의할 수 있다.




- 난독화의 목적 

 1) 보안 장비 우회 

 2) 분석 난이도 증가 -> 분석 시간 지연

 3) 결과적으로 악성코드 배포 기간 연장




- JavaScript를 이용한 난독화 실습

 : 이제 JaveScript를 사용해서 난독화 실습을 하려고 한다.

   실습에 사용할 코드는 최대한 간단한 코드를 사용하였다

   밑에 사진에 있는 코드로 난독화 대상인 "test.html" 파일을 만들었다.

    

 <test.html>


실행시 "obfuscation"(난독화) 라는 메시지 박스를 띄우는 파일인 "test.html"을 만들었다.



<test.html 실행화면>


test.html을 실행 시켰을때 다음 사진과 같은 메시지박스가 출력되는 것을 확인할 수 있다.

 



1) Compression

  : JaveScript는 들여쓰기를 지원하지 않기 때문에 한 줄로 표현이 가능하다.


<test1.html>


"test.html" 파일 코드에서 공백을 없애 "test1.html" 파일을 만들었다.

"test1.html" 파일이 코드 수정 이전과 같이 동작하는지 확인해보자.


<test1.html 실행화면>


"test1.html"을 실행시켰을때 "test.html"과 똑같이 동작하는 것을 확인할 수 있다.





2) function Expression

 : 함수를 이용해서 가독성을 떨어뜨려 보자.


<test2.html>


"test1.html" 코드에 "var n = function()" 코드를 추가하여 "test2.html" 파일을 만들었다.

이전과 같이 파일 실행시 "test1.html" 코드와 같이 동작하는지 확인해보자.


<test2.html 실행화면>


"test2.html" 실행시 "test1.html"과 같이 동작하는 것을 확인할 수 있다.





3) Data Splite

 : 소스코드를 무작위로 분할하여 각각의 변수에 저장한 후 마지막에 실행시킨다.

   ( 주의: : 공백이 있는 부분을 분할하면 안된다. )


<test3.html - 1>


"test2.html" 코드에서 무작위로 분할한 후 "var a1" to "var a4" 에 각각 초기화 시켰다.

이 코드는 이해 못할 정도의 수준의 코드가 아니기 때문에 한단계를 더 진행하자.


<test3.html - 2>


<test3.html - 2> 그림은 <test3.html -1> 코드에서 공백을 없앤 코드이다.

공백만 없앴을 뿐인데도 코드를 이해하기 어려운 것을 확인할 수 있다.


<test3.html 실행화면>


"test3.html"을 실행시킨 결과 이전과 똑같이 동작하는 것을 확인할 수 있다.





4) Data replace

 : 코드를 이해하기 어렵게하기 위해 의미없는 코드들을 삽입 후 나중에 모드 제거하는 기법이다.


<test4.html - 1>


<test3.html - 1> 코드에 "WavesLab"이란 의미없는 코드를 무작위로 삽입시킨 후 

마지막에 제거를하는 코드를 삽입하여 "test4.html" 파일을 만들었다.

의미없는 코드를 랜덤하게 삽입 했기때문에 한눈에 코드를 이해하기는 매우 힘들다.

이제 "test3.html" 처럼 공백을 없애보자.


<test4.html - 2>


<test4.html - 1>에서 공백을 없애 <test4.html - 2>를 만들었다. 

"test3.html"과 마찬가지로 코드를 한눈에 이해하기 힘들다.

이제 "test4.html"을 실행시켜보자


<test4.html 실행화면>


이전 파일과 똑같이 동작하는 것을 확인할 수 있다.




5) Date Encoding

 : 소스 코드 인코딩을 통해 코드를 이해하기 어렵게 만드는 기법이다.

  


<test5.html>


<test4.html - 1> 을 URL 인코딩을 통해 "test5.html>"를 생성했다.

단지 인코딩 과정만 거쳤을 뿐인데 이전 코드와는 다르게 디코딩과정을 거치지 않는 이상 이해하기 매우 어려운 수준이 되었다.

이제 해당 코드를 실행시켜보자.




"test5.html"을 실행한 결과 이전 파일과 같은 동작을 하는 것을 확인 할 수 있다.









- 결론 

 : 지금까지 JavaScript를 이용한 난독화에 대해 간단히 살펴보았다.

   처음 시작은 간단한 메시지박스를 출력하는 코드로 누구나 이해할 수 있는 코드였지만

   난독화 과정을 통해 똑같이 동작하는 코드이지만 한눈에 이해하기 어려운 코드가 되었다.

   복잡한 코드가 난독화 되었을 경우 더욱 해석하기 힘들 것이다..

   

  





Comments