KR102104198B1 - 느긋한 심볼화를 활용한 바이너리 재조립 기술의 정확도 향상 기술 및 도구 - Google Patents

느긋한 심볼화를 활용한 바이너리 재조립 기술의 정확도 향상 기술 및 도구 Download PDF

Info

Publication number
KR102104198B1
KR102104198B1 KR1020190003090A KR20190003090A KR102104198B1 KR 102104198 B1 KR102104198 B1 KR 102104198B1 KR 1020190003090 A KR1020190003090 A KR 1020190003090A KR 20190003090 A KR20190003090 A KR 20190003090A KR 102104198 B1 KR102104198 B1 KR 102104198B1
Authority
KR
South Korea
Prior art keywords
binary
code
reassembly
reverse
symbolization
Prior art date
Application number
KR1020190003090A
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 KR1020190003090A priority Critical patent/KR102104198B1/ko
Application granted granted Critical
Publication of KR102104198B1 publication Critical patent/KR102104198B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/52Binary to binary

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

느긋한 심볼화를 활용한 바이너리 재조립 기술의 정확도 향상 기술 및 도구가 개시된다. 일 실시예에 따른 바이너리 재조립 시스템에 의해 수행되는 바이너리 재조립 방법은, 바이너리 파일에 역어셈블을 수행함에 따라 역어셈블 코드를 생성하는 단계; 상기 생성된 역어셈블 코드에 상기 역어셈블을 수행함에 따라 계산된 계측 코드를 삽입하여 바이너리 파일을 재조립하는 단계를 포함하고, 상기 바이너리 재조립 방법은, 정적 값 분석(value analysis)과 동적 메모리 계산 방식을 결합한 느긋한 심볼화를 적용할 수 있다.

Description

