'2012/12'에 해당되는 글 1건

  1. 2012.12.27 Code obfuscation and JNI

2012.12.27 20:25 System

[+] Introduction 


 

사람이 가장 잉여스러워지는 시간인 방학이 찾아왔습니다.


정신차리고 보니 크리스마스가 지났네요 

 

<Fig. 24일에 올렸어야 할 짤방>

 


왠지 1년 전에도 이와 비슷한 일이 있었던 것 같지만 그냥 넘어가요 우리..


아무튼 새해가 찾아오기 전에 글이라도 하나 올려야 제 자신에게 변명거리라도 될 거 같아요.

 

 




[+] What is "Code obfuscation"? 


 

코드 난독화는 Program들이 나날이 자신들을 역공학 해주는 리버서들의 열정에 몸둘바를 몰라 만들어낸 일종의


자기 방어술입니다.


리버서들의 목적이 대부분 악용에 있다 보니 , Program 업체들은 자신들의 자산이 까발려지지 않기 위해 혹은 악용되지 않기 위해


Anti-debugging 부터 해서 실행 압축 [ Packer ] , 여기서 더 나아간 Protector 까지 적용합니다.


물론 , 이 기술들이 악성 코드에 적용되고 있는 건 다시 말할 것도 없겠죠.


이 중에서 코드 난독화는 Protector에 흔히 적용되는 기술인데 말그대로 코드를 읽기 어렵게 하는 겁니다.


암호화 하고 코드를 치환하고 API 호출을 빙빙 돌려서 정적 분석 뿐만 아니라 동적 분석 까지 막는 것이 그들의 임무입니다.


리버서들이 해석하기 어렵게 코드를 짜야 합니다. 이를 해석해주는 Disassembler가 해석하기 어렵게 코드를 짜야 합니다.

 

이를 위해서 실제 소스 코드 상에서 말도 안되는 Dummy code를 집어넣어 흐름을 헷갈리게 만드는 경우도 있습니다만,

 

그보다는 Assembly 단에서 명령어를 꼬아서 혼란시키는 방법을 많이 사용하고 있습니다.

 

오늘 말하려고 하던 주제가 여기서 더 깊숙히 들어가면 멀어지는 관계로 간단히 정리만 하고 넘어가죠.

 

Disassembly 기법은 크게 2가지 정도 나눌 수 있습니다.

 

- Linear sweep

 

- Recursive traversal

 

이 2가지 방법의 알고리즘을 이해하고 나서,

 

그 알고리즘으로서는 해석하면 실제 실행한 것과 다른 결과를 내는 임의의 코드를 삽입하는 거죠.

 

실행과는 전혀 상관 없는 Dummy assembly 를 잔뜩 집어 넣는 방식도 해석하는 입장에서는 정말 짜증날 수 밖에 없습니다.

 

 

<Fig. 코드 난독화가 되어 있는 것을 확인했을 때>

 

 

 

[+] what`s the applicability of code obfuscation?


 

코드 난독화의 대상이 될만한 것이 무엇이 있을까요?


Disassembly 혹은 Decompile이 매우 쉽게 이루어지며 그 결과물이 실제와 가장 근접한 것이 이 난독화의 힘을 가장 많이 볼 수 있지 않나 싶은데요.

 

떠오르신 바로 그겁니다.

 

Java

 

아니라구요? ㅈㅅ...

 

Java는 그 특성상 구동방식이 일반 Application 과 다르기 때문에 코드 난독화를 적용하는데 어려움이 있는 건 사실입니다.

 

하지만 Java에서도 C, C++ 를 사용할 수 있는 방법이 있으니 [ 즉 우리가 알고 있는 Disassembly 를 적용할 수 있는 언어 ]

 

그것이 바로 JNI [ Java Native Interface ] 입니다.

 

* 이 방법외에도 이미 Java 에서는 안드로이드 시장이 활성화됨에 따라 Dex guard, Pro guard 등 코드 분석을 어렵게 하는 방식들이 존재합니다.

 

 

 

 

[+] Considering about JNI 


 

JNI 는 Java에서 Loadlibrary 를 통해 C, C++ 혹은 assembly 로  이루어진 library 를 호출 할 수 있도록 하는 Framework 입니다.

 

원래 목적은 말그대로 C, C++ 등으로 이루어진 library 를 추가 구현 없이 java에서 사용하기 위함입니다.

 

혹은 복잡한 수학연산 등은 JVM 보다 native code가 빠르므로 JNI 를 이 분야에서 사용하기도 하죠.

 

아무튼 이 JNI 를 통해서 기존에 사용했던 코드 난독화 기법등을 사용할 수 있게 됩니다.

 

Library 자체를 packing 하여 실행 압축을 사용할 뿐만 아니라 dummy code등을 사용할 수 있죠.

 

추가적으로 api redirection 이나 함수 포인터를 이용하여 분기 하는 모듈을 리버서에게 노출 시키지도 않을 수 있습니다.

 

가변 인자를 사용하면 모든 함수들의 호출을 일반화 할 수 있고, 함수를 구분하는 식별 인자 또한 고정방식이 아니라

 

유동적으로 변하되 항상 같은 값을 유도할 수 있게 만들 수 있죠.

 

이렇듯 코드 난독화 기법은 고정적인 방법이 아니라 얼마든지 다양한 방법으로 접근 할 수 있습니다.

 

 

 

 

 

 

쓰고보니 별로 기술적인 내용이 들어갈 게 없네요..

 

기존 난독화 기술을 설명하자니 좀 식상할 것 같고 .. 좀 더 신박한 난독화 기술이 있다면 들고 오도록 하겠습니다.

 

 

Posted by LinkC
이전버튼 1 이전버튼

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday301
Today84
Total298,301

달력

 « |  » 2012.12
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

최근에 받은 트랙백

글 보관함


. .