04.07.2014 Views

시간 기반 키 생성 방식을 이용한 안티 디버깅 기법 - SERSC

시간 기반 키 생성 방식을 이용한 안티 디버깅 기법 - SERSC

시간 기반 키 생성 방식을 이용한 안티 디버깅 기법 - SERSC

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

보안공학연구논문지 (Journal of Security Engineering), 제 10권 제 3호 2013년 6월<br />

시간 기반 키 생성 방식을 이용한 안티 디버깅 기법<br />

이광재 1) , 김성훈 2) , 이동훈 3)<br />

Anti-debugging scheme with time-based key generation<br />

Kwangjae Lee 1) , Sunghoon Kim 2) , Dong Hoon Lee 3)<br />

요 약<br />

디버깅(debugging) 도구는 소프트웨어 개발 과정에서 논리 오류나 버그가 발생되었을 때 프로그램<br />

의 내부 상태와 동작 방식을 사용자에게 보여줌으로써 오류를 찾고 수정하는데 도움을 주는 도구이<br />

다. 반면에 지적재산권이 포함된 프로그램의 내부 알고리즘 추출이나 권한 상승과 같은 시스템 공격<br />

을 위한 취약성 분석에 디버깅 도구가 악용되고 있어 문제가 되고 있다. 이에 대한 대응 기술로 디버<br />

깅을 방지할 수 있는 안티 디버깅(anti-debugging) 기술이 적용되고 있으나 이를 우회하는 기술도 지<br />

속적으로 발전하고 있다.<br />

본 논문에서는 기존의 우회 기법을 방지할 수 있는 시간 기반 키 생성 방식을 이용한 안티 디버깅<br />

기법을 제안한다. 제안하는 기법은 기존 디버깅을 탐지 후 조건문 방식으로 응답 하는 방식이 아닌<br />

프로그램 실행 시간의 차분 값과 특정 코드 영역의 해시 값으로 키를 생성하고 이를 키 값으로 다음<br />

실행될 코드 영역을 암호화함으로써 우회 공격을 어렵게 하는 방법이다. 또한 단순히 프로그램의 특<br />

정 영역의 실행 시간으로 키 값을 유도하는 방식이 아닌 시프트(shift) 연산으로 실행 시간의 범위를<br />

설정할 수 있게 하는 방식을 소개한다. 이는 시스템 하드웨어에 따라 발생할 수 있는 실행 시간의 오<br />

차 범위를 설정할 수 있게 함으로써 기법을 유연하게 적용할 수 있게 한다.<br />

핵심어 : 안티 디버깅, 동적 분석, 시간 기반, 해시 함수, 코드 암호화<br />

Abstract<br />

Debuggers are the tools which are helping the user to find out and correct the logic errors or bug by<br />

showing internal state and running mechanism while developing software. But it is also misused as<br />

vulnerability analysis for system attacks like extracting internal algorithm of program or privilege elevation.<br />

For this reason, anti-debugging techniques are applied to prevent debugging, but the techniques to bypass<br />

anti-debugging are keep developing.<br />

In this paper, we propose anti-debugging techniques by using time-based key generation method to<br />

prevent previous bypass techniques. The proposed techniques are difficult to bypass attack generate key by<br />

using hash value instead of not using previous method which is detecting previous debugging and respond<br />

접수일(2013년04월16일), 심사의뢰일(2013년04월17일), 심사완료일(1차:2013년04월29일, 2차:2013년05월15일)<br />

게재일(2013년06월30일)<br />

1 136-713 서울시 성북구 안암동 5가 , 고려대학교 정보보호대학원.<br />

email: mosd00@korea.ac.kr<br />

2 136-713 서울시 성북구 안암동 5가 , 고려대학교 정보보호대학원.<br />

email: kimsunghoon@korea.ac.kr<br />

3 (교신저자) 136-713 서울시 성북구 안암동 5가 , 고려대학교 정보보호대학원.<br />

email: donghlee@korea.ac.kr<br />

291


시간 기반 키 생성 방식을 이용한 안티 디버깅 기법<br />

in conditional method. We also introduce scheme that setting scope of the execution time by shift operation<br />

instead of simply induce the value of the key by specific area of the program’s execution time. It can set<br />

a range of run-time errors can be occurred by system hardware so scheme can be applied flexibly in the<br />

