브레인 블리딩(Brain Bleeding)


브레인 블리딩은 KoreLogic에서 소개하는 자바스크립트 난독화 기법입니다. Korelogic의 블로그에서는 자바스크립트를 이용한 공격을 관리자에게 숨기기 위한 용도로 사용될 수 있으며, 이를 위한 방법을 제안한다고 작성되었습니다.

사실 이 기법은 원래 UTF-8이라는 웹 사이트에서 제공되는 기법을 가져와 사용한 것입니다.


브레인 블리딩의 예시는 다음과 같습니다.



 

 JJencode


여기서 사용되는 기법은 UTF-8.jp에서 제안한 JJencoding 기법을 이용하였습니다.

JJencode란 [특정한 문자]와 [$ 문자], [: 문자], [. 문자] 등을 이용하여 문자를 난독화하는 기법입니다.

기존에 문자들을 보다 복잡한 문자로 변경해주는데에 있습니다.


JJencode 예제는 다음과 같습니다.


위의 그림에서 보이는바와 같이 입력할 수 있는 UTF-8 형식의 문자를 이용하여 난독화를 수행하는 것을 볼 수 있습니다.

JJencode 웹 페이지는 다음 링크를 들어가시면 됩니다.


UTF-8.jp의 JJencode 링크


여기서 여러분이 인코딩하고자 하는 global variable name을 입력해주면 그 문자를 이용하여 난독화가 이루어지는 것을 볼 수 있습니다.




 

 브레인퍽(BrainFuck)


요약하면 [난해한 프로그래밍 언어]라고 할 수 있습니다. 이는 1993년 우어반 뮐러(Urban Muller)가 아미넷에 올려 알려진 것이 시초라고 하며, 난해한 프로그래밍 언어 중에서 매우 오래된 녀석이라고 합니다. 브레인퍽이 정말 프로그래밍 언어라고 할 수 있는 이유는 [조건문], [루프문], [배열] 등의 기능이 정말로 존재하며, 이러한 규칙을 이용하여 정말 프로그래밍할 수 있기 때문입니다.


해당 포스트에서는 자세한 언어적 요소를 다루지는 않습니다. 다만, 간략하게 소개만 하도록 하겠습니다.


 

 브레인퍽 구조

브레인퍽은 다음과 같은 일곱 가지 명령(여덟 개의 문자)들로 이루어져 있습니다.


문자

설명

+

테이프가 가리키는 숫자를 1 증가시킵니다.

-

테이프가 가리키는 숫자를 1 감소시킵니다.

>

테이프를 한 칸 오른쪽으로 옮깁니다.

<

테이프를 한 칸 왼쪽으로 옮깁니다.

.

테이프가 가리키는 숫자를 ASCII 문자로 해석해서 출력합니다.

,

문자를 하나 읽어서 ASCII 값을 테이프가 가리키는 위치에 저장합니다. 만약 파일의 끝위치(EOF - End Of File)에서 동작하는 원리는 구현체마다 차이가납니다.

[...]

루프문입니다. 매번 현재 테이브가 가리키는 숫자(매 루프마다 바뀔 수 있습니다.)가 0인지 아닌지 체크하여 조건이 만족되면 계속 안에 들어 있는 코드를 실행합니다.


위의 구조가 상당히 복잡한 것을 알 수 있습니다.

마치 어셈블리어보다 덜 고급지면서 은근 있을 건 다 있는 녀석입니다. 허허...


브레인퍽은 사실 프로그래밍일 깡으로 하기에는 부적절한 언어입니다. 때문에 기존의 코드를 난독화를 위해 사용되기도 합니다.





 

 브레인퍽 난독화 사이트


브레인퍽의 코드를 직접 작성하는 것은 머리가 기계가 아닌 이상 굉장히 어려운 일입니다. 따라서 직접 코딩하지 않고, 복잡한 구조를 이용한 난독화 기법 적용이 있습니다. 이러한 난독화 기법을 제공해주는 사이트가 있어서 소개해보려고 합니다.


DCode - Brainfuck 링크


해당 사이트에서는 두 가지 방법의 서비스를 제공합니다.

하나는 기존의 소스코드를 브레인퍽 코드로 변환해주는 인코딩(Encoding)이 있고, 브레인퍽 소스코드를 원래의 소스로 변환해주는 기능을 가지고 있습니다.


 

 브레인퍽 인코딩

기존의 코드를 브레인퍽 코드로 변경하는 예제를 살펴보도록 하겠습니다.

