[논문 리뷰] Improving type information inferred by decompilers with supervised machine learning
이 논문은 대규모 C 소스 코드 및 해당 바이너리 데이터셋을 기반으로 학습한 지도 학습 기반 접근법을 제안하여 디컴파일러의 타입 추론을 향상시킨다. 코드를 인스트루멘테이션하여 바이너리 패턴에 고수준 타입 정보를 레이블링함으로써, 시스템은 함수의 반환 타입을 예측하는 데 79.1%의 F1 스코어를 달성하였으며, 기존 디컴파일러의 30% F1 스코어를 크게 뛰어넘었고, 디컴파일러 통합을 위한 실행 가능한 바이너리 패턴을 문서화하였다.
In software reverse engineering, decompilation is the process of recovering source code from binary files. Decompilers are used when it is necessary to understand or analyze software for which the source code is not available. Although existing decompilers commonly obtain source code with the same behavior as the binaries, that source code is usually hard to interpret and certainly differs from the original code written by the programmer. Massive codebases could be used to build supervised machine learning models aimed at improving existing decompilers. In this article, we build different classification models capable of inferring the high-level type returned by functions, with significantly higher accuracy than existing decompilers. We automatically instrument C source code to allow the association of binary patterns with their corresponding high-level constructs. A dataset is created with a collection of real open-source applications plus a huge number of synthetic programs. Our system is able to predict function return types with a 79.1% F1-measure, whereas the best decompiler obtains a 30% F1-measure. Moreover, we document the binary patterns used by our classifier to allow their addition in the implementation of existing decompilers.
연구 동기 및 목표
- 디컴파일러가 추론하는 타입 정보의 정확도를 향상시키며, 특히 함수의 반환 타입에 중점을 둔다.
- 컴파일러 최적화로 인해 손실이 발생하는 바이너리 코드에서 고수준 타입 의미를 복원하는 데 도전한다.
- 기계 학습 모델을 훈련하기 위한 대규모, 레이블이 부여된 바이너리 패턴과 고수준 타입 정보의 쌍을 포함한 데이터셋을 구축한다.
- 크기와 표현 방식이 동일한 타입을 구분할 수 있는 재사용 가능한 바이너리 패턴을 식별하고 문서화한다.
- 학습된 패턴을 기존 디컴파일러에 통합하여 그들의 역방향 엔지니어링 능력을 향상시키는 것을 가능하게 한다.
제안 방법
- C 소스 코드를 인스트루멘테이션하여 바이너리 기계어 패턴과 int, float, bool, struct와 같은 고수준 타입 구성요소를 연관시킨다.
- 32비트 윈도우용 Microsoft Visual C++로 컴iles된 실제 오픈소스 C 애플리케이션과 합성 프로그램을 조합하여 데이터셋을 생성한다.
- 특히 기울기 부스팅을 포함한 여러 지도 학습 분류 모델을 바이너리 옵코드 시퀀스와 후기 호출 지시어 패턴에 대해 훈련하여 반환 타입을 예측한다.
- 특징 공학을 통해 값이 호출자에게 어떻게 전달되는지를 코딩하는 RET(반환) 및 POST CALL(후기 호출) 패턴을 추출한다.
- 규칙 기반 패턴 추출을 적용하여 특정 타입과 대응하는 고신뢰도의 특정 바이너리 지시어 시퀀스를 식별한다.
- 학습 데이터 외부의 코드에 대해 모델을 검증하여 훈련 데이터를 초월한 일반화 능력을 확보하며, F1 스코어를 주요 평가 지표로 사용한다.
실험 결과
연구 질문
- RQ1지속적인 최신 기술 수준의 도구를 뛰어넘어, 지도 학습 기반 기술이 디컴파일러의 함수 반환 타입 추론 정확도를 향상시킬 수 있는가?
- RQ2int, float, bool, struct와 같은 구체적인 고수준 타입과 관련된 특정 바이너리 옵코드 패턴은 무엇인가?
- RQ3RET 및 POST CALL 지시어 패턴은 같은 크기와 표현 방식을 공유하는 타입을 어떻게 구분하는가?
- RQ4학습된 패턴은 일반화되고 재사용되어 기존 디컴파일러의 성능을 향상시킬 수 있는가?
- RQ5특히 동일한 바이너리 크기와 표현 방식을 공유하는 타입 간에 모델 성능은 어떻게 달라지는가?
주요 결과
- 제안된 시스템은 테스트되지 않은 코드에서 함수의 반환 타입을 예측하는 데 79.1%의 F1 스코어를 달성하였으며, 기존 최고 수준의 디컴파일러가 달성한 30% F1 스코어를 크게 뛰어넘었다.
- 기울기 부스팅은 이 작업에 가장 효과적인 분류 알고리즘이었으며, 랜덤 포레스트나 XGBoost와 같은 다른 모델들을 능가했다.
- 시스템은 float과 double, 또는 bool과 int를 구분할 수 있는 고신뢰도 바이너리 패턴—특정 옵코드 시퀀스와 후기 호출 지시어 사용 방식—을 식별하였다.
- RET 및 POST CALL 패턴을 결합함으로써 분류 신뢰도가 향상되었으며, 한 규칙은 두 시퀀스를 모두 통합함으로써 100%의 신뢰도를 달성하였다.
- 이 방법은 마이크로소프트 C 컴파일러가 사용하는 코드 생성 템플릿—예를 들어, 구조체를 포인터로 반환하거나 비교 결과를 정수로 반환하는 방식—을 성공적으로 식별하고 문서화하였다.
- 데이터셋과 패턴은 공개되어 있어 기존 디컴파일러에 직접 통합되어 타입 추론 성능을 향상시킬 수 있다.
더 나은 연구,지금 바로 시작하세요
논문 읽기부터 검토까지, 연구 시간을 획기적으로 줄여보세요.
카드 등록 없음 · 무료 플랜 제공
이 리뷰는 AI가 만들고, 인간 에디터가 검토했습니다.