various environments.<br />

Keywords : anti-debugging, dynamic analysis, time-based, hash function, code encryption<br />

1. 서론<br />

프로그램 실행 시 동적 분석을 가능하게 하는 디버깅 도구는 소프트웨어의 개발 과정에서 오류<br />

나 버그를 찾아 보완하는데 필수적인 도구이다. 이러한 디버깅 도구는 프로그램의 취약성을 발견<br />

이나 지적재산권이 포함된 알고리즘과 같은 프로그램 내부의 비밀 정보 추출과 같은 악의적인 역<br />

공학 도구로 악용될 수 있다. 이와 같이 발견된 취약성은 주로 시스템 권한 상승과 같은 공격에<br />

이용될 수 있으며, 프로그램 내부에 포함된 비밀 정보 추출은 소프트웨어 지적 재산권 침해에 악<br />

용될 수 있다.<br />

소프트웨어 보호 방법으로 코드 난독화, 코드 암호화, 코드 변조 방지 기술과 같은 방법들이 제<br />

안되고 있다. 이와 같은 방법들은 코드의 본래 기능성은 유지하면서 코드를 의미 없는 코드로 변<br />

환시키거나 복잡하게 만들어서 정적 분석을 어렵게 할 수 있지만 디버거를 이용해서 실행 시간 동<br />

안의 프로그램의 동작 행위를 분석하는 동적 분석까지는 방어하기 어렵다[3]. 이에 대한 대응책으<br />

로 안티 디버깅 기법이 있다. 안티 디버깅은 디버깅 도구들을 이용해 공격자가 동적 분석을 하려<br />

고 할 때 디버거를 탐지하고, 디버거 발견 시 디버거를 무력화 시킬 수 있는 기술이다[2][3]. 기존<br />

의 안티 디버깅 기법[1][6]들은 디버거 탐지 방법 중심으로 연구되어 왔다. Window에서 제공하는<br />

디버거 탐지 방법은 API 형태로 제공된다[11]. 제공된 라이브러리 Win32에 있는 함수를 호출하여<br />

시스템 정보를 검사해서 돌려받는 리턴 값을 비교하여 디버깅이 첨부되었는지 판단한다. 이렇게<br />

조건문 응답 방식으로 구현되어 있는 방식은 리턴 값을 조작하거나 점프 구문을 통해 우회 공격이<br />

용이하다.<br />

본 논문에서는 시간 기반 키 생성 방식을 통한 우회 공격을 어렵게 하는 안티 디버깅 기법을<br />

제안한다. 프로세스 실행 시간을 키 값으로 사용하면 실행 환경에 따라 변하는 키 값으로 제대로<br />

복호화가 되지 않는다. 다양한 실행 환경에 맞게 실행 시간의 유효 범위를 주기 위해서 시프트 연<br />

산을 사용한다. 시프트 연산을 통하여 실행 지연 시간이 오차 범위 내에서는 실행 시간의 차분 값<br />

이 0이 나오게 하고, 실행 지연 시간이 오차 범위 밖에서는 실행 시간의 차분 값이 다른 값이 되<br />

게 만든다. 그리고 0의 노출을 막기 위해서 특정 영역을 0과 같이 패치하여 해시함수를 취한 값을<br />

키 값으로 생성하였고 키 값으로 쓰인 특정 영역이 변조되면 해시함수의 특성에 따라 무결성을 보<br />

장해준다. 사전에 정해 놓은 영역의 실행 시간차가 오차 범위 내에 있으면 정당한 키가 생성 된다.<br />

하지만 실행 시간차가 오차 범위를 넘어서면(즉, 디버거가 첨부 되었을 때) 다른 키 값이 형성된<br />

다. 올바르지 않은 키 값으로 복호화 하면 자가 변조된 코드영역은 비정상적으로 생성 되어서 그<br />

292


보안공학연구논문지 (Journal of Security Engineering), 제 10권 제 3호 2013년 6월<br />

로 인한 오류가 발생한다. 그리고 시간 기반 키 생성 방식을 기존 변조 방지 코드 암호화 기법 [5]<br />

이나 명령어 자가 변조 기법[9]에 적용하여 개선하였다.<br />

본 논문의 구성은 다음과 같다. 2장에서는 배경 지식과 관련 연구들을 설명하고, 3장에서는 프<br />

