'정보이야기/보안정보'에 해당되는 글 3건

  1. 무료 소스코드 난독화 서비스 코드잼(Codejam)
  2. 샌드박스(Sandbox) 개념 5
  3. 리버스 엔지니어링 툴 정리 1


 
Introduction

CodeJam은 한국 저작권위원회에서 프로그램 저작권 관리와 코드 난독화 등을 제공하는 사이트이다.

사이트주소: http://www.codejam.or.kr/


프로그램 저작권 관리는 저작자를 식별할 수 있는 워터마크(watermark)정보를 자동으로 생성하여 이를 프로그램 소스코드에 삽입하고 향후 삽입된 저작자 정보를 자동으로 추출하여 검증해 주는 서비스이다. 본 서비스의 목적은 소프트웨어 소스코드의 유출 및 도용 시에도 삽입된 저작자 식별 정보를 검증하여 저작권 침해 사실을 용이하게 입증함으로써 저작권자 권리 구제의 실효성을 확보하여 소프트웨어 지적재산권 관련 분쟁의 위험을 최소화 하는 것이다.



프로그램 코드 난독화는 특정 난독화 알고리즘(Layout, Data, Control Obfuscation)을 적용하여 소스코드를 분석하기 어렵게 변환해주는 시스템이다. 본 시스템의 목적은 상세설계에 준하는 설계구조와 주석문, 프로그램 처리방식, 기능 배치, 구성 등의 설계아이디어 또는 해당하는 알고리즘이나 성능 및 최적화를 위한 구현 노하우 등이 내포되어 있는 SW 소스코드의 원천기술 유출을 방지하는 것이다.



Method

CodeJam의 저작권 워터마크, 난독화등의 코드 변환은 모두 사이트에서 이루어진다.


먼저 로그인을 하고,



서비스 이용으로 들어가 코드 변환을 한다.



ActiveX가 아닌 Java로 구현되어 있다.



자바 설치가 완료되면 다음과 같은 화면이 나타난다. 

변환하기 위한 소스 폴더 선택과 보호강도를 지정하고, 난독화 실행을 클릭하면 난독화가 수행된다.



난독화 결과 화면



Conclude

코드 난독화 결과물이 보호강도를 가장 높게 하더라도 전문적인 난독화 서비스보다는 높지 않다.

하지만 저작권 관리, 난독화등 코드변환을 사이트에서 쉽게 무료로 변환 가능하므로 유용하게 사용할 수 있을것으로 보인다.


난독화된 c코드

#include <stdio.h>

#define MABANG_SIZE 5 

int MABANG[MABANG_SIZE][MABANG_SIZE]; void init_MABANG(); void move_MABANG(int &row, int &col, int count); void process_MABANG(); void print_MABANG(); void main() { init_MABANG(); process_MABANG(); print_MABANG(); } void init_MABANG() { for(int Rc2hTbzn2xMmQYcV=0; Rc2hTbzn2xMmQYcV<MABANG_SIZE; Rc2hTbzn2xMmQYcV++) { if(0<MABANG_SIZE){ MABANG[Rc2hTbzn2xMmQYcV][0] = 0; }if(1<MABANG_SIZE){ MABANG[Rc2hTbzn2xMmQYcV][1] = 0; }for(int fNbUnAITfcUEkNDz=2; fNbUnAITfcUEkNDz<MABANG_SIZE; fNbUnAITfcUEkNDz++) { MABANG[Rc2hTbzn2xMmQYcV][fNbUnAITfcUEkNDz] = 0; } } } void move_MABANG(int &row, int &col, int count) { MABANG[row][col] = count; row -= 1; col += 1; if(row < 0 && col > MABANG_SIZE-1) { row += 2; col -= 1; } else if(row < 0) { row = MABANG_SIZE-1; } else if(col > MABANG_SIZE-1) { col = 0; } else if(MABANG[row][col] != 0) { row += 2; col -= 1; } else { } } void process_MABANG() { int CBbtF1gJvMzPdA7c = 0; int R7R5hHlcgu6tTD6p = MABANG_SIZE/2; for(int Vz1JrpWh_SwYjvMZ=1; Vz1JrpWh_SwYjvMZ<=MABANG_SIZE*MABANG_SIZE; Vz1JrpWh_SwYjvMZ++) { move_MABANG(CBbtF1gJvMzPdA7c, R7R5hHlcgu6tTD6p, Vz1JrpWh_SwYjvMZ); } } void print_MABANG() { for(int lHXsEid3LaTqU3oN=0; lHXsEid3LaTqU3oN<MABANG_SIZE; lHXsEid3LaTqU3oN++) { if(0<MABANG_SIZE){ printf("%4d", MABANG[lHXsEid3LaTqU3oN][0]); }if(1<MABANG_SIZE){ printf("%4d", MABANG[lHXsEid3LaTqU3oN][1]); }for(int dSdb3Zlsgje_bG59=2; dSdb3Zlsgje_bG59<MABANG_SIZE; dSdb3Zlsgje_bG59++) { printf("%4d", MABANG[lHXsEid3LaTqU3oN][dSdb3Zlsgje_bG59]); } printf("\n"); } 

}


