<자바스크립트(JavaScript) 난독화>
“자바스크립트” +”난독화”의 개념입니다.
자바스크립트는 웹 사이트에서 많이 사용되는 객체 기반 스크립트 프로그래밍 언어입니다.
그러나, 일반적으로 클라이언트 측 언어로 사용되기 때문에 소스가 공개되어 있다는 단점이 있습니다.
예를 들어 네이버 홈페이지에 들어가서, 크롬의 개발자 도구를 보게 되면…
위의 그림처럼 자바 스크립트 코드가 보이게 되는 것을 확인 할 수 있습니다.
이러한 단점을 보완하기 위해, “난독화”라는 개념을 가져와 사용하기 시작하였습니다.
난독화에도 종류가 나뉘는데, 여기서 사용한 개념은 코드 난독화로
코드 난독화는 프로그래밍 언어로 작성된 코드에 대해 읽기 어렵게 만드는 작업입니다.
난독화는 초기에 사용한 아이디어나 알고리즘을 숨기기 위한 것으로 사용되었으나, 근래에는 해커들의 공격 수단으로 사용되기 시작하였습니다.
그럼 이제 이 난독화 방법에 대해서 알아보려고 합니다.
(1)Split 기법
Split 기법은 문자열 기반의 탐지를 회피하기 위한 가장 간단한 기법입니다.
악성 문자열을 다수의 String 변수에 잘게 나눈 후 마지막에 재 조합을 하는 형식으로 이루어집니다.
위의 예제를 보면, split 기법을 사용하여 <iframe>태그를 넣은 것을 확인 할 수 있습니다.
(2)escape()/unescape()
escape()함수는 ASCII 형태의 문자열을 ISO Latin-1 형태로 변환해주는 함수입니다.
(알파벳과 숫자, *, @, -, _, +, /를 제외한 특수 문자만 인코딩 합니다.)
unescape()함수는 그와 반대로 ISO Latin-1 형태의 문자열을 ASCII 형태로 반환해줍니다.
(즉 unescape는 escape로 난독화된 코드를 복호화하는 함수라고 이해하시면 됩니다.)
위의 예제를 간단히 설명하자면, document.write 첫번째는 "Helloworld!@#$%^&*()"를 escape 함수를 사용하여 난독화 하는 것이고,
document.write 세번째는 "Helloworld!@#$%^&*()"를 escape 함수가 사용된 것을 다시 unescape 함수를 사용하여 복호화 하는 것입니다.
(3)eval 함수
eval()함수는 자바스크립트 코드를 계산하고 실행하는 함수입니다.
예를 들어 myNum에 많은 연산값을 넣어준 후, eval을 사용하면… 위와 같이 모든 계산을 끝낸 후의 결과 값을 보여줍니다.
즉!, 이것을 활용하여 난독화된 소스를 해석하는 용도로 악성 스크립트에서 필수적으로 사용되는 함수입니다.
또한 숫자형태의 문자열로도 표기가 가능하여 eval()함수의 매개변수에 숫자형태로 난독화된 표기를 사용 할 수 있습니다.
위의 예제는 argos 를 숫자형태의 문자열로 표기를 해본 것입니다.
\ddd : 세 개의 8진수(ddd)로 지정된 Latin-1 문자
\xdd : 두 개의 16진수(dd)로 지정된 Latin-1 문자
\udddd : 네 개의 16진수(dddd)로 지정된 유니코드 문자로 표현할 수 있습니다.
(4) replace 함수
Replace()는 자바스크립트에서 문자열을 치환할 때 주로 사용합니다.
다만, 처음에 오는 문자 단 하나만 바꿔준다는 단점이 있습니다.
위의 결과를 보면, 단 처음에 오는 문자 단 하나만 바꿔준다는 것을 확인 할 수 있습니다.
만일 모두 바꾸기를 원한다면, 저희는 정규식 표현을 사용해야 합니다.
위의 결과를 보면, 정규식 표현을 사용하였을 경우 모든 문자열이 바뀐다는 것을 확인 할 수 있습니다.
(5)Decimal 난독화
변수에 10진수 값을 나열하는 형태의 코드입니다.
단순히 아스키코드 표에서 직접 쫒아가며. 난독화를 해제하거나, Mazilla나 JSDEtox와 같은 툴로 바로 풀리는 난독화이기 때문에 어렵지는 않습니다.
(6)Hexdecimal 난독화
이름에서 알 수 있듯이, 이것은 변수에 16진수 값을 나열하는 형태의 코드입니다.
Decimal 난독화와의 차이는 변수에 16진수인지 10진수인지의 차이이기 때문에, 난독화 해제 역시 직접 아스키 코드의 16진수 값을 보거나, Malzilla나 jsdetox 등을 이용하시면 됩니다.
이렇게 끝이 라고 하고 싶지만,
Hexdecimal에 대해 더 알아두셔야 할 것이 있습니다.
여기서는 간단한 예제를 들기위해 0x를 앞에 붙여서 0x(숫자)형식으로 표현을 하였지만,
주로 나오는 난독화의 형식은 %(숫자)나 \x(숫자)입니다.
%형태의 16진수 난독화는 앞서 설명하였던 툴에서 바로 풀리지만, \x형태의 난독화는 바로 풀리지 않습니다.
하지만, \x => %로 치환 후 분석하면, 되기 때문에 별 문제는 없습니다.
(7) XOR 기법
XOR 연산은 암호화에 많이 쓰이는 기법입니다.
-XOR 암/복호화 방식
평문 ^ KEY = 암호문 // 암호문 ^ KEY = 평문
-XOR 연산의 성질
교환법칙: A ^ B = B ^ A // 결합법칙: (A^B)^C = A^(B^C)
항등원: A^0 = A // 역원: A^A = 0
위의 예제에서는
3번째 줄은 XOR 암호화를, 5번째 줄은 XOR 복호화를 간단하게 나마 표현한 것 입니다
(8) 8bit ASCII
ASCII 코드는 일반적으로 7bit로 모든 문자를 표현할 수 있습니다.
그러나 통신 특성 상 8bit씩 전송되는데 최상위 1bit는 무의미한 bit로 사용됩니다.
일반적으로 최상위 1bit는 0으로 설정되어 있는데, 이것을 1로 변환하여도 간단한 조작을 통하여 실제 HTML 파일을 처리하는 과정에서 영향을 받지 않도록 할 수 있습니다.
방법은 META 태그에서 charset 속성을 US-ASCII로 설정하면 됩니다.
US-ASCII로 설정하면 8bit의 ASCII코드에서 최상위 1bit는 인식하지 않으니, 시그니처 기반 탐지 장비는 hex값이 다르다고 생각하며 탐지를 하지 못할 것입니다.
(9) 생성자 []
원리는 결과값이 NaN, Undefined, Number, Boolean, Object 등의 문자열로 반환이 되는데, 이러한 문자열 등을 이용하여 alert 등의 문자를 조립하여 호출하는 방식입니다.
자바스크립트는 한가지 특징이 있는데, 변수가 숫자, 스트링 및 배열로 자유자재로 변환이 가능하다는 것입니다. 예를 들면 []스트링은 “”로 변환될 수 있고, 숫자 0으로도 변환 될 수 있습니다.
여기서 숫자로 바뀌기 위해서는 +나 –를 붙여야 합니다.
++[[]][+[]] => ++[“”][+[]] => +0[+[]] => 1[+[]] => 1[0]
위의 과정은 Test의 변환 과정을 나타낸 것이다.
처음 []배열이 “”이 되고, 그 다음 []배열이 +에 의하여 0 으로 변환되고, +를 통하여 1 를 만든다. [+[]]도 마찬가지로 [0]을 만들어 최종 1의 값이 완성되는 것이다.
이와 비슷하게 $난독화가 있는데, 2010년도에 발견된 난독화 기법으로 달러 난독화, jjencode등으로 불리고 있습니다.. 생성자 난독화와 비슷한 원리로 작동하니, 알아두시는 것이 좋습니다.
자바스크립트 난독화에 대해서 여러 가지 기법들에 대해 알아보았습니다.
다만, 여기서 소개하는 것들이 전부가 아닙니다. 더 난해하고 창의적인 난독화 기술들은 많이 존재 할 수 있습니다.
<Created by 서쿤>
'WEB > Web Hacking' 카테고리의 다른 글
CSRF (Cross-site request forgery) 란 (0) | 2017.04.28 |
---|---|
Drive-By-Download(DBD) 공격(이론편) (0) | 2017.04.24 |
파일업로드 취약점 (0) | 2017.04.09 |
SQL injection (0) | 2017.03.25 |
XSS(Cross Site Scripting) 공격이란? (0) | 2017.03.12 |