로세스 실행 중에 실행 시간과 실행 코드의 특정 영역을 이용하여 키 생성하는 방법과 적용 기법<br />

을 기술한다. 그리고 기존 기법들을 개선하는 방식을 소개한다. 4장에서는 개선된 기법을 보안 분<br />

석 하고 마지막 5장은 결론을 설명한다.<br />

2. 배경지식 및 관련연구<br />

2.1 안티 디버깅 기술<br />

이 장에서는 API기반 탐지, 예외처리 기반 탐지, 시간 기반 탐지에 따른 안티 디버깅 기술[1][6]<br />

을 소개한다.<br />

2.1.1 API(Application Program Interface) 기반 탐지<br />

마이크로소프트사가 제공하는 WIN 32 라이브러리 함수 호출을 이용하여 시스템 정보를 검사하<br />

여 디버거의 존재를 확인하고 대응한다.<br />

[표 1] 안티 디버깅 기법<br />

[Table 1] Anti-debugging techniques<br />

안티 디버깅 기법<br />

IsDebuggerPresent<br />

NTGlobalFlags<br />

CheckRemoteDebuggerPresent<br />

FindWindow<br />

Heap flags<br />

OutputDebugString<br />

설명<br />

PEB(Process Environment Block) 구조체의 디버깅 상태 값을 확<br />

인 디버깅 시 1, 아니면 0을 리턴<br />

PEB 구조체의 0x68에 위치한 값을 확인<br />

정상이면 0, 디버깅 시 다른 값 리턴<br />

BeingDebugged flag에 대한 목표 프로세스의 PEB를 검사<br />

디버깅 시 pbDebuggerPresent 변수가 0xfffffff<br />

FindWindow 함수를 호출하여 특정 윈도우 이름이나 클래스 이름<br />

을 찾아 프로그램이 실행중인지 검사<br />

PEB 구조체의 0x18에 위치해 있는 Heap flags를 검사<br />

정상이면 2, 디버깅 시 다른 값 리턴<br />

kernel32에 위치에 있는 GetLastError 함수를 호출하여 검사<br />

디버깅 시 0 리턴<br />

2.1.2 예외처리(exception) 기반 탐지<br />

예외처리 기반 탐지 방법은 인터럽트(interrupt) 수행 중 같은 인터럽트 코드를 만났을 때 예외<br />

처리를 하지 않는 경우 디버깅 중으로 판단한다. 대표적인 방법인 INT 3(0xCC) 예외처리는 연산<br />

코드(operation code) 0xCC에 의해 수행된다.<br />

293


시간 기반 키 생성 방식을 이용한 안티 디버깅 기법<br />

2.1.3 시간 기반 탐지<br />

지시된 명령의 실행 시간과 정상적인 실행 시간과 비교하는 기술이다. 디버거 안에서 프로그램<br />

이 실행되거나 단일 스태핑이 일어날 때, 명령의 실행 사이의 지연시간이 커지게 된다. 그 실행 시<br />

간 사이의 차가 임계점 범위 내에 있는지 검사한다.<br />

2.2 코드 암호화 기법<br />

일반 적인 암호화 방식은 프로그램 전체를 암호화 하여 저장하고 복호화 루틴은 프로그램의 엔<br />

트리 포인트처럼 암호화된 바디와 셋에 보통 추가되어진다. 암호화된 프로그램은 한 비트를 변조<br />

하면 한 비트 이상이 변하게 되므로 정적분석을 통한 취약점을 찾기 어렵다. 하지만 복호화 할 때<br />

코드 전체가 동시에 복호화 되어서 공격자는 디버거를 통해 복호화 되는 순간 기억장치 영역을 내<br />

용만 가져오면 된다. 요구 시(On-demand) 암호화 방식은 프로그램 실행 시 프로그램 전체가 노출<br />

되는 것을 막기 위해서 고안되었다. 일반적인 암호화 방법과 다르게 프로세스 실행 시 필요만 부<br />

분만 복호화 하해서 실행한 후 다시 암호화 된다[10].<br />

요구 시(On-demand) 복호화 방식을 이용한 자가 변조 코드 암호화 기법[5]은 b영역을 암호화<br />

하기 위해서 b의 영역이 아닌 a영역을 해시함수를 통해 키 값을 생성해서 그 키 값으로 암호화 하<br />

