KR101837337B1 - 네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프로 변환하여 분석도구의 cfg 생성을 방해하는 방법 및 장치 - Google Patents

네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프로 변환하여 분석도구의 cfg 생성을 방해하는 방법 및 장치 Download PDF

Info

Publication number
KR101837337B1
KR101837337B1 KR1020170019761A KR20170019761A KR101837337B1 KR 101837337 B1 KR101837337 B1 KR 101837337B1 KR 1020170019761 A KR1020170019761 A KR 1020170019761A KR 20170019761 A KR20170019761 A KR 20170019761A KR 101837337 B1 KR101837337 B1 KR 101837337B1
Authority
KR
South Korea
Prior art keywords
jump
instruction
register
relative address
indirect
Prior art date
Application number
KR1020170019761A
Other languages
English (en)
Inventor
조홍래
오희국
하동수
Original Assignee
한양대학교 에리카산학협력단
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 한양대학교 에리카산학협력단 filed Critical 한양대학교 에리카산학협력단
Priority to KR1020170019761A priority Critical patent/KR101837337B1/ko
Application granted granted Critical
Publication of KR101837337B1 publication Critical patent/KR101837337B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/121Restricting unauthorised execution of programs
    • G06F21/125Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프로 변환하여 분석도구의 CFG 생성을 방해하는 방법 및 장치가 개시된다. 본 발명의 일 실시예에 따른 CFG 생성 방해 방법은 네이티브코드를 디스어셈블리하여 블록들 간의 상대주소 점프 명령어를 확인하는 단계; 간접 점프(indirect jump)를 위한 레지스터를 선택하는 단계; 상기 선택된 레지스터를 이용하여 상기 확인된 상대주소 점프를 간접 점프로 변환하는 단계; 및 상기 확인된 상대주소 점프가 간접 점프로 변환된 네이티브코드를 생성하는 단계를 포함한다.

Description

