글 작성자: 모두의 근삼이


WEB Level 5

level5 에서는 자바 스크립트 난독화 기법에 대해서 설명합니다. 

클라이언트 사이드에서 실행되고 해석되는 언어인 자바 스크립트는 보안적으로 취약할 수 밖에 없기 때문에 
나쁜 의도를 가진 사용자들이 노출되어 있는 스크립트를 해석하여 적절하지 않은 행동을 하는데 이용하기도 하고, 자신이 공들여 만든 소스코드를 어떤 이가 쉽게 도용하여 마치 자신이 만든 것인 양 사용할 수 있는 등의 여러 가지 문제점이 존재하는, 편리하지만 동시에 굉장히 취약한 형태의 구조를 가진 언어입니다.

이런 고민을 해결하기 위하여 생겨난 개념이 “자바스크립트 난독화” 입니다. 개발자들은 원하지 않는 정보를 클라이언트 상에서 숨기려, 스크립트를 보아도 해석하기 어렵도록 이 기술을 적용하여 해석상에는 문제가 없지만, 클라이언트가 그 소스 자체를 읽을 때에는, 이해하기 어렵도록 작성하는 기법을 활용하기 시작했습니다.

 

- Dadong을 이용한 코드 난독화     


처음에는 위의 같은 어플리케이션에서 사용된 아이디어나 알고리즘 등을 숨기는 것이 목적이었으나, 그렇다 하더라도 클라이언트는 소스 분석을 통해 쉽게 정보를 알아낼 수 있었으며, 오히려 근래에는 다른 난독화 코드들이 그렇듯, 해커들 사이에서 자바스크립트 공격코드와 보안제품 진단 회피를 위한 우회 용도로도 많이 사용되고 있습니다.

코드 난독화 방법은 굉장히 종류도 다양하고, 그 형태도 제각각입니다. 하지만, 결론적으로 모든 형태의 난독화 된 코드들은 별도의 장치 없이 브라우저에서 해석이 가능해야 합니다. 코드 난독화에 관한 더 자세한 내용은 다음 문서를 참고하면 좋을 것 같습니다.

자바스크립트 난독화 기법 및 분석 방법론.pdf



Level5 의 소스코드를 보면, <!--Hint : 12342046413275659--> 라는 힌트와 함께,

위와 같이 굉장히 해석하기 힘든 형태로 난독화 되어 있는 스크립트가 있었습니다.

가장 간단한 해독 방법으로, Burp Suite를 이용하여 페이지를 불러올 때, 맨 앞에 오는 eval() 함수 대신에, document.write() 함수를 통해 보거나, javascript:alert(“”) 등의 형태로 감싸주어서, 브라우저가 해석한 코드를 알림창으로 띄워서 보는 방법을 이용하여 해석된 코드를 보았습니다.


해석된 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var digitArray = new Array('0''1''2''3''4''5''6''7''8''9''a''b''c''d''e''f');
function PASS(n) {
 var result = '';
 var start = true;
 for (var i = 32; i > 0;) {
  i -= 4;
  var digit = (n >> i) & 0xf;
  if (!start || digit != 0) {
   start = false;
   result += digitArray[digit]
  }
 }
 return (result == '' ? '0' : result)
}
cs


해석한 스크립트의 내용을 살펴보니 자체적으로 특별한 동작을 하는 코드가 아니라,
PASS()라는 함수를 선언하는 스크립트였습니다.

함수의 자세한 동작은 해석해 보지 않았지만, digitArray배열을 이용하여 입력값(n)에 대하여 암호화를 수행한 뒤, 암호화 된 값을 반환하는 동작을 하는 듯 보였습니다.

 

해당 함수의 입력값으로, 주어진 힌트인 '12342046413275659'을 줘 보기로 하였습니다.

마침 입력폼에 기본값을 지정하는 부분이 소스에서 이미 구성이 되어 있어서 프록시 툴을 이용해 페이지 소스의 하단에 있는 document.frm.password.value = ""; document.frm.password.focus() 부분의 값을 수정하여,
document.frm.password.value = ""
대신
document.frm.password.value = PASS(12342046413275659)를 삽입하여 페이지를 요청하여 보았습니다.

 

PASS() 함수의 결과 값을 출력해 볼 수 있었습니다. 이렇게 해서 나온 값을 그대로 Ckeck를 눌러서 페이지를 요청하면, Level5를 클리어 하고, Level5를 풀었음을 증명하는 AUTH KEY를 받을 수 있습니다.

반응형