는 방식이다. 코드 영역 b를 암호화 할 때 영역 b가 아닌 다른 영역 a에서 해시함수를 통해 키를<br />

생성해서 암호화해서 저장한다. a부분이 변조되면 해시 값이 변하게 되어 무결성이 보장되고 암호<br />

화된 영역은 기밀성이 보장 된다.<br />

[그림 1] 자가 변조 코드 암호화 기법<br />

[Fig. 1] Tamper resistant code encryption<br />

[그림 1]은 자가 변조 코드 암호화 기법의 실행 과정이다. 암호화된 영역 를 복호화 하<br />

기 위해 다른 영역인 a영역의 해시함수 값을 이용해 복호화 키 를 구한다. 복호화 키 <br />

294


보안공학연구논문지 (Journal of Security Engineering), 제 10권 제 3호 2013년 6월<br />

를 이용해서 암호화된 를 복호화시킨다( ). 만약 코드 영역 a가 변조<br />

되었다면 복호화 키 a의 해시 값이 달라져 올바르지 못한 키 값이 생성된다. 올바르지 못한 키 값<br />

으로 복호화 되었을 경우 잘못된 데이터로 변조 되고 오류를 일으킨다. 복호화 과정이 올바르게<br />

진행 되면 원본 영역 b가 나올 것이고 코드 영역 b를 실행 시킨 후 다시 암호화하여 저장 한다<br />

( ).<br />

2.3 명령어 자가 변조 기법<br />

코드가 역어셈블러 되더라고 분석을 어렵게 하기 위해 원본 명령어 셋을 위장 명령어 셋으로<br />

변화하는 방식이다.<br />

[그림 2] 명령어 자가 변조<br />

[Fig. 2] camouflage instruction<br />

노출되고 싶지 않은 보호하려는 대상 명령어 셋을 설정한다. 보호하려는 대상 명령어 셋을 임의<br />

의 다른 명령어 셋으로 변환한다. [그림 2]의 원본 명령어 셋 cmpl과 jne를 movl과 call로 변환하<br />

였다. 실제 실행될 때 원본 명령어 셋이 실행되기 위해서 복원 루틴을 삽입하고 복원 루틴이 실행<br />

되고 원본 명령어 셋이 실행 된 후에 메모리에 원본 명령어 셋이 그대로 남아있기 때문에 은닉 루<br />

틴을 삽입하여 위장 명령어 셋으로 다시 변환한다.<br />

실행될 때는 목표 블록의 시간을 측정해서 실행 시간이 유효 범위 내에 있으면 복원 루틴을 실<br />

행시켜 원본 명령어 셋이 나오게 하고 원본 명령어 셋을 실행 시킨 후 다시 은닉 루틴을 통해 명<br />

령어 셋을 다시 위장시킨다. 만약 실행 시간이 유효 범위 밖이면 위장된 명령어 셋이 실행되어서<br />

잘못된 명령어로 인한 오류가 발생한다.<br />

295


시간 기반 키 생성 방식을 이용한 안티 디버깅 기법<br />

3.제안하는 시간 기반 안티 디버깅 기법<br />

사람이 디버깅하면 단일 스태핑 등으로 실행 속도가 현저하게 느려져서, 두 지점 간 실행 시간<br />

이 증가한다. 실행 환경에 따라 프로세스 실행 시간이 다양하기 때문에 실행 시간을 키 값으로 바<br />

로 적용하는 것은 힘들다. 프로세스의 실행 시간의 범위를 정하고 시프트 연산을 통해서 실행 시<br />

간의 범위 내에 시간의 차분 값이 항상 일정한 값이 나오도록 만들었다. 그리고 무결성을 보장하<br />

기 위해 특정 영역을 시간 차분 값과 같이 해시함수의 입력 값으로 사용하였다. 프로세스 실행 시<br />

디버거가 첨부되면 두 지점 간 실행 시간이 증가로 인해 올바르지 못한 키 값이 생성 되고, 올바<br />

르지 못한 키 값으로 복호화로 인해 잘못된 데이터로 인한 오류가 발생한다. 기존 조건 구문 방식<br />

은 점프문을 통해 간단히 우회가 가능하였지만, 제안하는 기법은 키를 생성하지 못하면 잘못된 복<br />