'정보이야기 > 보안정보' 카테고리의 다른 글

샌드박스(Sandbox) 개념  (5) 2012.05.29
리버스 엔지니어링 툴 정리  (1) 2012.05.24


보안과 관련하여 스터디를 하던중 샌드박스라는 말을 처음 접하게 되었습니다.

샌드박스에 데이터를 저장한데는데 좀처럼 와닿지 않더군요. 

그래서 정리해본 샌드박스(Sandbox) 입니다.


샌드박스는 미국의 가정집 뒤뜰에서 어린이가 다치는 것을 방지하기 위해 만든 모래통(Sandbox)에서 유래하였습니다.


실제 샌드박스는 이렇게 생겼습니다.

나무 틀을 박스처럼 만들어 모래를 집어 넣고 아이들이 그 안에서 안전하게 놀수 있게끔 만들어준 것이죠.

마치 작은 놀이터 같습니다. 한국에서는 놀이터가 따로 존재하기에 샌드박스를 좀처럼 보기 힘듭니다.

그래서 처음보고 이런게 있었다니!! 매우 기발하다라고 생각했습니다.


이제 본론으로 넘어와서 이러한 샌드박스가 어떻게 프로그래밍 기술에 도입이 되었을까요 ?

또한 이것이 보안과 어떠한 연관이 있을까요 ?


