본문 바로가기
기타/DMZ

2012.03.20 JS 악성코드 분석 메모

by ITPro 2012. 3. 20.

현재 자바 스크립트 악성코드를 분석해보고 있는데 코드들을 상당히 난잡화 해둔 악성코드로 보였다.

무난하게 분석해 나가던 도중에 갑자기 도저히 이해할 수 없는 다음과 같은 코드를 만나고 상당히 많이 당황하였다.

 ohLgj5=DDrbLO0('a1Qe4dG*]6zY^k8b]#&,m8$[x_GD3]Nvj5dsn7[F[8ecu[S34Rlc]4r;iadpDt='[wOrjuux8](/[^xS@0ietrc9p]/g,''));

위의 코드 중에서 DDrbLO0은 eval 함수를 가리키고 있고 wOrjuux8는 'replace' 문자열을 저장하고 있다.

DDrbLO0 = eval;
wOrjuux8='replace';

처음에는 wOrjuux8의 존재를 눈치 채지 못하고 도저히 eval 함수를 통해 명령어로 해석될 수 없는 문자열 집합과 문자열 밖으로 까꿍하고 나온 녀석들에 패닉에 빠졌다.

그러던 중 wOrjuux8가 눈에 익어 코드 상단을 보니 'replace'문자열이 저장되어있었고 하나씩 의문점이 풀리기 시작했다.

일반적으로 replace 함수는 str.replace('this','that'); 같은 방식으로 쓰이고 있으나 위 코드에서는 특이하게 replace를 대괄호로 감싸고 있다.

.함수명 를 통한 함수 접근이 아닌 ['함수명']를 통해 접근하고 있는것으로 보였는데 테스트를 위하여 다음과 같은 코드를 작성해 보았다.

 alert('ABCDEF'['toLowerCase']());

결과는

성공적으로 toLowerCase 함수가 작동되어 소문자 abcdef가 작동되었다.

그 다음 replace 함수의 인자 값인 (/[^xS@0ietrc9p]/g,''));은 정규식을 사용했는데 xS@0ietrc9p을 제외한 모든 문자제거하라는 의미로 사용되었다.

위 정규식대로 replace 함수가 동작하고 문자열을 재조합하면

'a1Qe4dG*]6zY^k8b]#&,m8$[x_GD3]Nvj5dsn7[F[8ecu[S34Rlc]4r;iadpDt='

즉, execScript가 되어 최종적인 코드는

 ohLgj5=eval(execScript);

가 되고 이는 ohLgj5=execScript; 와 같은 결과를 갖기 때문에 ohLgj5를 이용해 execScript를 호출할 수 있게 된다.



P.S. 예전에는 스크립트를 이용한 악성코드는 단순하고 재미없는 것으로 생각했는데 이 코드들을 보고 생각이 많이 바뀌었다. (현재 위와 비슷한 코드들이 빼곡하게 쌓여있다.)
반응형

바로가기