호화로 인해 자가 변조가 일어나서 우회하기 어렵다.<br />

3.1 키 생성 방법<br />

실행 코드의 두 지점의 실행 시간 , 을 각각 측정한다.<br />

측정한 두 값 , 에 임계점에 맞는 시프트 연산을 한다. (그림 3)<br />

각각 시프트 연산 결과 값 ′ , ′ 의 차분 값을 계산한다.<br />

′<br />

계산된 차분 값 <br />

′ 과 실행 코드의 특정 영역 IB를 더하여 해시 함수(hash function) 취한<br />

′<br />

값을 키 값으로 생성한다. <br />

′ <br />

<br />

[그림 3] 시프트 연산<br />

[Fig. 3] Shift operation<br />

프로세스 실행 시간 지연 범위의 임계점을 설정하는 방법으로 시프트 연산을 사용하였다. 임계<br />

점 범위 내의 실행 시간의 차이에서는 키 값이 동일하게 생성되어 정당한 키 값 을<br />

만들 수 있다. 하지만 프로세스에 디버거가 첨부되면 프로세스 실행 지연 시간이 증가한다. 이 때,<br />

′<br />

프로세스 실행 시간 임계점을 벗어나서 다른 키 값 <br />

′ <br />

이 형성된다. (∵<br />

<br />

′<br />

<br />

′<br />

≠ )<br />

잘못된 키 값으로 코드를 실행하면 제대로 복호화가 일어나지 않아 코드의 오류를 발견할 수<br />

296


보안공학연구논문지 (Journal of Security Engineering), 제 10권 제 3호 2013년 6월<br />

있다. 그리고 실행 코드를 변조하면 해시 값이 달라지게 되어서 오류가 탐지 된다. 즉, 무결성도<br />

보장한다. 따라서 디버거가 첨부되었는지 자동으로 탐지 할 수 있게 된다. 또한 해시 함수의 매개<br />

변수 IB는 설계자가 임의로 정한 실행 코드의 특정 영역이다. 공격자는 특정 영역 IB 값을 알 수<br />

없으므로 키 값을 생성할 수 없게 되고, 디버거를 첨부하는 행위를 방지 할 수 있다.<br />

[그림 4] 키 생성 방법<br />

[Fig. 4] Key generation mechanism<br />

3.2 제안하는 기법을 적용한 기존 기법[5,9] 개선<br />

제안하는 키 생성 방식을 통한 안티 디버깅 기법은 디버깅을 통한 동적 분석을 어렵게 한다. 하<br />

지만 정적 분석을 통해 시간 값을 받아 오는 위치를 알면 취약해 질 수 있다. 기존 기법은 정적분<br />

석에 대해 고려하였지만 디버깅을 통한 동전분석에 대해 취약할 수 있다. 기존 기법을 동적 분석<br />

과 정적 분석 모두 어렵게 하기 위해 제안 하는 키 생성 방식을 통해 개선하였다.<br />

3.2.1 코드 암호화 기법<br />

자가 변조 암호화 기법[5]은 코드를 암호화함으로써 정적 분석하기 어렵게 하였다. 하지만 디버<br />

거를 이용한 동적 분석을 막기는 어렵다. 제안하는 시간 기반 키 생성 방식을 적용하여 디버깅을<br />

통한 동적 분석도 어렵게 개선하였다.<br />

3.2.1.1 암호화 과정<br />

∙프로그램의 환경을 고려하여 임계점을 설정한다.<br />

∙실행 프로세스의 두 지점의 실행 시간을 각각 측정한다. , <br />

∙측정한 실행 시간을 각각 시프트 연산한다. ′ ′<br />

, <br />

297


시간 기반 키 생성 방식을 이용한 안티 디버깅 기법<br />

∙시프트 연산한 값들의 차분 값과 프로세스의 특정 영역 IB에 해시 함수를 취하여 키를 생성한<br />

다. <br />

′<br />

′ <br />

∙생성한 키를 이용해서 보호 하고자 하는 영역(PA)을 암호화 하여 저장한다. <br />

<br />

[그림 5] 암호화 과정<br />

[Fig. 5] Key generation mechanism<br />

3.2.1.2 실행과정<br />

′ ′<br />

∙실행 프로세스의 실행시간을 시프트 연산한 후 차분 값을 계산한다. <br />

