04.07.2014 Views

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

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

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

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

보안공학연구논문지 (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!