ìê° ê¸°ë° í¤ ìì± ë°©ìì ì´ì©í ìí° ëë²ê¹ ê¸°ë² - SERSC
ìê° ê¸°ë° í¤ ìì± ë°©ìì ì´ì©í ìí° ëë²ê¹ ê¸°ë² - SERSC
ìê° ê¸°ë° í¤ ìì± ë°©ìì ì´ì©í ìí° ëë²ê¹ ê¸°ë² - SERSC
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