<br />

′<br />

∙차분 값과 코드의 특정 영역 IB를 해시 함수를 이용하여 키를 생성한다. <br />

′ <br />

<br />

∙생성된 키를 이용하여 암호화 된 영역 <br />

을 복호화 한다. <br />

<br />

<br />

∙복호화 된 보호된 영역 를 실행 한 후 다시 암호화 한 후에 저장한다. <br />

<br />

프로세스가 실행되면 실행 시간을 측정하여 시프트 연산을 통한 동적으로 키 값을 계산한다. 계<br />

산된 키 값으로 보호 되어 있는 영역을 복호화한 후 실행 후에 다시 암호화해서 저장한다.<br />

′ ′<br />

프로세스 실행 시간차가 임계점 범위 안에 있으면 시간 차분 값은 <br />

<br />

이 되어서 정당한<br />

키 값 이 형성 되지만, 만약 동적 분석을 하기 위해서 디버거를 첨부하는 행위 등으<br />

′ ′<br />

로 인해 프로세스 시간 차분 값이 임계점을 넘어서면 <br />

≠ 이 되므로 다른 키 값이 형성된<br />

다. 잘못된 키 값으로 복호화를 하면 복호화가 제대로 되지 않아 잘못된 데이터 값 및 오류가 발<br />

생하여 디버깅을 탐지한다. 즉 자가 변조가 일어난다. 또한 공격자는 임의로 정한 특정 영역 IB를<br />

알 수 없으므로 정당한 키 값을 생성할 수 없다. 코드 영역에 변조가 일어날 경우 올바르지 못한<br />

298


보안공학연구논문지 (Journal of Security Engineering), 제 10권 제 3호 2013년 6월<br />

키 값이 형성되므로 무결성도 보장한다.<br />

[그림 6] 실행 과정<br />

[Fig. 6] Execution process<br />

3.2.2 명령어 자가 변조 기법<br />

명령어 자가 변조 기법[9]은 원본 명령어 셋을 다른 명령어 셋으로 변환함으로써 정적 분석을<br />

어렵게 한다. 하지만 조건문 응답 방식의 안티디버깅 기술로 리턴 값 조작이나 무조건 점프문으로<br />

변화하여 우회 공격이 가능하다. 제안한 기법을 적용하면 우회 공격을 어렵게 한다.<br />

[그림 7] 명령어 자가 변조 개선된 기법<br />

[Fig. 7] adapted camouflage instruction<br />

299


시간 기반 키 생성 방식을 이용한 안티 디버깅 기법<br />

시간 값 을 읽어 들이고 시간 값 오차 임계점 CT만큼 시프트 연산 ′ 하여 저장한다. 목표 블<br />

록의 실행한 후 다시 시간 값 을 읽어 들이고 시프트 연산 ′ ′<br />

후 차분 값 <br />

′ 을 계산한다. 조<br />

건문 응답 방식을 통한 실행 시간 측정값이 유효 범위에 있을 때만 복원 루틴을 시키는 방식이 아<br />

′<br />

닌 계산된 값 <br />

′ 을 위장된 명령어 셋에 더한다. 디버거가 첨부되면 실행 시간의 증가로 인한<br />

올바르지 않는 키가 생성되고 올바르지 않은 키로 패치된 위장명령어 셋은 복원 루틴 과정 시 원<br />

본 명령어 셋이 복구 되지 않으면서 오류가 발생한다.<br />

4. 개선된 기법의 보안 분석<br />

4.1 코드 암호화 기법<br />

기존 코드 암호화 기법은 코드를 암호화를 통해 정적분석을 어렵게 하지만 디버거를 통한 동적<br />

분석을 통해 복호화 키를 얻을 수 있다. 개선된 기법은 프로세스가 실행 될 때, 프로세스 실행 시<br />

간을 사용하여 특정 영역과 같이 해시 함수를 통해 키 값을 생성한다. 올바른 키 값을 생성하지<br />

못하면 보호된 영역을 실행시키지 못한다. 또한 동적 분석을 위해 디버거를 첨부하면 프로세스의<br />

실행시간 증가로 인한 실행시간의 차가 임계점을 벗어나 올바르지 못한 키 값이 생성된다. 올바르<br />