네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프로 변환하여 분석도구의 CFG 생성을 방해하는 방법 및 장치 {Obfuscated method of preventing CFG generation from using debugging tools to transform relative address jump into indirect jump between basic block in native code and apparatus therefor}
본 발명은 분석도구의 CFG 생성을 방해하는 기술에 관한 것으로서, 보다 구체적으로 네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프로 변환하여 분석도구의 CFG 생성을 방해할 수 있는 방법 및 장치에 관한 것이다.
대표적인 디스어셈블리 알고리즘에는 LSA(Linear Sweep Algorithm)와 RTA(Recursive Traversal Algorithm)가 존재한다.
LSA 동작 과정은 텍스트 섹션의 바이너리 시퀀스를 고정 혹은 가변 길이로 패치하여 디스어셈블리를 수행한다. LSA는 알고리즘이 간단하고 텍스트 섹션의 모든 명령어를 디스어셈블리할 수 있지만, 텍스트 섹션의 명령어 사이에 들어있는 데이터도 명령어로 분류하여 잘못된 디스어셈블리를 수행하는 문제점이 있다.
RTA 수행과정은 엔트리 포인트를 시작으로 디스어셈블리를 수행한다. 분기 명령어 및 함수 콜 명령어가 나오기 전까지 LSA로 수행하다가 분기 명령어 및 함수 콜 명령어가 나오면 해당 주소로 점프하고 그 주소부터 디스어셈블리를 리니어(linear)하게 수행한다. RTA는 LSA의 단점인 명령어 사이에 있는 데이터를 구분할 수 있지만 레지스터를 통한 간접 점프(Indirect jump)에 대해서는 제대로 된 디스어셈블리를 수행하지 못하는 문제점이 있다.
여기서, 간접 점프(Indirect jump)는 런타임 시점에 정해지는 값을 레지스터에 저장한 후 그 레지스터를 이용하여 간접적으로 점프를 하는 방식을 말한다.
안티디스어셈블리 기법의 목표는 자동으로 쉽게 디스어셈블리가 되면 안 되고 코드가 실제로 돌아가기 전까지 전체 디스어셈블리를 보여주지 않는 것이다. 기존의 안티디스어셈블리 기법에 대한 일 예로, Garbage Bytes는 프로그램이 수행하면서 실행되지 않는 쓰레기 바이트를 삽입하는 기법으로, 이 기법은 LSA의 디스어셈블리를 방해한다. 하지만 x86과 같은 가변길이의 어셈블리어 명령어를 사용하는 환경에서는 몇 스텝 이후에 재동기화를 통해 다시 디스어셈블리를 올바르게 수행하는 문제점이 있다.
기존의 안티디스어셈블리 기법에 대한 다른 일 예로, Fake Conditional Jumps는 컨트롤 플로우가 항상 같은 조건 점프를 만들어 디스어셈블리를 방해하는 기법이다. RTA는 실행이 되지 않는 영역을 디스어셈블리 하는데, 이 영역은 다른 안티디스어셈블리 기법의 적용 공간으로 활용이 가능한 문제점이 있으며, 대표적인 방법으로는 Garbage Bytes와 결합하여 디스어셈블리를 방해할 수 있다.
기존의 안티디스어셈블리 기법에 대한 또 다른 일 예로, ARM 프로세서에서만 동작하는 안티디스어셈블리 기법이 있다. Fake Conditional Jump를 이용하는 방법으로 실행이 되지 않는 영역을 ARM모드 또는 THUMB 모드 변환에 이용한다. 즉, 해당 조건이 참일 경우의 모드와 아닌 경우의 모드를 다르게 하여 분석도구가 분기문 끝난 다음 지점의 기본 블록으로 갔을 경우에 THUMB모드 인지 ARM 모드인지 혼란을 주는 기법이다.
이와 같이, 기존의 관련 연구들은 분석도구의 디스어셈블리를 방해한다는 공통점은 있다. 하지만 국소적인 안티디스어셈블리 기법으로 인해 분석 도구는 대략적인 CFG(control flow graph)를 그려주는 것이 가능하기 때문에 정적 분석만으로도 전체 프로그램의 분석이 가능하다는 문제점이 있다.
또한, 간접 점프를 이용하여 디스어셈블리의 기능을 방해하는 안티디스어셈블리 기법이 있으며, 이 기법은 Recursive Traversal 알고리즘을 통해 디스어셈블리 하는 과정을 방해하는데, 디스어셈블리 과정은 정적 분석으로 수행된다. 따라서, 런타임 시점에 주소 값이 정해지는 간접 점프로 변경 할 경우 분석도구는 점프할 주소를 모르기 때문에 잘못된 디스어셈블리를 수행하게 된다.
상술한 바와 같이, 간접 점프를 이용한 안티디스어셈블리 기법은 디스어셈블리를 방해하는 장점이 있지만, 크기가 가변적인 명령어를 패치하여 디스어셈블리를 수행하는 프로세서에서는 몇 단계 이후 동기화를 통해 다시 명령어를 패치하여 디스어셈블리를 수행하므로 국지적으로 디스어셈블리를 방해한다는 것과 분석도구의 기능이 발달하여 기본 블록 안에서의 상수 값을 통한 간접 점프의 경우에는 흐름분석을 통해 점프주소를 계산하여 디스어셈블리를 올바르게 수행한다는 문제점이 있다.
즉. 기존의 간접 점프를 이용한 안티디스어셈블리 기법으로는 디스어셈블리 과정을 국지적으로 방해하거나 또는 분석도구의 성능에 따라 디스어셈블리 과정을 방해하지 못하기 때문에 분석 도구는 정적 분석만으로도 난독화가 적용된 네이티브코드의 CFG를 그릴 수 있는 문제점이 존재한다.
따라서, 네이티브코드의 CFG 생성을 방해할 수 있는 방법의 필요성이 요구된다.
본 발명의 실시예들은, 네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프(indirect jump)로 변환하여 분석도구의 CFG 생성을 방해할 수 있는 방법 및 장치를 제공한다.
본 발명의 일 실시예에 따른 CFG 생성 방해 방법은 네이티브코드를 디스어셈블리하여 블록들 간의 상대주소 점프 명령어를 확인하는 단계; 간접 점프(indirect jump)를 위한 레지스터를 선택하는 단계; 상기 선택된 레지스터를 이용하여 상기 확인된 상대주소 점프를 간접 점프로 변환하는 단계; 및 상기 확인된 상대주소 점프가 간접 점프로 변환된 네이티브코드를 생성하는 단계를 포함한다.
상기 레지스터를 선택하는 단계는 다음 블록에서 값만을 저장하는 명령어에 쓰이는 레지스터 또는 해당 블록에서 프로그램 흐름과 무관한 레지스터를 선택할 수 있다.
상기 간접 점프로 변환하는 단계는 조건 분기 명령어 이전에 상기 선택된 레지스터에 제1 상대주소를 할당하는 명령어를 삽입하는 단계; 상기 조건 분기 명령어의 상대주소를 간접 점프를 위해 삽입한 명령어의 주소로 수정하는 단계; 상기 조건 분기 명령어 다음에 상기 선택된 레지스터에 제2 상대주소를 할당하는 명령어를 삽입하는 단계; 및 상기 선택된 레지스터를 이용한 간접 점프 명령어를 삽입하는 단계를 포함할 수 있다.
상기 간접 점프로 변환하는 단계는 미리 설정된 쓰레기 바이트를 상기 간접 점프 명령어 다음에 삽입하는 단계를 더 포함할 수 있다.
본 발명의 일 실시예에 따른 CFG 생성 방해 장치는 네이티브코드를 디스어셈블리하여 블록들 간의 상대주소 점프 명령어를 확인하는 확인부; 간접 점프(indirect jump)를 위한 레지스터를 선택하는 선택부; 상기 선택된 레지스터를 이용하여 상기 확인된 상대주소 점프를 간접 점프로 변환하는 변환부; 및 상기 확인된 상대주소 점프가 간접 점프로 변환된 네이티브코드를 생성하는 생성부를 포함한다.
상기 선택부는 다음 블록에서 값만을 저장하는 명령어에 쓰이는 레지스터 또는 해당 블록에서 프로그램 흐름과 무관한 레지스터를 선택할 수 있다.
상기 변환부는 조건 분기 명령어 이전에 상기 선택된 레지스터에 제1 상대주소를 할당하는 명령어를 삽입하고, 상기 조건 분기 명령어의 상대주소를 간접 점프를 위해 삽입한 명령어의 주소로 수정하며, 상기 조건 분기 명령어 다음에 상기 선택된 레지스터에 제2 상대주소를 할당하는 명령어를 삽입하고, 상기 선택된 레지스터를 이용한 간접 점프 명령어를 삽입할 수 있다.
상기 변환부는 미리 설정된 쓰레기 바이트를 상기 간접 점프 명령어 다음에 삽입할 수 있다.
본 발명의 실시예들에 따르면, 네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프로 변환하여 분석도구의 CFG 생성을 방해할 수 있다.
즉, 본 발명의 실시예들에 따르면, 정적 분석만으로는 엔트리 기본블록만 보이므로 프로그램의 전체적인 흐름 파악 및 적용된 보호기법을 분석 할 수가 없으며, 런타임에서도 전체 CFG 기본 블록들이 한꺼번에 다 보이는 것이 아니라 코드의 실행을 통해 단계적으로 기본 블록이 나타나므로 시간을 지연시키는 효과가 있다.
또한, 본 발명의 실시예들에 따르면, 코드 삽입 기법을 통해 의미 없는 코드의 양이 방대 해졌을 경우 시간을 더욱더 지연시키는 것뿐만 아니라 분석이 완료된 코드 역시 한 번에 건너뛰지 못하고 몇 단계를 거쳐야 하는 효과가 있으며, 블록들이 단계별로 하나씩 보이기 때문에 브레이크 포인트를 거는 지점이 한정되어 있다. 즉 안티 브레이크 포인트와의 결합을 통해 런타임에서도 분석을 방해하거나 분석을 하지 못하도록 할 수 있다.
도 1은 종래 CFG 생성 과정을 설명하기 위한 일 예시도를 나타낸 것이다.
도 2는 본 발명의 일 실시예에 따른 CFG 생성 방해 방법에 대한 동작 흐름도를 나타낸 것이다.
도 3 내지 도 5는 본 발명의 CFG 생성 방해 방법을 설명하기 위한 예시도들을 나타낸 것이다.
도 6은 본 발명에 따른 방법이 실제 적용된 예를 나타낸 것이다.
도 7은 본 발명의 일 실시예에 따른 CFG 생성 방해 장치에 대한 구성을 나타낸 것이다.
이하, 본 발명에 따른 실시예들을 첨부된 도면을 참조하여 상세하게 설명한다. 그러나 본 발명이 실시예들에 의해 제한되거나 한정되는 것은 아니다. 또한, 각 도면에 제시된 동일한 참조 부호는 동일한 부재를 나타낸다.
본 발명의 실시예들은, 네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 레지스터를 이용한 간접 점프로 변환하여 분석도구의 CFG 생성을 방해하는 것을 그 요지로 한다.
현재 네이티브코드에 다양한 정적 및 동적 보호 기법을 적용하여 역공학을 방어하고 있지만 분석도구는 네이티브코드의 특성을 이용하여 CFG(control flow graph)를 쉽게 그려준다.
여기서, 네이티브코드의 특성은 컴파일 시점에 프로시저 안의 기본 블록(basic block)들이 상대주소로 연결되어 있는 것을 말한다.
분석도구는 상술한 네이티브코드의 특성을 이용하여 기본 블록들 간의 상대주소를 디스어셈블리 과정을 통하여 얻고 이 값을 이용하여 CFG를 그려준다. 공격자는 이 CFG를 통해 프로그램의 전체 흐름 파악 및 적용된 보호기법의 분석 및 우회기법을 도출할 수 있으며, 이에 대해 도 1을 이용하여 설명하면 다음과 같다.
도 1은 종래 CFG 생성 과정을 설명하기 위한 일 예시도를 나타낸 것으로, 도 1a에 도시된 바와 같이, 종래 분석 도구의 디스어셈블리를 통한 CFG 생성 방법은 컴파일된 네이티브코드의 기계어 코드 A, B, C 기본 블록이 존재하는 경우 분석 도구는 A의 블록의 기계어코드를 디스어셈블리 수행하면서 내려가다가 빨간색 영역의 기계어 코드를 디스어셈블리 하면 블록들 간의 상대주소에 대한 값을 얻을 수 있으며, 조건문이 참일 경우에는 상대주소의 값에 해당하는 C블록을 연결하고, 조건문이 거짓일 경우에는 B블록을 A의 하위 기본 블록으로 연결함으로써, CFG를 추출할 수 있다.
예컨대, 도 1b에 도시된 바와 같이, 레지스터 R4와 16진수 A의 값을 비교하여 R4가 작거나 같을 경우에는 code1(0x412)로 분기하고 아니면 code2(0x500)로 분기하는 컴파일된 네이티브코드를 디스어셈블리함으로써, 오른쪽에 도시된 CFG를 생성하고, 이렇게 생성된 원본 어셈블리어의 흐름을 알 수 있다.
본 발명은 도 1에서 설명한 바와 같이, CFG 생성을 방해하기 위한 것으로, 프로시저의 기본 블록들 간의 모든 상대주소 점프를 레지스터를 이용한 간접 점프(indirect jump)로 변환하는 방법에 대한 것이다
여기서, 간접 점프는 런타임 시점에 정해지는 값을 레지스터에 저장한 후 그 레지스터를 이용하여 간접적으로 점프하는 방식을 말한다. 즉 정적 분석만으로는 분석도구가 레지스터의 절대 주소 값을 알 수 없도록 변환함으로써 CFG를 명확하게 그려주지 못하도록 하는 방법이다.
도 2는 본 발명의 일 실시예에 따른 CFG 생성 방해 방법에 대한 동작 흐름도를 나타낸 것이다.
도 2를 참조하면, 본 발명의 일 실시예에 따른 CFG 생성 방해 방법은 네이티브코드 파일을 수신하고 수신된 네이티브코드 파일을 디스어셈블리함으로써, 기본 블록들 간의 상대주소 점프 명령어를 확인한다(S210, S220)
여기서, 단계 S220은 입력으로 들어온 네이티브코드의 디스어셈블리 과정을 수행하여 CFG를 생성 한 후 네이티브코드의 프로시저 안에 있는 블록들 간의 모든 상대주소 점프 명령어를 찾을 수 있다.
예를 들어, 단계 S210과 S220은 네이티브코드 파일이 입력되면 회귀 순회(Recursive Traversal) 알고리즘으로 네이티브코드의 디스어셈블리를 수행하면서 CFG를 생성함으로써, 생성된 CFG를 통해 모든 상대주소점프 명령어를 찾을 수 있다.
단계 S220을 통해 네이티브코드의 모든 상대주소점프 명령어가 찾아지면 간접 점프를 위한 레지스터를 선택하고, 선택된 레지스터를 이용하여 확인된 모든 상대주소 점프 명령어를 간접 점프로 변환한다(S230, S240).
여기서, 단계 S230은 범용 레지스터를 선택할 수 있으며, 레지스터를 선택하는 방법에는 다음 블록에서 단순히 값을 저장하는 명령어에 쓰이는 레지스터 또는 원래의 프로그램 흐름과 상관없는 레지스터(또는 해당 블록에서 사용하여도 원래의 프로그램 흐름에는 영향을 끼치지 않는 레지스터)를 선택할 수 있다.
단계 S240은 선택한 레지스터에 주소를 할당하는 명령어를 2개 이상 삽입하고 기존의 분기 명령어의 분기 주소를 간접 점프를 통해 점프하는 명령어의 주소로 수정함으로써, 상대주소 점프 명령어를 간접 점프로 변환할 수 있다.
여기서, 단계 S240은 조건 분기 명령어 이전에 선택된 레지스터에 두 상대주소 중 제1 상대주소를 할당하는 명령어를 삽입하고, 조건 분기 명령어의 상대 주소를 간접 점프(indirect jump)를 위해 삽입한 명령어의 주소로 수정할 수 있으며, 조건 분기 명령어 바로 다음에 제2 상대주소를 할당하는 명령어를 삽입하며, 선택된 레지스터를 이용하여 점프를 하는 indirect jump 명령어를 삽입함으로써, 상대주소 점프 명령어를 간접 점프로 변환할 수 있다.
이 때, 단계 S240은 한꺼번에 명령어 수정을 통해 상대주소 점프를 간접 점프로 변환할 수 있다.
이 때, 단계 S240은 필요에 따른 미리 설정된 쓰레기 바이트를 삽입함으로써, 네이티브코드의 CFG 생성을 더욱 방해할 수도 있다.
단계 S240에 의해 상대주소 점프가 간접 점프로 변환되면 상대주소 점프가 간접 점프로 변환된 난독화된 네이티브코드를 생성한다(S250).
즉, 단계 S250은 상대주소 점프가 간접 점프로 변환된 네이티브코드를 인코딩함으로써, 난독화된 네이티브코드 파일을 생성한다.
따라서, 하나의 블록만을 흐름분석 하는 분석도구는 레지스터의 값을 알 수 없기 때문에 하위 블록의 CFG를 그려주지 못하고, 이를 통해 네이티브코드의 전체적인 흐름 파악 및 적용된 보호기법을 분석할 수 없다.
이러한 본 발명에 따른 방법에 대해 도 3 내지 도 5를 참조하여 조금 더 상세히 설명하면 다음과 같다.
도 3 내지 도 5는 본 발명의 CFG 생성 방해 방법을 설명하기 위한 예시도들을 나타낸 것이다.
도 3은 본 발명에 따른 방법을 도식화한 것으로, 먼저 레지스터 예를 들어, 범용 레지스터를 선택한다. 여기서, 레지스터는 다음 블록에서 단순히 값을 저장하는 명령어에 쓰이는 레지스터나 해당 블록에서 사용하여도 원래의 프로그램 흐름에는 영향을 끼치지 않는 레지스터를 선택할 수 있으며, 도 3에서는 레지스터 R7를 선택한 것이다.
그리고 난 후 기존의 명령어를 수정한다. 첫 번째는 조건 분기 명령어 이전에 R7레지스터에 code1(0x424)의 주소를 할당하는 명령어(310)를 삽입하고, 두 번째는 조건 분기 명령어의 상대 주소를 간접 점프(indirect jump)를 위해 삽입한 명령어의 주소(0x420)로 수정(320)한다. 그리고 세 번째는 조건 분기 명령어 바로 다음에 code2(0x512)의 주소를 할당하는 명령어(330)를 삽입하며, 마지막으로 R7레지스터를 이용하여 점프를 하는 indirect jump 명령어(340)를 삽입한다.
여기서, 빨간색 부분이 기존의 명령어에서 수정된 명령어들이다.
도 3과 같은 방법에 의해 명령어 수정 시 분석도구가 그려주는 CFG는 도 4와 같으며, 도 1b의 CFG와 비교 하였을 때 원래 연결되었던 블록들이 연결이 되지 않는 것을 알 수 있으며, 기존에 없었던 새로운 블록들이 엔트리 블록과 연결된 것을 알 수 있다.
CFG에 나타난 새로운 블록은 간접 점프를 위해 명령어 수정 시 나타난 블록들이고 원래 연결이 되었던 기존 블록들이 엔트리 블록과 연결이 안 되는 이유는 BX R7 명령어 즉 indirect jump 때문이다.
분석 도구가 연결을 하기 위해서는 R7에 들어있는 절대주소의 값을 알아야만 하는데, 분석 도구는 흐름분석이 필요할 경우 해당 블록의 흐름분석만을 수행하고 해당 블록의 상위 혹은 하위의 블록에 대한 흐름분석은 하지 않는다. 이러한 이유는 흐름분석은 많은 연산량을 필요로 하고 흐름분석을 한다고 해서 무조건 절대 주소를 얻을 수 있다는 확신이 없기 때문에 해당 블록만 흐름분석을 하도록 프로그래밍 되어 있다.
따라서, 도 3에 도시된 본 발명에 따른 방법에 대한 일 실시예와 같이 레지스터를 이용한 간접 점프를 적용하면 분석 도구는 흐름분석을 하지만 R7의 절대주소의 값을 알 수가 없으므로 CFG를 제대로 그려주지 못하는 것을 도 4를 통해 알 수 있다.
도 4에서 연결이 되지 않은 블록이 CFG에 나온 것은 분석도구는 프로시저 시작 부분에서 프로시저의 끝을 나타내는 명령어가 나올 때까지 디스어셈블리를 수행하기 때문이며, 따라서 그 결과를 CFG에 보여주고 있는 것이다.
나아가, 본 발명에 따른 방법은 쓰레기 바이트를 삽입하여 엔트리 기본 블록만 나오게 할 수도 있고 연결이 되지 않는 블록이 많이 나오는 switch case문과 같은 경우에는 그대로 CFG에 나오게 함으로써, 공격자에게 분석의 어려움을 줄 수도 있다. 도 4에 도시된 CFG 같은 경우에는 연결이 되지 않는 블록이 몇 개 안되므로 연결되지 않은 블록을 없애주는 것이 효과적일 수 있다.
따라서, 도 4와 같은 경우 연결되지 않은 블록을 없애주기 위하여, 미리 설정된 쓰레기 바이트를 BX R7 명령어 바로 다음에 삽입할 수 있다. 분석 도구는 쓰레기 바이트를 만나게 되면 데이터로 착각하게 되고 하위의 명령어들은 데이터 영역으로 판단하여 더 이상 디스어셈블리를 수행하지 않는다. 따라서 CFG에도 나타나지 않게 되며, 도 4에 쓰레기 바이트를 삽입한 결과의 CFG는 도 5와 같을 수 있다. 즉, 도 5에 도시된 바와 같이, 쓰레기 바이트를 삽입함으로써, 도 4의 CFG에서 연결되지 않은 블록이 제거된 것을 알 수 있다.
도 6은 본 발명에 따른 방법이 실제 적용된 예를 나타낸 것으로, 실제 환경에서 본 발명에 따른 방법을 적용하였을 때 IDA Pro가 추출하는 CFG를 단계적으로 보여준 것이다.
도 6을 참조하면, 도 6a는 원래 네이티브코드에 대한 CFG를 나타낸 것이며, 도 6b는 레지스터를 이용한 간접 점프를 위해 명령어가 삽입된 것을 나타낸 것이고, 도 6c는 본 발명에 따른 방법 즉, 레지스터를 이용한 간접 점프 명령어가 삽입된 난독화된 네이티브코드에 대한 CFG를 나타낸 것이다.
그리고, 도 6d는 도 6c에 쓰레기 바이트가 추가적으로 삽입됨으로써, 연결되지 않은 원본 블록을 지운 CFG를 나타낸 것이다.
이와 같이, 본 발명에 따른 방법은 레지스터를 이용한 간접 점프와 필요에 따라 쓰레기 바이트를 이용한 연결되지 않은 원본 블록을 제거하는 방식을 통해 원본 네이티브코드 즉, 프로그램의 전체적인 흐름 파악 및 적용된 보호기법을 분석 할 수 있는 CFG의 생성을 방해하고, 이를 통해 네이티브코드를 보호할 수 있다.
도 7은 본 발명의 일 실시예에 따른 CFG 생성 방해 장치에 대한 구성을 나타낸 것으로, 상술한 도 2 내지 도 6의 방법을 수행하는 장치에 대한 구성을 나타낸 것이다.
도 7을 참조하면, 본 발명의 실시예에 따른 CFG 생성 방해 장치(700)는 확인부(710), 선택부(720), 변환부(730) 및 생성부(740)를 포함한다.
확인부(710)는 네이티브코드를 디스어셈블리하여 블록들 간의 상대주소 점프 명령어를 확인한다.
여기서, 확인부(710)는 입력으로 들어온 네이티브코드의 디스어셈블리 과정을 수행하여 CFG를 생성 한 후 네이티브코드의 프로시저 안에 있는 블록들 간의 모든 상대주소 점프 명령어를 찾을 수 있다.
예를 들어, 확인부(710)는 네이티브코드 파일이 입력되면 회귀 순회(Recursive Traversal) 알고리즘으로 네이티브코드의 디스어셈블리를 수행하면서 CFG를 생성함으로써, 생성된 CFG를 통해 모든 상대주소점프 명령어를 찾을 수 있다.
선택부(720)는 간접 점프(indirect jump)를 위한 레지스터를 선택한다.
이 때, 선택부(720)는 범용 레지스터를 선택할 수 있으며, 레지스터를 선택하는 방법에는 다음 블록에서 단순히 값을 저장하는 명령어에 쓰이는 레지스터 또는 원래의 프로그램 흐름과 상관없는 레지스터(또는 해당 블록에서 사용하여도 원래의 프로그램 흐름에는 영향을 끼치지 않는 레지스터)를 선택할 수 있다.
변환부(730)는 선택된 레지스터를 이용하여 확인된 상대주소 점프를 간접 점프로 변환한다.
이 때, 변환부(730)는 조건 분기 명령어 이전에 선택된 레지스터에 두 상대주소 중 제1 상대주소를 할당하는 명령어를 삽입하고, 조건 분기 명령어의 상대 주소를 간접 점프(indirect jump)를 위해 삽입한 명령어의 주소로 수정할 수 있으며, 조건 분기 명령어 바로 다음에 제2 상대주소를 할당하는 명령어를 삽입하며, 선택된 레지스터를 이용하여 점프를 하는 indirect jump 명령어를 삽입함으로써, 상대주소 점프 명령어를 간접 점프로 변환할 수 있다.
나아가, 변환부(730)는 미리 설정된 쓰레기 바이트를 간접 점프 명령어 다음에 삽입함으로써, 네이티브코드의 CFG 생성을 더욱 방해할 수도 있다.
생성부(740)는 확인된 상대주소 점프가 간접 점프로 변환된 네이티브코드를 생성한다.
즉, 생성부(740)는 상대주소 점프가 간접 점프로 변환된 네이티브코드를 인코딩함으로써, 난독화된 네이티브코드 파일을 생성한다.
비록, 도 7의 장치에서 그 설명이 생략되었더라도 도 7의 장치는 도 2 내지 도 6에서 설명한 내용을 모두 포함할 수 있으며, CFG 생성을 방해하는 모든 기능을 수행할 수 있다는 것은 이 기술 분야에 종사하는 당업자에게 있어서 자명하다.
이상에서 설명된 시스템 또는 장치는 하드웨어 구성요소, 소프트웨어 구성요소, 및/또는 하드웨어 구성요소 및 소프트웨어 구성요소의 조합으로 구현될 수 있다. 예를 들어, 실시예들에서 설명된 시스템, 장치 및 구성요소는, 예를 들어, 프로세서, 콘트롤러, ALU(arithmetic logic unit), 디지털 신호 프로세서(digital signal processor), 마이크로컴퓨터, FPA(field programmable array), PLU(programmable logic unit), 마이크로프로세서, 또는 명령(instruction)을 실행하고 응답할 수 있는 다른 어떠한 장치와 같이, 하나 이상의 범용 컴퓨터 또는 특수 목적 컴퓨터를 이용하여 구현될 수 있다. 처리 장치는 운영 체제(OS) 및 상기 운영 체제 상에서 수행되는 하나 이상의 소프트웨어 애플리케이션을 수행할 수 있다. 또한, 처리 장치는 소프트웨어의 실행에 응답하여, 데이터를 접근, 저장, 조작, 처리 및 생성할 수도 있다. 이해의 편의를 위하여, 처리 장치는 하나가 사용되는 것으로 설명된 경우도 있지만, 해당 기술분야에서 통상의 지식을 가진 자는, 처리 장치가 복수 개의 처리 요소(processing element) 및/또는 복수 유형의 처리 요소를 포함할 수 있음을 알 수 있다. 예를 들어, 처리 장치는 복수 개의 프로세서 또는 하나의 프로세서 및 하나의 콘트롤러를 포함할 수 있다. 또한, 병렬 프로세서(parallel processor)와 같은, 다른 처리 구성(processing configuration)도 가능하다.
소프트웨어는 컴퓨터 프로그램(computer program), 코드(code), 명령(instruction), 또는 이들 중 하나 이상의 조합을 포함할 수 있으며, 원하는 대로 동작하도록 처리 장치를 구성하거나 독립적으로 또는 결합적으로(collectively) 처리 장치를 명령할 수 있다. 소프트웨어 및/또는 데이터는, 처리 장치에 의하여 해석되거나 처리 장치에 명령 또는 데이터를 제공하기 위하여, 어떤 유형의 기계, 구성요소(component), 물리적 장치, 가상 장치(virtual equipment), 컴퓨터 저장 매체 또는 장치, 또는 전송되는 신호 파(signal wave)에 영구적으로, 또는 일시적으로 구체화(embody)될 수 있다. 소프트웨어는 네트워크로 연결된 컴퓨터 시스템 상에 분산되어서, 분산된 방법으로 저장되거나 실행될 수도 있다. 소프트웨어 및 데이터는 하나 이상의 컴퓨터 판독 가능 기록 매체에 저장될 수 있다.
실시예들에 따른 방법은 다양한 컴퓨터 수단을 통하여 수행될 수 있는 프로그램 명령 형태로 구현되어 컴퓨터 판독 가능 매체에 기록될 수 있다. 상기 컴퓨터 판독 가능 매체는 프로그램 명령, 데이터 파일, 데이터 구조 등을 단독으로 또는 조합하여 포함할 수 있다. 상기 매체에 기록되는 프로그램 명령은 실시예를 위하여 특별히 설계되고 구성된 것들이거나 컴퓨터 소프트웨어 당업자에게 공지되어 사용 가능한 것일 수도 있다. 컴퓨터 판독 가능 기록 매체의 예에는 하드 디스크, 플로피 디스크 및 자기 테이프와 같은 자기 매체(magnetic media), CD-ROM, DVD와 같은 광기록 매체(optical media), 플롭티컬 디스크(floptical disk)와 같은 자기-광 매체(magneto-optical media), 및 롬(ROM), 램(RAM), 플래시 메모리 등과 같은 프로그램 명령을 저장하고 수행하도록 특별히 구성된 하드웨어 장치가 포함된다. 프로그램 명령의 예에는 컴파일러에 의해 만들어지는 것과 같은 기계어 코드뿐만 아니라 인터프리터 등을 사용해서 컴퓨터에 의해서 실행될 수 있는 고급 언어 코드를 포함한다. 상기된 하드웨어 장치는 실시예의 동작을 수행하기 위해 하나 이상의 소프트웨어 모듈로서 작동하도록 구성될 수 있으며, 그 역도 마찬가지이다.
이상과 같이 실시예들이 비록 한정된 실시예와 도면에 의해 설명되었으나, 해당 기술분야에서 통상의 지식을 가진 자라면 상기의 기재로부터 다양한 수정 및 변형이 가능하다. 예를 들어, 설명된 기술들이 설명된 방법과 다른 순서로 수행되거나, 및/또는 설명된 시스템, 구조, 장치, 회로 등의 구성요소들이 설명된 방법과 다른 형태로 결합 또는 조합되거나, 다른 구성요소 또는 균등물에 의하여 대치되거나 치환되더라도 적절한 결과가 달성될 수 있다.
그러므로, 다른 구현들, 다른 실시예들 및 특허청구범위와 균등한 것들도 후술하는 특허청구범위의 범위에 속한다.