느긋한 심볼화를 활용한 바이너리 재조립 기술의 정확도 향상 기술 및 도구{TECHNOLOGY AND SYSTEM FOR IMPROVING THE ACCURACY OF BINARY REASSEMBLY SYSTEM WITH LAZY SYMBOLIZATION}
아래의 설명은 느긋한 심볼화를 활용하여 심볼화 대상 주소의 정확도를 높이는 기술에 관한 것으로, 자세하게는 정적 값 분석(value analysis)과 동적 메모리 계산 방식을 결합한 하이브리드 형태의 심볼화(symbolization)방식으로서 바이너리 코드를 실행 시간에 재조립하는 방법 및 시스템에 관한 것이다.
정적 바이너리 재작성 기술은 상대적으로 높은 이식성과 낮은 퍼포먼스 오버헤드를 가지는 바이너리 재작성 기술이다. 정적 바이너리 재작성에서는 디스어셈블, 코드 추가 및 수정, 그리고 재컴파일의 세 과정을 거쳐 바이너리를 수정한다. 재컴파일된 바이너리는 하나의 독립된 바이너리로써 실행되므로 에뮬레이터와 가상머신의 실행을 요구하지 않아 다양한 종류의 시스템에도 보편적으로 적용할 수 있다는 장점이 있지만, 바이너리의 수정 후 코드와 데이터들이 재배치된다는 문제가 있다. 바이너리의 특정 위치에 있어야 할 코드나 데이터가 수정으로 인해 재배치되면, 해당 코드나 데이터를 참조할 수 바이너리의 실행에 문제를 야기할 수 있기 때문이다. 과거의 연구에서는 이러한 재배치 문제를 해소하기 위해 메모리 심볼화(Memory symbolization)의 방법론이 사용되어 왔다.
메모리 심볼화(비특허문헌 [2], 비특허문헌 [3])는 바이너리 내부에 명시된 값이 메모리 참조 값인지 여부를 다양한 휴리스틱을 사용해 판단한다. 그리고 메모리 참조 연산들에 대해서는 메모리 주소 대신 심볼(라벨)을 활용하여 해당 영역을 참조할 수 있도록 변경한다. 만약 심볼화 작업이 완벽할 수 있다면, 이후 코드가 추가되거나 삭제되어 재배치가 일어나더라도, 정상적인 동작이 가능하다.
참고자료: (비특허문헌 1) 차상길, "소프트웨어 보안과 바이너리 분석", 정보과학회지 제36권 제3호(통권 제346호), pp. 11-16, 2018.
(비특허문헌 2) S. Wang, P. Wang, "Reassembleable Disassembling", in proc. of the USENIX security, 2015.
(비특허문헌 3) R. Wang, Y. Shoshitaishvili, "Ramblr: Making Reassembly Great Again", in proc. of the NDSS, 2017.
첫째, 과거의 심볼화 기반 바이너리 재조립 기술은 기본적으로 계산된 코드 포인터(Calculated code pointer)를 다루지 못한다는 문제점이 있다. 바이너리 실행 이전에는 계산된 코드 포인터의 주소를 정적으로 결정할 수 없기 때문이다. 과거의 비특허문헌 2나 비특허문헌 3의 경우 계산된 코드 포인터를 가지는 PIE바이너리에 적용되기 어려운 한계점을 가지고 있었다. 실제 Ubuntu 18.04 기준 /usr/bin의 98%가 PIE 바이너리이다.
둘째, 과거의 심볼화 기반 바이너리 재조립 기술은 데이터 간접 어드레싱(Data indirect addressing)을 다루지 못한다는 문제점이 있다. PIE 바이너리는 런타임에 결정된 랜덤한 주소에 로드되기 때문에 참조 대상의 절대 주소를 정적으로 명시할 수 없다. 데이터에 접근할 때에도 상대적 계산값으로서 접근하게 되는데, 이 위치는 실행시간에 결정되어 레지스터로 전달되므로 정적으로 예측하기가 힘들기 때문에, 과거 심볼화 방법론만으로는 심볼화가 어렵다는 한계가 있다.
바이너리를 대상으로 정적으로 역어셈블리 후 계측 코드를 삽입 및 재조립하는 방법 및 시스템을 제공할 수 있다. 이에, 본 발명은 최신 바이너리 재조립 기술들이 갖는 두 가지 문제점을 해소할 수 있다.
또한, 느긋한 심볼화를 활용하여 바이너리 재조립 시스템의 효율과 정확성을 높이는 방법 및 시스템을 제공할 수 있다.
바이너리 재조립 시스템에 의해 수행되는 바이너리 재조립 방법은, 바이너리 파일에 역어셈블을 수행함에 따라 역어셈블 코드를 생성하는 단계; 상기 생성된 역어셈블 코드에 상기 역어셈블을 수행함에 따라 계산된 계측 코드를 삽입하여 바이너리 파일을 재조립하는 단계를 포함하고, 상기 바이너리 재조립 방법은, 정적 값 분석(value analysis)과 동적 메모리 계산 방식을 결합한 느긋한 심볼화를 적용할 수 있다.
상기 역어셈블 코드를 생성하는 단계는, 상기 역어셈블을 수행함에 따라 계산된 코드 포인터를 판별 및 분류하고, 상기 역어셈블된 코드 중에서 코드 포인터와 관련된 명령어를 추출하는 단계를 포함할 수 있다.
상기 역어셈블 코드를 생성하는 단계는, 상기 바이너리 파일 중, PIE 바이너리를 선택적 코스 슬라이스 에뮬레이션을 통해 코드 포인터의 주소를 계산하고, 상기 PIE 바이너리에서 실행 주소를 리턴하는 get_pc_thunk 를 기점으로 코드 슬라이스를 선택적으로 추출하고, 상기 선택적으로 추출된 코드 슬라이스를 전처리 과정을 거쳐 계산을 위한 코드 에뮬레이터로 전달하는 단계를 포함할 수 있다.
상기 역어셈블 코드를 생성하는 단계는, 상기 선택적으로 추출된 코드 슬라이스에서 상기 결정 가능한 레지스터 값을 계산하고, 바이너리의 메타데이터와 비교하여 상기 계산된 결정 가능한 레지스터 값이 메모리 참조 값일 경우, 상기 계산된 결정 가능한 레지스터 값을 심볼화하는 단계를 포함할 수 있다.
상기 역어셈블 코드를 생성하는 단계는, 상기 역어셈블 코드를 생성하는 단계에서, 심볼화 여부를 결정할 수 없는 바이너리에 존재하는 연산들에 대하여 심볼화 시점을 바이너리의 런타임까지 늦추는 느긋한 심볼화를 수행하는 단계를 포함할 수 있다.
상기 역어셈블 코드를 생성하는 단계는, 결정적 메모리 정렬 기술에 기반하여 상기 바이너리에 존재하는 SIMD 명령어의 연산 대상 주소를 활용하여 상기 바이너리의 데이터를 정렬하는 단계를 포함하고, 상기 바이너리는 원본 바이너리일 수 있다.
상기 바이너리 파일을 재조립하는 단계는, 상기 역어셈블 코드에 사용자의 기능 및 데이터를 추가한 재작성 코드를 생성하고, 상기 생성된 재작성 코드를 상기 역어셈블 코드에 삽입하여 바이너리 파일을 재조립하는 단계를 포함할 수 있다.
상기 바이너리 재조립 방법은, 상기 바이너리의 런타임 랜덤값에 기초하여 상기 바이너리에 삽입된 느긋한 심볼의 활성화 여부를 결정하고, 상기 런타입 랜덤값에 따라 선택된 심볼을 실행하는 단계를 더 포함할 수 있다.
바이너리 재조립 시스템에 의해 수행되는 바이너리 재조립 방법을 실행시키기 위하여 컴퓨터 판독 가능한 저장매체에 저장된 컴퓨터 프로그램은, 바이너리 파일에 역어셈블을 수행함에 따라 역어셈블 코드를 생성하는 단계; 상기 생성된 역어셈블 코드에 상기 역어셈블을 수행함에 따라 계산된 계측 코드를 삽입하여 바이너리 파일을 재조립하는 단계를 포함하고, 상기 바이너리 재조립 방법은, 정적 값 분석(value analysis)과 동적 메모리 계산 방식을 결합한 하이브리드 형태의 심볼화(symbolization)방식인 느긋한 심볼화를 적용할 수 있다.
바이너리 재조립 시스템은, 바이너리 파일에 역어셈블을 수행함에 따라 역어셈블 코드를 생성하는 역어셈블부; 상기 생성된 역어셈블 코드에 상기 역어셈블을 수행함에 따라 계산된 계측 코드를 삽입하여 바이너리 파일을 재조립하는 재조립부를 포함하고, 상기 바이너리 재조립 시스템은, 정적 값 분석(value analysis)과 동적 메모리 계산 방식을 결합한 하이브리드 형태의 심볼화(symbolization)방식인 느긋한 심볼화를 적용할 수 있다.
상기 역어셈블부는, 상기 역어셈블을 수행함에 따라 계산된 코드 포인터를 판별 및 분류하고, 상기 역어셈블된 코드 중에서 코드 포인터와 관련된 명령어를 추출할 수 있다.
상기 역어셈블부는, 상기 바이너리 파일 중, PIE 바이너리를 선택적 코스 슬라이스 에뮬레이션을 통해 코드 포인터의 주소를 계산하고, 상기 PIE 바이너리에서 실행 주소를 리턴하는 get_pc_thunk 를 기점으로 코드 슬라이스를 선택적으로 추출하고, 상기 선택적으로 추출된 코드 슬라이스를 전처리 과정을 거쳐 계산을 위한 코드 에뮬레이터로 전달하고, 상기 선택적으로 추출된 코드 슬라이스에서 상기 결정 가능한 레지스터 값을 계산하고, 바이너리의 메타데이터와 비교하여 상기 계산된 결정 가능한 레지스터 값이 메모리 참조 값일 경우, 상기 계산된 결정 가능한 레지스터 값을 심볼화할 수 있다.
상기 역어셈블부는, 심볼화 여부를 결정할 수 없는 바이너리에 존재하는 연산들에 대하여 심볼화 시점을 바이너리의 런타임까지 늦추는 느긋한 심볼화를 수행할 수 있다.
상기 역어셈블부는, 결정적 메모리 정렬 기술에 기반하여 상기 바이너리에 존재하는 SIMD 명령어의 연산 대상 주소를 활용하여 상기 바이너리의 데이터를 정렬하는 것을 포함하고 상기 바이너리는 원본 바이너리일 수 있다.
상기 바이너리 재조립 시스템은, 상기 바이너리의 런타임 랜덤값에 기초하여 상기 바이너리에 삽입된 느긋한 심볼의 활성화 여부를 결정하고, 상기 런타입 랜덤값에 따라 선택된 심볼을 실행하는 런타임 심볼부를 더 포함할 수 있다.
느긋한 심볼화를 통하여 과거 일반적인 바이너리에 국한되었던 심볼화 범위를 PIE 바이너리와 라이브러리까지 확장할 수 있다. 이를 통해 소프트웨어 보안과 소프트웨어 테스팅 등의 다른 분야에서 부가적인 효과를 획득할 수 있다.
또한, 느긋한 심볼화를 적용하여 재조립 바이너리의 커버리지와 효율성을 향상시킬 수 있다.
도 1은 일 실시예에 따른 바이너리 재조립 시스템의 동작을 설명하기 위한 도면이다.
도 2는 일 실시예에 따른 바이너리 재조립 시스템에서 느긋한 심볼화를 수행하는 방법을 설명하기 위한 도면이다.
도 3은 일 실시예에 따른 바이너리 재조립 시스템의 구성을 설명하기 위한 블록도이다.
도 4는 일 실시예에 따른 바이너리 재조립 시스템의 느긋한 심볼화를 활용한 바이너리 재조립 방법을 설명하기 위한 흐름도이다.
이하, 실시예를 첨부한 도면을 참조하여 상세히 설명한다.
도 1은 일 실시예에 따른 바이너리 재조립 시스템의 동작을 설명하기 위한 도면이다.
바이너리 재조립 시스템(100)은 바이너리 파일을 입력받아 역어셈블(110)과정과 코드 수정 및 재조립(120) 과정을 수행한 새로운 바이너리 파일을 생성할 수 있다. 바이너리 재조립 시스템(100)은 바이너리 대상을 정적으로 역어셈블한 후, 계측 코드를 삽입 및 재조립할 수 있다. 바이너리 재조립 시스템은 정적 값 분석(value analysis)과 동적 메모리 계산 방식을 결합한 하이브리드 형태의 심볼화(symbolization)방식인 느긋한 심볼화 기술을 적용하여 재조립 바이너리의 커버리지와 효율성을 향상시킬 수 있다.
바이너리 파일 중, PIE 바이너리에서 데이터 참조 시 바이너리의 특정 지점을 기준으로 하는 상대적인 주소를 사용한다. 기준점의 위치는 실행 시 랜덤하게 결정되기 때문에 전위 코드 슬라이스(forward code slice)등 기존의 기술을 활용하더라도 심볼화가 불가능하다. 바이너리 재조립 시스템(100)은 느긋한 심볼화(lazy symbolization) 기술을 통해 심볼화를 수행할 수 있다. 바이너리 재조립 시스템(100)은 역어셈블 코드 중에서 메모리 포인터 관련 명령어(예를 들면, LEA)를 추출할 수 있다. 메모리 포인터 관련 명령어들은 데이터를 접근하기 위한 주소의 계산일 수도 있고, 단순 메모리 계산 명령일수도 있다. 하지만, 단순 메모리 계산 명령과 관련된 메모리 포인터를 심볼화하는 경우 잘못된 데이터 값을 사용하게 되는 문제가 존재하기 때문에 바이너리 재조립 시스템(100)은 동적 계측을 이용하여 두 경우(데이터를 접근하기 위한 주소 정보와 관련된 명령인지, 단순 메모리 계산 명령인지 여부)를 판별할 수 있다. GCC 컴파일러의 경우 메모리 연산의 베이스 메모리 주소로 항상 고정된 위치(예를 들면, GOT)를 사용하는 점에 착안하여 동적으로 베이스 레지스터의 값을 확인하고, 확인된 베이스 레지스터의 값이 알려진 베이스 포인터 값이면 메모리 주소 연산으로 판별할 수 있다. 이후 메모리 관련 명령어들에 대한 동적 계측 코드를 추가적으로 삽입한다. 동적으로 계산된 베이스 주소가 GOT 등의 고정된 위치 값을 갖는 경우에는 심볼화된 인스턴스를 실행하며, 그 외에는 원본 인스턴스를 실행할 수 있다. 심볼화된 인스턴스가 사용할 심볼의 주소를 계산하기 위해 정적으로 베이스 레지스터의 값을 GOT주소라 가정하고 임의의 심볼을 부여한다. 이때 가정이 잘못되었을 경우에도 의미 없는 심볼이 추가될 뿐 코드의 시멘틱을 변화시키지 않기 때문에 재조립된 바이너리는 정상적으로 동작하게 된다.
도 1을 참고하면, 바이너리 재조립 시스템(100)은 역어셈블 과정(110)에서 역어셈블 모듈, 에뮬레이션 모듈 및 심볼화 모듈을 통하여 역어셈블을 수행하는 동작에 대하여 구체적으로 설명하기로 한다.
역어셈블 모듈은 바이너리를 입력받음에 따라 역어셈블 코드를 생성할 수 있다. 이때, 역어셈블 시 계산된 코드 포인터를 판별 및 분류할 뒤 에뮬레이션 모듈로 전달할 수 있다.
에뮬레이션 모듈은 PIE 바이너리의 문제의 경우, 선택적 코스 슬라이스 에뮬레이션을 통해 코드 포인터의 주소를 계산할 수 있다. 선택적 코스 슬라이스 에뮬레이션 기술은 전위 슬라이스(forward slice)를 방식을 이용하여 결정 가능한 레지스터 값(deterministic register value)을 분석하는 것이다. 구체적으로, 선택적 코스 슬라이스 에뮬레이션은 계산된 코드 포인터가 탐지되면, 전위 슬라이스(forward slice)를 방식을 이용해 결정 가능한 레지스터 값에 대하여 인스트럭션을 추출하기 시작한다. 이때, 계산된 코드 포인터가 get_pc_thunk를 이용하여 런타임 메모리 주소를 획득한다는 점에 착안하여, PIE 바이너리에서 실행 주소를 리턴하는 get_pc_thunk를 기점으로 코드 슬라이스를 추출하기 시작하며, 선택적으로 추출된 코드 슬라이스에서 레지스터 실제 값을 평가할 수 있다. 이때, 추출된 코드 슬라이스 중 결정 가능한 레지스터 값들만 계산할 수 있다. 바이너리 메타데이터와 비교하여, 계산된 결정 가능한 레지스터 값이 메모리 참조 값일 경우 계산된 결정 가능한 레지스터 값을 심볼화고, 계산된 결정 가능한 레지스터 값이 메모리 참조 값이 아닐 경우 심볼화하지 않는다. 선택적 코드 슬라이스 에뮬레이션 기술을 통하여 심볼화하지 못했던 계산된 코드 포인트 문제를 해소할 수 있다. 이와 같이 선택적으로 추출된 코드 슬라이스는 전처리 과정을 거쳐 코드 에뮬레이터로(Code emulator)로 전달될 수 있다.
심볼화 모듈은 바이너리의 코드 포인터 주소를 일반 심볼화 또는 느긋한 심볼화를 통하여 심볼화할 수 있다. 이때, 바이너리의 코드 포인터 주소를 미처 정적으로 다 계산되지 못한 심볼들은 느긋한 심볼화 과정을 통해 동적으로 메모리 주소를 해소하는 과정을 수행할 수 있고, 바이너리의 코드 포인터 주소를 계산한 결정 가능한 레지스터 값들은 일반적인 심볼화 방법과 동일한 방법으로 해소한다.
바이너리 재조립 시스템은 심볼화를 수행한 바이너리들에 대하여 결정적 메모리 정렬을 수행할 수 있다. 바이너리 재조립 시스템은 원본 바이너리의 정렬을 최대한 보존하는 결정적 메모리 정렬 기술을 사용하여 코드 정렬의 문제를 해소할 수 있다. 바이너리 재조립 시스템은 원본 바이너리에 존재하는 SIMD 명령어의 연산 대상 주소를 활용하여 바이너리 데이터를 정렬할 수 있다. 이때, 정렬의 크기는 가장 큰 32바이트에서부터 2바이트에 이르기까지 내림차순으로 원본 주소의 정렬 크기를 근사하여 결정할 수 있다. 결정적 메모리 정렬 기술은 정렬이 요구될 가능성이 있는 모든 데이터들을 분류하여 정렬하는 방법으로서, 상대적으로 적은 공간 오버헤드로도 안정적으로 데이터 정렬을 제공할 수 있다.
바이너리 재조립 시스템은 코드 수정과 재조립 과정(120)에서, 재조립이 가능한 형태의 역어셈블 코드에 사용자의 기능 및 데이터 추가함에 따라 새롭게 재조립된 바이너리를 생성할 수 있다. 다시 말해서, 바이너리 재조립 시스템은 역어셈블 코드에 사용자의 기능 및 데이터를 추가한 재작성 코드를 생성하고, 생성된 재작성 코드를 역어셈블 코드에 삽입하여 바이너리 파일을 재조립할 수 있다.
바이너리 재조립 시스템은 런타임 심볼화 과정(130)에서, 바이너리의 런타임 랜덤값에 기초하여 바이너리에 삽입된 느긋한 심볼의 활성화 여부를 결정하고, 런타입 랜덤값에 따라 선택된 심볼을 실행할 수 있다.
도 2는 일 실시예에 따른 바이너리 재조립 시스템에서 느긋한 심볼화를 수행하는 방법을 설명하기 위한 도면이다.
바이너리 재조립 시스템은 역어셈블 과정에서 확실하게 심볼화 여부를 결정할 수 없는 연산들에 대하여, 심볼화 시점을 바이너리 런타임까지 미루어 심볼을 실행할 수 있도록 느긋한 심볼화(210)를 적용할 수 있다.
바이너리 재조립 시스템은 느긋한 심볼화 과정에서 심볼화의 불확실성을 해소하기 위하여 원본 인스턴스(211)와 심볼화된 인스턴스(212)를 포함하는 두 가지 인스턴스를 생성할 수 있다.
바이너리 재조립 시스템은 동적 계측(220) 과정에서, GCC 컴파일러의 경우 메모이 연산의 베이스 메모리 주소로 항상 고정된 위치(예를 들면, GOT)를 사용한다는 점을 착안하여, 동적으로 베이스 레지스터의 값을 확인할 수 있다. 베이스 레지스터의 값이 알려진 베이스 포인트 값일 경우 메모리 주소를 판별할 수 있다. 이때, 동적 계측(220) 과정에서 베이스 레지스터의 값이 알려진 베이스 포인트 값과 비교함에 따라, 비교 결과 일치할 경우 베이스 레지스터 값이 메모리 주소 연산으로 판단되는 경우 심볼화된 인스턴스를 실행(232)할 수 있고, 메모리 주소 연산이 아닌 경우, 원본 인스턴스를 실행(231)한다. 다시 말해서, 베이스 레지스터 값이 베이스 포인트 값일 경우, 심볼화된 인스턴스(232)를 실행하고, 베이스 레지스터 값이 베이스 포인트 값이 아닌 경우, 원본 인스턴스를 실행할 수 있다(231).
도 3은 일 실시예에 따른 바이너리 재조립 시스템의 구성을 설명하기 위한 블록도이고, 도 4는 일 실시예에 따른 바이너리 재조립 시스템의 느긋한 심볼화를 활용한 바이너리 재조립 방법을 설명하기 위한 흐름도이다.
바이너리 재조립 시스템(100)의 프로세서는 역어셈블부(310) 및 재조립부(320)를 포함할 수 있다. 이러한 프로세서의 구성요소들은 적어도 하나의 프로그램 코드에 의해 제공되는 제어 명령에 따라 프로세서에 의해 수행되는 서로 다른 기능들(different functions)의 표현들일 수 있다. 프로세서 및 프로세서의 구성요소들은 도 4의 느긋한 심볼화를 활용한 바이너리 재조립 방법이 포함하는 단계들4210 내지 420)을 수행할 수 있다. 예를 들어, 프로세서 및 프로세서의 구성요소들은 메모리가 포함하는 운영체제의 코드와 상술한 적어도 하나의 프로그램 코드에 따른 명령(instruction)을 실행하도록 구현될 수 있다. 여기서, 적어도 하나의 프로그램 코드는 느긋한 심볼화를 활용한 바이너리 재조립 방법을 처리하기 위해 구현된 프로그램의 코드에 대응될 수 있다. 느긋한 심볼화를 활용한 바이너리 재조립 방법은 도시된 순서대로 발생하지 않을 수 있으며, 단계들 중 일부가 생략되거나 추가의 과정이 더 포함될 수 있다.
프로세서는 느긋한 심볼화를 활용한 바이너리 재조립 방법을 위한 프로그램 파일에 저장된 프로그램 코드를 메모리에 로딩할 수 있다. 이때, 프로세서 및 프로세서가 포함하는 역어셈블부(310) 및 재조립부(320) 각각은 메모리에 로딩된 프로그램 코드 중 대응하는 부분의 명령을 실행하여 이후 단계들(410 내지 420)을 실행하기 위한 프로세서의 서로 다른 기능적 표현들일 수 있다.
단계(410)에서 역어셈블부(310)는 바이너리 파일에 역어셈블을 수행함에 따라 역어셈블 코드를 생성할 수 있다. 역어셈블부(310)는 역어셈블을 수행함에 따라 계산된 코드 포인터를 판별 및 분류하고, 역어셈블된 코드 중에서 코드 포인터와 관련된 명령어를 추출할 수 있다. 역어셈블부(310)는 바이너리 파일 중, PIE 바이너리를 선택적 코스 슬라이스 에뮬레이션을 통해 코드 포인터의 주소를 계산할 수 있다. 역어셈블부(310)는 PIE 바이너리에서 실행 주소를 리턴하는 get_pc_thunk 를 기점으로 코드 슬라이스를 선택적으로 추출하고, 선택적으로 추출된 코드 슬라이스를 전처리 과정을 거쳐 계산을 위한 코드 에뮬레이터로 전달할 수 있다. 역어셈블부(310)는 선택적으로 추출된 코드 슬라이스에서 결정 가능한 레지스터 값을 계산하고, 바이너리의 메타데이터와 비교하여 계산된 결정 가능한 레지스터 값이 메모리 참조 값일 경우, 계산된 결정 가능한 레지스터 값을 심볼화할 수 있다. 역어셈블부(310)는 심볼화 여부를 결정할 수 없는 바이너리에 존재하는 연산들에 대하여 심볼화 시점을 바이너리의 런타임까지 늦추는 느긋한 심볼화를 수행할 수 있다. 역어셈블부(310)는 결정적 메모리 정렬 기술에 기반하여 바이너리에 존재하는 SIMD 명령어의 연산 대상 주소를 활용하여 바이너리의 데이터를 정렬할 수 있다.
단계(420)에서 재조립부(320)는 생성된 역어셈블 코드에 역어셈블을 수행함에 따라 계산된 계측 코드를 삽입하여 바이너리 파일을 재조립할 수 있다. 재조립부(320)는 역어셈블 코드에 사용자의 기능 및 데이터를 추가한 재작성 코드를 생성하고, 생성된 재작성 코드를 역어셈블 코드에 삽입하여 바이너리 파일을 재조립할 수 있다.
또한, 바이너리 재조립 시스템은 바이너리의 런타임 랜덤값에 기초하여 바이너리에 삽입된 느긋한 심볼의 활성화 여부를 결정하고, 런타입 랜덤값에 따라 선택된 심볼을 실행하는 런타임 심볼부(미도시)를 더 포함할 수 있다.
이상에서 설명된 장치는 하드웨어 구성요소, 소프트웨어 구성요소, 및/또는 하드웨어 구성요소 및 소프트웨어 구성요소의 조합으로 구현될 수 있다. 예를 들어, 실시예들에서 설명된 장치 및 구성요소는, 예를 들어, 프로세서, 콘트롤러, ALU(arithmetic logic unit), 디지털 신호 프로세서(digital signal processor), 마이크로컴퓨터, FPGA(field programmable gate array), PLU(programmable logic unit), 마이크로프로세서, 또는 명령(instruction)을 실행하고 응답할 수 있는 다른 어떠한 장치와 같이, 하나 이상의 범용 컴퓨터 또는 특수 목적 컴퓨터를 이용하여 구현될 수 있다. 처리 장치는 운영 체제(OS) 및 상기 운영 체제 상에서 수행되는 하나 이상의 소프트웨어 애플리케이션을 수행할 수 있다. 또한, 처리 장치는 소프트웨어의 실행에 응답하여, 데이터를 접근, 저장, 조작, 처리 및 생성할 수도 있다. 이해의 편의를 위하여, 처리 장치는 하나가 사용되는 것으로 설명된 경우도 있지만, 해당 기술분야에서 통상의 지식을 가진 자는, 처리 장치가 복수 개의 처리 요소(processing element) 및/또는 복수 유형의 처리 요소를 포함할 수 있음을 알 수 있다. 예를 들어, 처리 장치는 복수 개의 프로세서 또는 하나의 프로세서 및 하나의 콘트롤러를 포함할 수 있다. 또한, 병렬 프로세서(parallel processor)와 같은, 다른 처리 구성(processing configuration)도 가능하다.
소프트웨어는 컴퓨터 프로그램(computer program), 코드(code), 명령(instruction), 또는 이들 중 하나 이상의 조합을 포함할 수 있으며, 원하는 대로 동작하도록 처리 장치를 구성하거나 독립적으로 또는 결합적으로(collectively) 처리 장치를 명령할 수 있다. 소프트웨어 및/또는 데이터는, 처리 장치에 의하여 해석되거나 처리 장치에 명령 또는 데이터를 제공하기 위하여, 어떤 유형의 기계, 구성요소(component), 물리적 장치, 가상 장치(virtual equipment), 컴퓨터 저장 매체 또는 장치에 구체화(embody)될 수 있다. 소프트웨어는 네트워크로 연결된 컴퓨터 시스템 상에 분산되어서, 분산된 방법으로 저장되거나 실행될 수도 있다. 소프트웨어 및 데이터는 하나 이상의 컴퓨터 판독 가능 기록 매체에 저장될 수 있다.
실시예에 따른 방법은 다양한 컴퓨터 수단을 통하여 수행될 수 있는 프로그램 명령 형태로 구현되어 컴퓨터 판독 가능 매체에 기록될 수 있다. 상기 컴퓨터 판독 가능 매체는 프로그램 명령, 데이터 파일, 데이터 구조 등을 단독으로 또는 조합하여 포함할 수 있다. 상기 매체에 기록되는 프로그램 명령은 실시예를 위하여 특별히 설계되고 구성된 것들이거나 컴퓨터 소프트웨어 당업자에게 공지되어 사용 가능한 것일 수도 있다. 컴퓨터 판독 가능 기록 매체의 예에는 하드 디스크, 플로피 디스크 및 자기 테이프와 같은 자기 매체(magnetic media), CD-ROM, DVD와 같은 광기록 매체(optical media), 플롭티컬 디스크(floptical disk)와 같은 자기-광 매체(magneto-optical media), 및 롬(ROM), 램(RAM), 플래시 메모리 등과 같은 프로그램 명령을 저장하고 수행하도록 특별히 구성된 하드웨어 장치가 포함된다. 프로그램 명령의 예에는 컴파일러에 의해 만들어지는 것과 같은 기계어 코드뿐만 아니라 인터프리터 등을 사용해서 컴퓨터에 의해서 실행될 수 있는 고급 언어 코드를 포함한다.
이상과 같이 실시예들이 비록 한정된 실시예와 도면에 의해 설명되었으나, 해당 기술분야에서 통상의 지식을 가진 자라면 상기의 기재로부터 다양한 수정 및 변형이 가능하다. 예를 들어, 설명된 기술들이 설명된 방법과 다른 순서로 수행되거나, 및/또는 설명된 시스템, 구조, 장치, 회로 등의 구성요소들이 설명된 방법과 다른 형태로 결합 또는 조합되거나, 다른 구성요소 또는 균등물에 의하여 대치되거나 치환되더라도 적절한 결과가 달성될 수 있다.
그러므로, 다른 구현들, 다른 실시예들 및 특허청구범위와 균등한 것들도 후술하는 특허청구범위의 범위에 속한다.