위와 같은 순서로 원하는 소스코드를 입력하게 되면, 브레인퍽 소스코드로 변환됩니다.




 

 브레인퍽 디코딩

브레인퍽 코드로 변경했다면 다시 원래의 코드로 바꾸는 기능이 필요하지요. 다음과 같은 순서로 난독화한 소스코드를 입력해준다면, 다시 원래의 소스코드를 보여주는 서비스도 함께 제공합니다!




 

 자바스크립트 난독화(Javascript Obfuscation)란?


자바스크립트는 클라이언트(Client)에서 실행되도록 하는 언어입니다. 따라서 사용자(Client)가 웹사이트에 접근하게 되면 해당 스크립트를 그대로 볼 수 있게 됩니다. 이를 방지하고자 적용하는 기법이 바로 난독화입니다. 난독화는 자바스크립트 이외에도 다양한 언어에서 사용할 수 있습니다. 그러나 이 포스트에서는 자바스크립트의 난독화와 난독화 기법과 방법에 대해 알아보려고 합니다.


자바스크립트의 난독화 예시는 다음과 같이 있습니다.


자바스크립트 예제 소스

var ajax=function(a,b,d,c,e,f){
 e=new FormData();
 for(f in d){e.append(f,d[f]);};
 c=new XMLHttpRequest();
 c.open('POST',a);
 c.setRequestHeader("Troll1","lol");
 c.onload=b;
 c.send(e);
};
window.onload=function(){
 ajax('Troll.php',function(){
  (new Function(atob(this.response)))()
 },{'Troll2':'lol'});
}


자바스크립트 예제 소스 난독화(Base64)

(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()


자바스크립트 예제 소스 난독화(Base64 + PHP)

<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
 echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
 echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>


위의 예제 소스는 단순히 javascript를 base64로 난독화했을 뿐입니다.

때문에 사실은 난독화라고 하기에는 기법의 깊이가 매우 낮은 수준입니다.


이러한 간단한 기법 이외에도 다양하고 독특한 난독화 기능들이 있습니다.

아래에서 그 기법들을 알아보도록 합시다.



 

 웹 사이트의 자바스크립트 난독화 서비스


자바스크립트를 난독화해주는 웹 사이트들을 소개하려고 합니다. 설명이 많이 필요없고 다음 사이트의 예제와 링크를 살펴보시겠습니다.


Javascript Compressor(Dean.edwards) 링크

이 사이트는 개인이 제공하는 서비스인 것 같습니다.

아무런 옵션을 주지 않았을 때의 결과는 다음과 같이 패킹을 해줍니다.




만약 Base62 encode를 적용해주고 packing을 하게 되면 다음과 같이 보다 정교한 난독화가 됩니다.




Obfuscator.io 링크

이 사이트는 해외 사이트이며, hex코처럼 변수를 만들어 보다 복잡한 구조로 난독화를 수행해주는 사이트입니다.

예시는 다음과 같습니다.





JavascriptObfuscator.com 링크

이 사이트도 위의 obfuscator.io와 비슷한 사이트입니다.

예시는 다음과 같습니다.





 

 괴짜스러운 난독화


난독화를 제공하는 사이트는 위의 사이트 이외에도 굉장히 다양하게 존재합니다.

물론 다음과 같이 이모티콘처럼 만든다던가, 변수 이름을 헷갈리게 만들어 알아먹기 힘들게 한다든가 하는 난독화 기법도 존재합니다.


일본 이모티콘 자바스크립트 난독화 사이트 링크


링크의 이름대로 일본에서 쓰이는 이모티콘을 이용하여 코드를 난독화해주는 사이트입니다.

예시는 다음과 같습니다.

해당 사이트는 일본 이모티콘 난독화, Japanese obfuscation, obfuscation emoticon 등으로 검색해서 사이트를 찾을 수 있습니다.




브레인 블리딩 자바스크립트 난독화 사이트 링크


이 사이트는 사실 웹 자체에서는 서비스를 제공하고 있지 않습니다.

그러나 이 기법이 매우 독특하여 참고할 수 있을 것 같아 공유해보려 합니다.

해당 사이트에서는 소스코드를 $와 _를 이용하여 난독화를 수행하도록 합니다.


프로그램을 다운로드 받아서 코드를 난독화된 코드로 바꿔보도록 합시다.



UTF-8.jp의 JJencode 링크


여기서 여러분이 인코딩하고자 하는 global variable name을 입력해주면 그 문자를 이용하여 난독화가 이루어지는 것을 볼 수 있습니다.





+ Recent posts