이 질문에 대한 답은 Sandboxie(http://www.sandboxie.com/)에서 찾을 수 있었습니다.

먼저 Sandboxie 사이트에서 나타나는 이미지를 보겠습니다.


이 이미지는 샌드박스의 개념을 잘 설명해 주고 있습니다.

빨간색 화살표가 움직이면서 하드디스크안에 리소스들을 채우게(저장) 됩니다.

이를테면 인터넷 익스플로러의 경우 웹페이지 접속에 의해 해당 페이지를 받아오는 과정이라 할 수 있습니다.


일반적으로 리소스를 채우게 되는 과정에서 하드디스크에 직접적인 접근이 가능해 

Hard disk (no sandbox) 그림과 같이 될수있는데 여기서 바로 보안 이슈가 발생합니다. 

악의적으로 OS 일부분을 홰손시킬 수도 있고, 다른 어플리케이션의 정보를 홰손시킬수 있는 문제가 발생합니다.


따라서, 이러한 문제를 해결하는 방안으로 샌드박스가 등장합니다.

Hard disk (with sandbox) 그림과 같이 하드디스크에 특정 영역을 샌드박스로 지정하고 

이 영역에 대해서만 리소스를 사용하고 접근하도록 합니다. 

즉, 샌드박스는 OS와 같은 중요한 영역에는 영향을 주지 않도록 각자의 박스(영역)에서만 리소스를 사용하도록 한 것입니다.


또한 반대의 개념으로도 사용가능해, 샌드박스 안에 있는 리소스에 외부 접근을 거부하여 보호할 수도 있습니다.

마치 아이들을 주변의 위험으로부터 보호하듯이 말이죠.



리버스 엔지니어링(Reverse Engineering)은 완성된 제품을 분석하여 제품의 기본적인 설계 개념과 적용 기술을 파악하고 재현하는 것입니다. 설계 개념→개발 작업→제품화의 통상적인 추진 과정을 거꾸로 수행하는 학문입니다. 보통 소프트웨어 제품은 판매 시 소스는 제공하지 않으나 각종 도구를 활용하여 컴파일된 실행 파일과 동작 상태를 정밀 분석하면 그 프로그램의 내부 동작과 설계 개념을 어느 정도 추적할 수 있습니다.

이러한 정보를 이용하면 크랙, 즉 실행 파일을 수정하거나 프로그램의 동작을 변경할 수 있고, 또 유사한 동작의 복제 프로그램이나 보다 기능이 향상된 프로그램도 개발할 수 있습니다. 소프트웨어에 대한 역공학 자체는 위법 행위가 아니지만, 대부분의 제품이 이의 금지를 명문화하고 있어 이러한 수법으로 개발한 제품은 지적 재산권을 침해할 위험성이 있습니다. (네이버 지식사전)

개인적으로 조사한 PC환경에서 리버스 엔지니어링을 돕는 툴은 다음과 같습니다.

No Attack Tools Attack Type Description Reference
1 ShowString Binary Analysis 프로그램 내부 스트링 보여줌 http://jok3.tistory.com/
2 Resource Hacker Plus Binary Analysis 소프트웨어 리소스 편집 http://jkblog.tistory.com/
3 ResHacker Binary Analysis 소프트웨어 리소스 편집 http://honollulu.tistory.com/18
4 softICE Debugger    
5 TRW2000 Debugger    
6 Ollydbg Debugger, Disassembler 가장 범용으로 사용되는 툴   
7 IDA Pro Debugger, Disassembler    
8 VBDE Decompiler 비주얼베이직으로 만들어진 프로그램 분석 http://jkblog.tistory.com/
9 sothink SWF Decompiler Decompiler 플래시 디컴파일러  
10 Reflector Decompiler 닷넷 프로그램 디컴파일러  
11 DeDe Decompiler 델파이 디컴파일러  
12 JAD Decompiler 자바 디컴파일러  
13 W32dsm9b Disassembler   http://jkblog.tistory.com/
14 UltraEdit Hex Editor    
15 WinHex Hex Editor    
16 Filemon Monitoring    
17 Regmon Monitoring    
18 TcpView Monitoring    
19 Procexp Monitoring    
20 Process Hacker Monitoring   http://processhacker.sourceforge.net/
21 티서치 Patching 메모리 패치  
22 치트엔진 Patching 메모리 패치  
23 GMER Rootkit Detection    
24 IceSword Rootkit Detection    
25 Exeinfo PE Unpacker   http://jok3.tistory.com/
26 ImportREC Unpacker   http://jkblog.tistory.com/
27 Themida Unpacker Unpacker   http://jkblog.tistory.com/
28 UPX Unpacker    
29 Universal Extractor Unpacker    
30 VMUnpacker Unpacker    
31 PEiD Unpacker, Binary Analysis   http://jok3.tistory.com/


Attack Type에 대한 설명입니다.

No Attack Type Description
1 Binary Analysis 프로그램 바이너리를 분석한다.
2 Debugger 디버거(debugger)는 디버그를 돕는 도구이다. 디버거는 주로 원하는 코드에 중단점을 지정하여 프로그램 실행을 정지하고, 메모리에 저장된 값을 살펴보며, 실행을 재개하거나, 코드를 단계적으로 실행하는 등의 동작을 한다. 고급 디버거들은 메모리 충돌 감지, 메모리 누수 감지, 다중 스레드 관리 등의 기능도 지원한다.
3 Disassembler 어셈블리어를 기계어로 번역하는 것이 "어셈블러"(assembler)이며, 거꾸로 기계어를 어셈블리어로 바꾸는 것은 "디스어셈블러"(disassembler)이다.
4 Decompiler 실행코드에서 소스코드를 역으로 추출한다.
5 Hex Editor 헥사에디터는 기존의 일반 컴퓨터의 워드프로세서 및 편집기 소프트웨어에서 읽을 수 없는 이진 파일을 읽을 수 있는 프로그램을 통틀어서 말한다.
6 Monitoring 프로그램 상태를 감시한다.
7 Patching 프로그램 메모리 영역에 데이터를 덫붙(Patching)인다.
8 Rootkit Detection 해커들이 시스템을 해킹할 때 시스템 이용자가 해킹당하고 있음을 알지 못하도록 하기 위해 사용하는 도구(프로그램 등)를 말한다. 루트킷을 설치하는 목적은 해커들이 나중에 시스템에 접근할 때 들키지 않으려는 것이다. 즉, 해커들은 이 도구를 사용해서 컴퓨터의 제어권을 가로채고 자신들이 하는 일을 감출 수 있다.
9 Unpacker 일반적인 SW들은 리버스 엔지니어링을 막기 위해서 암호화를 하거나 압축을 하여 소스코드를 볼수 없도록 하고 있습니다. 이러한 과정을 패킹이라고 한다. 소스코드를 보기 위해서는 이렇게 패킹된 코드를 풀어야 하는데 이러한 과정을 언패킹이라고 한다.