Claims (15)

  1. 바이너리 재조립 시스템에 의해 수행되는 바이너리 재조립 방법에 있어서,
    바이너리 파일에 역어셈블을 수행함에 따라 역어셈블 코드를 생성하는 단계;
    상기 생성된 역어셈블 코드에 상기 역어셈블을 수행함에 따라 계산된 계측 코드를 삽입하여 바이너리 파일을 재조립하는 단계
    를 포함하고,
    상기 바이너리 재조립 방법은,
    정적 값 분석(value analysis)과 동적 메모리 계산 방식을 결합한 느긋한 심볼화를 적용한
    것을 특징으로 하는 바이너리 재조립 방법.
  2. 제1항에 있어서,
    상기 역어셈블 코드를 생성하는 단계는,
    상기 역어셈블을 수행함에 따라 계산된 코드 포인터를 판별 및 분류하고, 상기 역어셈블된 코드 중에서 코드 포인터와 관련된 명령어를 추출하는 단계
    를 포함하는 바이너리 재조립 방법.
  3. 제1항에 있어서,
    상기 역어셈블 코드를 생성하는 단계는,
    상기 바이너리 파일 중, PIE 바이너리를 선택적 코스 슬라이스 에뮬레이션을 통해 코드 포인터의 주소를 계산하고, 상기 PIE 바이너리에서 실행 주소를 리턴하는 get_pc_thunk 를 기점으로 코드 슬라이스를 선택적으로 추출하고, 상기 선택적으로 추출된 코드 슬라이스를 전처리 과정을 거쳐 계산을 위한 코드 에뮬레이터로 전달하는 단계
    를 포함하는 바이너리 재조립 방법.
  4. 제3항에 있어서,
    상기 역어셈블 코드를 생성하는 단계는,
    상기 선택적으로 추출된 코드 슬라이스에서 결정 가능한 레지스터 값을 계산하고, 바이너리의 메타데이터와 비교하여 상기 계산된 결정 가능한 레지스터 값이 메모리 참조 값일 경우, 상기 계산된 결정 가능한 레지스터 값을 심볼화하는 단계
    를 포함하는 바이너리 재조립 방법.
  5. 제1항에 있어서,
    상기 역어셈블 코드를 생성하는 단계는,
    상기 역어셈블 코드를 생성하는 단계에서, 심볼화 여부를 결정할 수 없는 바이너리에 존재하는 연산들에 대하여 심볼화 시점을 바이너리의 런타임까지 늦추는 느긋한 심볼화를 수행하는 단계
    를 포함하는 바이너리 재조립 방법.
  6. 제1항에 있어서,
    상기 역어셈블 코드를 생성하는 단계는,
    결정적 메모리 정렬 기술에 기반하여 상기 바이너리에 존재하는 SIMD 명령어의 연산 대상 주소를 활용하여 상기 바이너리의 데이터를 정렬하는 단계
    를 포함하고,
    상기 바이너리는 원본 바이너리인, 바이너리 재조립 방법.
  7. 제1항에 있어서,
    상기 바이너리 파일을 재조립하는 단계는,
    상기 역어셈블 코드에 사용자의 기능 및 데이터를 추가한 재작성 코드를 생성하고, 상기 생성된 재작성 코드를 상기 역어셈블 코드에 삽입하여 바이너리 파일을 재조립하는 단계
    를 포함하는 바이너리 재조립 방법.
  8. 제1항에 있어서,
    상기 바이너리의 런타임 랜덤값에 기초하여 상기 바이너리에 삽입된 느긋한 심볼의 활성화 여부를 결정하고, 상기 런타임 랜덤값에 따라 선택된 심볼을 실행하는 단계
    를 더 포함하는 바이너리 재조립 방법.
  9. 바이너리 재조립 시스템에 의해 수행되는 바이너리 재조립 방법을 실행시키기 위하여 컴퓨터 판독 가능한 저장매체에 저장된 컴퓨터 프로그램에 있어서,
    바이너리 파일에 역어셈블을 수행함에 따라 역어셈블 코드를 생성하는 단계;
    상기 생성된 역어셈블 코드에 상기 역어셈블을 수행함에 따라 계산된 계측 코드를 삽입하여 바이너리 파일을 재조립하는 단계
    를 포함하고,
    상기 바이너리 재조립 방법은,
    정적 값 분석(value analysis)과 동적 메모리 계산 방식을 결합한 느긋한 심볼화를 적용한
    것을 특징으로 하는 컴퓨터 판독 가능한 저장매체에 저장된 컴퓨터 프로그램.
  10. 바이너리 재조립 시스템에 있어서,
    바이너리 파일에 역어셈블을 수행함에 따라 역어셈블 코드를 생성하는 역어셈블부;
    상기 생성된 역어셈블 코드에 상기 역어셈블을 수행함에 따라 계산된 계측 코드를 삽입하여 바이너리 파일을 재조립하는 재조립부
    를 포함하고,
    상기 바이너리 재조립 시스템은,
    정적 값 분석(value analysis)과 동적 메모리 계산 방식을 결합한 느긋한 심볼화를 적용한
    것을 특징으로 하는 바이너리 재조립 시스템.
  11. 제10항에 있어서,
    상기 역어셈블부는,
    상기 역어셈블을 수행함에 따라 계산된 코드 포인터를 판별 및 분류하고, 상기 역어셈블된 코드 중에서 코드 포인터와 관련된 명령어를 추출하는
    것을 특징으로 하는 바이너리 재조립 시스템.
  12. 제10항에 있어서,
    상기 역어셈블부는,
    상기 바이너리 파일 중, PIE 바이너리를 선택적 코스 슬라이스 에뮬레이션을 통해 코드 포인터의 주소를 계산하고, 상기 PIE 바이너리에서 실행 주소를 리턴하는 get_pc_thunk 를 기점으로 코드 슬라이스를 선택적으로 추출하고, 상기 선택적으로 추출된 코드 슬라이스를 전처리 과정을 거쳐 계산을 위한 코드 에뮬레이터로 전달하고, 상기 선택적으로 추출된 코드 슬라이스에서 결정 가능한 레지스터 값을 계산하고, 바이너리의 메타데이터와 비교하여 상기 계산된 결정 가능한 레지스터 값이 메모리 참조 값일 경우, 상기 계산된 결정 가능한 레지스터 값을 심볼화하는
    것을 특징으로 하는 바이너리 재조립 시스템.
  13. 제10항에 있어서,
    상기 역어셈블부는,
    심볼화 여부를 결정할 수 없는 바이너리에 존재하는 연산들에 대하여 심볼화 시점을 바이너리의 런타임까지 늦추는 느긋한 심볼화를 수행하는
    것을 특징으로 하는 바이너리 재조립 시스템.
  14. 제13항에 있어서,
    상기 역어셈블부는,
    결정적 메모리 정렬 기술에 기반하여 상기 바이너리에 존재하는 SIMD 명령어의 연산 대상 주소를 활용하여 상기 바이너리의 데이터를 정렬하는 것을 포함하고,
    를 포함하고,
    상기 바이너리는 원본 바이너리인, 바이너리 재조립 시스템.
  15. 제10항에 있어서,
    상기 바이너리의 런타임 랜덤값에 기초하여 상기 바이너리에 삽입된 느긋한 심볼의 활성화 여부를 결정하고, 상기 런타임 랜덤값에 따라 선택된 심볼을 실행하는 런타임 심볼부
    를 더 포함하는 바이너리 재조립 시스템.
