2013년 2월 10일 일요일

arguments.callee.replace 함수 사용한 트릭

Kein Exploit Pack에 대해서 소개할려고 합니다.
(관련 자료: http://www.kahusecurity.com/2012/analyzing-a-new-exploit-pack/ )

기존 난독화 스크립트에서 사용되는 기법들을 사용하지만, 난독화를 푸는데 방해되는 기술도 사용되고 있어서 소개할려고 합니다(GongDa Pack 역시 그러한 방법을 사용한다.).


[그림 1] Kein Exploit Pack

해당 익스플로잇 팩의 특징을 정리하면 다음과 같습니다:

(1) 사용되지 않는 변수를 할당합니다.
var hBlVmc = 'LKfWVO';
var YzsqfO = 'pahaS';

(2) 항상 조건이 거짓이라서 결코 실행되지 않는 함수를 정의합니다.
function rFQggZ() {
   var FOSybf = 'UKSSIA';
   NCYz = 'KpDjS';
   if (NCYz == 'WgPO') UAwz(); // UAwz 함수는 결코 실행되지 않습니다.
}

(3) 코드 변경을 막기 위한 트릭을 사용했습니다.
arguments.callee.replace() 함수를 사용함으로 난독화 푼 코드를 출력하기 위해 document.write 혹은 alert 함수를 추가하여 사용할 수 없게 했습니다.

다시 말하면, 해당 익스플로잇 팩처럼 난독화 해제하는 함수가 자기 자신(난독화 해제 함수 코드)을 입력으로 사용하여 난독화를 푸는 경우에 이러한 함수을 사용하면, 변수와 함수명을 변경할 경우 난독화 해제된 코드도 변경되어 제대로 된 결과물을 볼 수 없습니다. 참고로 GongDa Pack 의 경우는 해당 함수를 사용하지 않지만, 난독화 해제 함수를 XOR 연산 키로 사용하여 난독화를 풀기 때문에, 난독화 해제 함수를 수정하여 비난독화를 할 수 없게 했습니다.

이러한 트릭은 오래전부터 사용된 방법으로서 난독화 해제를  막기 위한 한가지 방법입니다.

(3)번째 특징을 이용하여 해당 샘플은 다음과 같은 코드를 사용하였습니다.

[그림 2] 코드 변경을 막기 위한 트릭

위의 코드는 자신을 호출한 함수 - 난독화 해제하는 함수 - 의 코드를 가져와서 공백 및 특수 문자를 제거한 뒤 wJSXWKz 변수에 할당합니다.

따라서 비난독화 함수의 코드가 실제로 변경되면 wJSXWKz 변수의 값 역시 변경됨으로 비난독화를 제대로 할 수 없게 됩니다.

실제로 난독화가 해제된 코드를 출력하기 위해 document.write 함수를 추가하여 출력했을 때 다음과 같이 비난독화가 제대로 안된 코드가 보여집니다.

[그림 3] 코드 변경을 막기 위한 트릭으로 인해 비난독화가 제대로 안된 코드

그러면 어떻게 Kein Exploit Pack의 난독화된 스크립트를 풀 수 있을까?

다음과 같이 코드를 변경 및 추가하면 wJSXWKz 변수에 할당된 값의 변동없이 난독화를 풀 수 있습니다.

(변경전)

(변경 및 추가후)
[그림 4] 난독화 해제를 위해 변경 및 추가된 코드

위와 같은 방법으로 난독화를 해제하면 다음과 같이 난독화 해제된 코드를 볼 수 있습니다.


[그림 5] 난독화가 해제된 코드

댓글 없음:

댓글 쓰기