Claims (8)

  1. 네이티브코드를 디스어셈블리하여 블록들 간의 상대주소 점프 명령어를 확인하는 단계;
    간접 점프(indirect jump)를 위한 레지스터를 선택하는 단계;
    상기 선택된 레지스터를 이용하여 상기 확인된 상대주소 점프를 간접 점프로 변환하는 단계; 및
    상기 확인된 상대주소 점프가 간접 점프로 변환된 네이티브코드를 생성하는 단계
    를 포함하는 CFG 생성 방해 방법.
  2. 제1항에 있어서,
    상기 레지스터를 선택하는 단계는
    다음 블록에서 값만을 저장하는 명령어에 쓰이는 레지스터 또는 해당 블록에서 프로그램 흐름과 무관한 레지스터를 선택하는 것을 특징으로 하는 CFG 생성 방해 방법.
  3. 제1항에 있어서,
    상기 간접 점프로 변환하는 단계는
    조건 분기 명령어 이전에 상기 선택된 레지스터에 제1 상대주소를 할당하는 명령어를 삽입하는 단계;
    상기 조건 분기 명령어의 상대주소를 간접 점프를 위해 삽입한 명령어의 주소로 수정하는 단계;
    상기 조건 분기 명령어 다음에 상기 선택된 레지스터에 제2 상대주소를 할당하는 명령어를 삽입하는 단계; 및
    상기 선택된 레지스터를 이용한 간접 점프 명령어를 삽입하는 단계
    를 포함하는 것을 특징으로 하는 CFG 생성 방해 방법.
  4. 제3항에 있어서,
    상기 간접 점프로 변환하는 단계는
    미리 설정된 쓰레기 바이트를 상기 간접 점프 명령어 다음에 삽입하는 단계
    를 더 포함하는 것을 특징으로 하는 CFG 생성 방해 방법.
  5. 네이티브코드를 디스어셈블리하여 블록들 간의 상대주소 점프 명령어를 확인하는 확인부;
    간접 점프(indirect jump)를 위한 레지스터를 선택하는 선택부;
    상기 선택된 레지스터를 이용하여 상기 확인된 상대주소 점프를 간접 점프로 변환하는 변환부; 및
    상기 확인된 상대주소 점프가 간접 점프로 변환된 네이티브코드를 생성하는 생성부
    를 포함하는 CFG 생성 방해 장치.
  6. 제5항에 있어서,
    상기 선택부는
    다음 블록에서 값만을 저장하는 명령어에 쓰이는 레지스터 또는 해당 블록에서 프로그램 흐름과 무관한 레지스터를 선택하는 것을 특징으로 하는 CFG 생성 방해 장치.
  7. 제5항에 있어서,
    상기 변환부는
    조건 분기 명령어 이전에 상기 선택된 레지스터에 제1 상대주소를 할당하는 명령어를 삽입하고, 상기 조건 분기 명령어의 상대주소를 간접 점프를 위해 삽입한 명령어의 주소로 수정하며, 상기 조건 분기 명령어 다음에 상기 선택된 레지스터에 제2 상대주소를 할당하는 명령어를 삽입하고, 상기 선택된 레지스터를 이용한 간접 점프 명령어를 삽입하는 것을 특징으로 하는 CFG 생성 방해 장치.
  8. 제7항에 있어서,
    상기 변환부는
    미리 설정된 쓰레기 바이트를 상기 간접 점프 명령어 다음에 삽입하는 것을 특징으로 하는 CFG 생성 방해 장치.