지 못한 키 값으로 복호화 할 경우 원본 데이터와 다른 데이터가 형성된다. 이 데이터로 실행될<br />

시 잘못된 데이터로 인한 자가 변조가 일어나서 오류를 발생시킨다. 즉 디버깅을 통한 동적 분석<br />

을 어렵게 한다.<br />

4.2 명령어 위장 기법<br />

명령어 위장 기법은 목표 블록의 실행 시간을 측정하여 실행 시간이 유효 시간 범위 내에 있는<br />

지 조건 구문을 통해 복원 루틴을 실행시킨다.<br />

[표 2] 분석<br />

[Fig. 2] Analysis<br />

코드암호화 기법[5]<br />

개선된 코드<br />

암호화 기법<br />

명령어 자가 변조<br />

기법<br />

개선된 명령어<br />

자가 변조 기법<br />

디버깅 탐지 X O O O<br />

우회 O X O X<br />

개선 후<br />

추가 발생<br />

연산<br />

-<br />

복호화 할 때마다<br />

rdtsc 2회<br />

shr 2회<br />

sub 1회<br />

-<br />

명령어를 복원할<br />

때마다<br />

shr 2회<br />

add 1회<br />

300


보안공학연구논문지 (Journal of Security Engineering), 제 10권 제 3호 2013년 6월<br />

이러한 조건문 응답 방식의 안티 디버깅 기법들은 동적 분석을 점프 및 리턴 값 자체를 조작하<br />

는 방식으로 우회 공격이 가능하다(조건문 점프를 무조건 점프로 변환 등). 개선된 기법은 프로세<br />

스가 실행될 때, 프로세스 실행 시간을 이용하여 키가 생성된다. 실행 시간 내에서는 항상 일정한<br />

키 값이 생성되어서 위장된 명령어 셋에 패치된다. 동적 분석을 위해 디버거가 첨부 되면 실행 시<br />

간 증가로 인한 잘못된 키 값이 생성되고 잘못된 키 값으로 패치된 명령어 셋은 원본 명령어 셋으<br />

로 복원이 되지 않으므로 오류가 발생한다.<br />

코드 암호화 기법은 정적 분석에 대해 어렵게 하였지만 디버깅을 통한 동적 분석을 고려하지<br />

않았다. 개선된 코드 암호화 기법은 복호화 할 때마다 프로세스 실행 시간 측정 2회, 시프트 연산<br />

2회, 뺄셈 연산 2회가 추가 적으로 들어가지만 이를 통해 디버깅을 통한 동적 분석을 어렵게 한다.<br />

명령어 자가 변조 기법은 실행 시간의 오차 범위 내에 있으면 복원 루틴을 실행시키고, 오차 범위<br />

밖이면 복원 루틴을 실행시키지 않는 조건 구문으로 구현되었다. 이러한 조건 구문은 리턴 값 조<br />

작이나 점프문 변환으로 우회 공격이 용이하다. 개선된 명령어 자가 변조 기법은 명령어를 복원할<br />

때마다 시프트 연산 2회, 덧셈 연산 1회가 추가적으로 발생하지만 생성된 키를 명령어에 패치함으<br />

로써 우회공격을 어렵게 한다.<br />

5. 결론<br />

본 논문에서는 시간 기반 키 생성 방식을 통한 안티 디버깅 기법을 제안하였다. 제안된 기법은<br />

실행 시간을 키 값으로 생성할 경우의 어려움을 해결하였다. 그리고 디버거 탐지 시 조건 구문 우<br />

회 공격 회피의 어려움을 해결하였다. 제안된 기법으로 암호화 하여 저장하면, 프로세스가 실행 될<br />

때 암호화 된 부분을 복호화하기 위한 키 생성을 하기 위해서 프로세스 실행 시간 차분 값과 특정<br />

영역의 해시 값을 계산하여 동적으로 키를 생성한다. 디버거가 첨부되면 프로세스 실행 시간의 차<br />

가 증가 하여 올바르지 못한 키가 생성된다. 올바르지 못한 키로 복호화하면 잘못된 복호화에 의<br />

해 자가 변조가 일어나고 오류가 발생한다. 또한 코드 암호화 기법과 명령어 자가 변조 기법을 개<br />

선하여 우회가 어려운 안티디버깅 기법을 제안하였다.<br />

301


시간 기반 키 생성 방식을 이용한 안티 디버깅 기법<br />