KR1020190003090A 2019-01-10 2019-01-10 느긋한 심볼화를 활용한 바이너리 재조립 기술의 정확도 향상 기술 및 도구 KR102104198B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020190003090A KR102104198B1 (ko) 2019-01-10 2019-01-10 느긋한 심볼화를 활용한 바이너리 재조립 기술의 정확도 향상 기술 및 도구

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020190003090A KR102104198B1 (ko) 2019-01-10 2019-01-10 느긋한 심볼화를 활용한 바이너리 재조립 기술의 정확도 향상 기술 및 도구

Publications (1)

Publication Number Publication Date
KR102104198B1 true KR102104198B1 (ko) 2020-05-29

Family

ID=70912168

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020190003090A KR102104198B1 (ko) 2019-01-10 2019-01-10 느긋한 심볼화를 활용한 바이너리 재조립 기술의 정확도 향상 기술 및 도구

Country Status (1)

Country Link
KR (1) KR102104198B1 (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116501378A (zh) * 2023-06-27 2023-07-28 武汉大数据产业发展有限公司 一种逆向工程还原源代码的实现方法、装置和电子设备

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20070088818A (ko) * 1999-02-05 2007-08-29 텐실리카 인코포레이티드 구성가능한 프로세서를 설계하기 위한 프로세서 자동 생성시스템 및 방법
KR20120093564A (ko) * 2011-02-15 2012-08-23 주식회사 안랩 벡터량 산출을 이용한 악성코드의 분류 및 진단 방법과 장치
JP2014510960A (ja) * 2011-01-19 2014-05-01 アルゴトゥチップ コーポレーション ツール・ジェネレータ
KR20180057316A (ko) * 2016-11-22 2018-05-30 한국과학기술원 교차 역어셈블 장치 및 이를 이용한 역어셈블 방법

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20070088818A (ko) * 1999-02-05 2007-08-29 텐실리카 인코포레이티드 구성가능한 프로세서를 설계하기 위한 프로세서 자동 생성시스템 및 방법
JP2014510960A (ja) * 2011-01-19 2014-05-01 アルゴトゥチップ コーポレーション ツール・ジェネレータ
KR20120093564A (ko) * 2011-02-15 2012-08-23 주식회사 안랩 벡터량 산출을 이용한 악성코드의 분류 및 진단 방법과 장치
KR20180057316A (ko) * 2016-11-22 2018-05-30 한국과학기술원 교차 역어셈블 장치 및 이를 이용한 역어셈블 방법

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116501378A (zh) * 2023-06-27 2023-07-28 武汉大数据产业发展有限公司 一种逆向工程还原源代码的实现方法、装置和电子设备
CN116501378B (zh) * 2023-06-27 2023-09-12 武汉大数据产业发展有限公司 一种逆向工程还原源代码的实现方法、装置和电子设备

Similar Documents

Publication Publication Date Title
EP3518098B1 (en) Cross platform content management and distribution system
CN101964036B (zh) 漏洞检测方法及装置
Henderson et al. Decaf: A platform-neutral whole-system dynamic binary analysis platform
US20050108562A1 (en) Technique for detecting executable malicious code using a combination of static and dynamic analyses
Shi et al. Cardinal pill testing of system virtual machines
Brooks Survey of automated vulnerability detection and exploit generation techniques in cyber reasoning systems
CN103793651B (zh) 基于Xen虚拟化的内核完整性检测方法
Shi et al. Handling anti-virtual machine techniques in malicious software
US20220107827A1 (en) Applying security mitigation measures for stack corruption exploitation in intermediate code files
Otsuki et al. Building stack traces from memory dump of Windows x64
US20210150028A1 (en) Method of defending against memory sharing-based side-channel attacks by embedding random value in binaries
KR20190037895A (ko) 바이너리 파일에 기초하여 오픈소스 소프트웨어 패키지를 식별하는 방법 및 시스템
KR102104198B1 (ko) 느긋한 심볼화를 활용한 바이너리 재조립 기술의 정확도 향상 기술 및 도구
Zhou et al. Hardware-based on-line intrusion detection via system call routine fingerprinting
EP4109310B1 (en) Iterative memory analysis for malware detection
US9678886B2 (en) Processing page fault exceptions in supervisory software when accessing strings and similar data structures using normal load instructions
Korkin Two challenges of stealthy hypervisors detection: Time cheating and data fluctuations
KR101995176B1 (ko) 프로그램 실행 컨텍스트 기반의 빅데이터를 활용한 역공학 방법 및 시스템
Stepan Defeating polymorphism: beyond emulation
KR102507189B1 (ko) 멜트다운 취약점을 이용한 인공신경망 추출 방법
CN106372508B (zh) 恶意文档的处理方法及装置
Alonso et al. Validation, Verification, and Testing (VVT) of future RISC-V powered cloud infrastructures: the Vitamin-V Horizon Europe Project perspective
US11550574B2 (en) Generating a vector predicate summary
KR101824583B1 (ko) 커널 자료구조 특성에 기반한 악성코드 탐지 시스템 및 그의 제어 방법
Nep et al. A research on countering virtual machine evasion techniques of malware in dynamic analysis

Legal Events

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