KR1020170019761A 2017-02-14 2017-02-14 네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프로 변환하여 분석도구의 cfg 생성을 방해하는 방법 및 장치 KR101837337B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020170019761A KR101837337B1 (ko) 2017-02-14 2017-02-14 네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프로 변환하여 분석도구의 cfg 생성을 방해하는 방법 및 장치

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020170019761A KR101837337B1 (ko) 2017-02-14 2017-02-14 네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프로 변환하여 분석도구의 cfg 생성을 방해하는 방법 및 장치

Publications (1)

Publication Number Publication Date
KR101837337B1 true KR101837337B1 (ko) 2018-04-19

Family

ID=62087766

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020170019761A KR101837337B1 (ko) 2017-02-14 2017-02-14 네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프로 변환하여 분석도구의 cfg 생성을 방해하는 방법 및 장치

Country Status (1)

Country Link
KR (1) KR101837337B1 (ko)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110162963A (zh) * 2019-04-26 2019-08-23 肖银皓 一种识别过权应用程序的方法
CN111339503A (zh) * 2020-02-25 2020-06-26 Oppo广东移动通信有限公司 控制流混淆方法及相关产品
CN112445522A (zh) * 2019-09-02 2021-03-05 中科寒武纪科技股份有限公司 指令跳转方法、相关设备及计算机可读介质
CN114357389A (zh) * 2021-12-31 2022-04-15 北京大学 一种基于llvm的指令加花混淆方法及装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20130333031A1 (en) 2009-12-03 2013-12-12 Google Inc. Dynamic code insertion and removal for static analysis based sandboxes
US20150161383A1 (en) 2008-05-08 2015-06-11 Google Inc. Method for Safely Executing an Untrusted Native Code Module on a Computing Device

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20150161383A1 (en) 2008-05-08 2015-06-11 Google Inc. Method for Safely Executing an Untrusted Native Code Module on a Computing Device
US20130333031A1 (en) 2009-12-03 2013-12-12 Google Inc. Dynamic code insertion and removal for static analysis based sandboxes

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110162963A (zh) * 2019-04-26 2019-08-23 肖银皓 一种识别过权应用程序的方法
CN110162963B (zh) * 2019-04-26 2021-07-06 佛山市微风科技有限公司 一种识别过权应用程序的方法
CN112445522A (zh) * 2019-09-02 2021-03-05 中科寒武纪科技股份有限公司 指令跳转方法、相关设备及计算机可读介质
CN111339503A (zh) * 2020-02-25 2020-06-26 Oppo广东移动通信有限公司 控制流混淆方法及相关产品
CN114357389A (zh) * 2021-12-31 2022-04-15 北京大学 一种基于llvm的指令加花混淆方法及装置
CN114357389B (zh) * 2021-12-31 2024-04-16 北京大学 一种基于llvm的指令加花混淆方法及装置