참고문헌 [Reference]<br />

[1] T. Shields, Anti-Debugging – A Developers View, white paper, Veracode Inc., (2009)<br />

http://www.veracode.com/images/pdf/whitepaper_ antidebugging.pdf, accessed December 28, 2010<br />

[2] M. N. Gagnon, S. Taylor, and A. K. Ghosh, Software protection through anti-debugging, IEEE Security and<br />

Privacy, (2007), Vol. 5, pp. 82-84.<br />

[3] K. Oishi and T. Matsumoto, Self Destructive Tamper Response for Software Protection, ASIACCS’11 March<br />

(2011).<br />

[4] M. J. Kim, J. Y. Lee, H. Y Chang, S. J. Cho, M. K. Park, Y. S. Park, and P. A. Wilsey, Design and<br />

Performance Evaluation of Binary Code Packing for Protection Embedded Software against Reverse<br />

Enginneering, proc. IEEE 13th ISORC, May (2010).<br />

[5] J. Cappaert, B. Preneel, B. Anckaert, M. Madou, and K. D. Bosschere, Towards Tamper Resistant Code<br />

Encryption: Practice and Experience, proc. 4th Information Security practice and Experience Conference,<br />

Springer-Verlag, March (2008), pp. 160-175.<br />

[6] R. R. Branco, G. N. Barbosa, and P. D. Neto, Scientific but Not Academical Overview of Malware<br />

Anti-Debugging, Anti-Disassembly and Anti-VM Technologies, BlackHat,<br />

http://research.dissect.pe/docs/blackhat2012-paper.pdf, July (2012).<br />

[7] N. A. Quyng, and K. Suzaki, Virt-ICE: Next-generation Debugger for Malware Analysis, BlackHat Briefings<br />

USA, (2010).<br />

[8] J. H. Park, S. H. Kim, D. H. Lee, A Tamper Resistance Software Mechanism using MAC Function and<br />

Dynamic Link Key, Journal of The Korea Institute of Information Security and Cryptology 23-1, Feb.<br />

(2013).<br />

[9] Y. Kanzaki, and A. Monden, A Software Protection Method Based on Time-Sensitive Code and<br />

Self-Modefication Mechanism, proc. the Internationl Conference Software Engineering and Applications, Nov.<br />

8-10, (2010).<br />

[10] N. Metha, and S. C. Shiva, ELF Executable Encryptor. Secure Reality.<br />

http://www.securereality.com.au/<br />

[11] N. Falliere, Windows anti-debug reference,<br />

http://www.symantec.com/connect/ja/articles/windows-anti-debug-reference, (2007).<br />

302


보안공학연구논문지 (Journal of Security Engineering), 제 10권 제 3호 2013년 6월<br />

저자 소개<br />

이광재 (Kwangjae Lee)<br />

2007년 2월 : 숭실대학교 수학과 졸업<br />

2013년 8월 : 고려대학교 정보보호대학원 석사<br />

관심분야 : 정보보호, VANET, 소프트웨어 보안<br />

김성훈 (Sunghoon Kim)<br />

2006년 8월 : 서울시립대학교 수학과 졸업<br />

2009년 2월 : 고려대학교 정보보호대학원 석사 졸업<br />

2009년 1월 ~ 2011년 2월 : ㈜알티캐스트 CAS개발본부 전임연구원<br />

2011년 3월 ~ 현재 : 고려대학교 정보보호대학원 박사과정<br />

관심분야 : 소프트웨어 보안, 소프트웨어 난독화<br />

이동훈 (Dong Hoon Lee)<br />

1983년 : 고려대학교 경제학과 학사 졸업<br />

1987년 : Oklahoma University 전산학 석사 졸업<br />

1992년 : Oklahoma University 전산학 박사 졸업<br />

1993년 ~ 1997년 : 고혀대학교 전산학과 조교수<br />

1997년 ~ 2001년 : 고려대학교 전산학과 부교수<br />

2001년 ~ 현재 : 고려대학교 정보보호대학권 교수<br />

관심분야 : 정보보호이론, 암호 프로토콜, USN, 키 교환, 프라이버시향상기술<br />

(PET), 익명성 연구<br />

303


시간 기반 키 생성 방식을 이용한 안티 디버깅 기법<br />

304

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!