Similar Documents

Publication Publication Date Title
KR101837337B1 (ko) 네이티브코드에서 기본 블록들 간의 모든 상대주소 점프를 간접 점프로 변환하여 분석도구의 cfg 생성을 방해하는 방법 및 장치
US9250875B1 (en) Table of contents pointer value save and restore placeholder positioning
US9146715B1 (en) Suppression of table of contents save actions
JP5458184B2 (ja) 動的ファンクションコールシステムにおけるアグレッシブな自動修正のためのシステムおよび方法
US8726255B2 (en) Recompiling with generic to specific replacement
CN109359468B (zh) 漏洞检测方法、装置及设备
JP6088713B2 (ja) 脆弱性発見装置、脆弱性発見方法、及び脆弱性発見プログラム
KR101530132B1 (ko) 기호 실행을 이용하는 바이너리 코드 실행 경로 확장 방법 및 장치
CN110825386B (zh) 代码的编译方法和装置、存储介质
KR101788279B1 (ko) 테스트 기법을 이용한 최악 실행 시간 측정 시스템 및 방법
EP2937803B1 (en) Control flow flattening for code obfuscation where the next block calculation needs run-time information
CN108446538B (zh) 基于状态、符号执行和单点逻辑的源代码加固方法及装置
JP2007018254A (ja) 言語処理装置
JP2007304726A (ja) プログラム難読化装置、難読化方法及び難読化プログラム
JP5777843B1 (ja) プロセッサ、処理装置、プログラム作成方法
Vigna Static disassembly and code analysis
KR101995176B1 (ko) 프로그램 실행 컨텍스트 기반의 빅데이터를 활용한 역공학 방법 및 시스템
Heitman et al. BARF: a multiplatform open source binary analysis and reverse engineering framework
US8689327B2 (en) Method for characterization of a computer program part
Qiao et al. Effective function recovery for cots binaries using interface verification
CN102411534B (zh) 一种断点调试方法和断点调试装置
KR102544801B1 (ko) 데이터 재사용 공격에 대한 방어 방법 및 시스템
CN108446536B (zh) 一种基于符号执行和单点逻辑的源代码加固方法及装置
CN109408063A (zh) 基于虚拟机的指令插桩方法及装置
KR102572607B1 (ko) 비실행데이터 내의 셸코드 식별장치 및 방법

Legal Events

Date Code Title Description
E701 Decision to grant or registration of patent right
GRNT Written decision to grant