Skip to main content
QUICK REVIEW

[논문 리뷰] Augmenting Decompiler Output with Learned Variable Names and Types

Qibin Chen, Jeremy Lacomis|arXiv (Cornell University)|2021. 08. 13.
Software Engineering Research참고 문헌 57인용 수 11
한 줄 요약

이 논문은 인간이 작성한 C 코드의 통계적 모델링을 통해 자동으로 의미 있는 변수 이름과 타입을 예측함으로써 디컴파일러 출력을 향상시키는 딥러닝 접근법인 DIRTY를 소개한다. 대규모 GitHub 데이터셋으로 훈련된 DIRTY는 원래 변수 이름을 복구하는 데 66.4%의 정확도와 원래 타입을 복구하는 데 75.8%의 정확도를 기록하며, 코드 구조와 이름 규칙의 문맥적 패턴을 활용함으로써 이전 방법들보다 유의미하게 뛰어난 성능을 보인다.

ABSTRACT

A common tool used by security professionals for reverse-engineering binaries found in the wild is the decompiler. A decompiler attempts to reverse compilation, transforming a binary to a higher-level language such as C. High-level languages ease reasoning about programs by providing useful abstractions such as loops, typed variables, and comments, but these abstractions are lost during compilation. Decompilers are able to deterministically reconstruct structural properties of code, but comments, variable names, and custom variable types are technically impossible to recover. In this paper we present DIRTY (DecompIled variable ReTYper), a novel technique for improving the quality of decompiler output that automatically generates meaningful variable names and types. Empirical evaluation on a novel dataset of C code mined from GitHub shows that DIRTY outperforms prior work approaches by a sizable margin, recovering the original names written by developers 66.4% of the time and the original types 75.8% of the time.

연구 동기 및 목표

  • 디컴파일러 출력에서 의미 있는 변수 이름과 타입이 부족하여 리버스 엔지니어링과 프로그램 이해가 어려운 문제를 해결하기 위해.
  • 인간이 작성한 C 코드의 패턴을 모델링하여 잃어버린 고수준 추상화—특히 변수 이름과 타입—을 복구하기 위해.
  • 의미 있는 식별자와 타입 주석을 생성함으로써 디컴파일된 바이너리의 가독성과 이해 가능성을 향상시키기 위해.
  • 컴파일 과정에서 정보 손실로 인해 원래 이름이나 사용자 정의 타입을 복구할 수 없는 결정론적 디컴파일링의 한계를 극복하기 위해.
  • 실제 세계의 C 프로그램으로 구성된 새로운 대규모 데이터셋을 활용하여 학습된 이름 및 타입 예측의 효과를 평가하기 위해.

제안 방법

  • DIRTY는 GitHub에서 추출한 대규모 C 코드 데이터셋으로 훈련된 트랜스포머 기반의 시퀀스 투 시퀀스 모델을 사용하여 디컴파일된 함수 텍스트에서 변수 이름과 타입을 예측한다.
  • 모델은 변수 사용 패턴, 함수 서명, 데이터 레이아웃 등을 포함한 주변 코드 구조의 문맥적 정보를 활용하여 가능성이 높은 이름과 타입을 유추한다.
  • 타입 예측을 위해 메모리 레이아웃 제약 조건을 고려하며, OOV(Out-of-Vocabulary) 타입을 처리하기 위해 BPE(바이트 페어 인코딩) 토크나이저 전략을 사용하지만, 초도 실험 결과 이는 정확도를 낮추고 추론 시간을 증가시켰다.
  • 실제 코드에서 반복적이고 문맥적으로 일관된 이름 규칙을 학습함으로써 이름과 타입 예측 패턴을 모델링하여, 구조적으로 유사하지만 본 적 없는 변수들에도 일반화할 수 있도록 한다.
  • 입력은 디컴파일된 C 유사 코드이고 출력은 각 변수에 대한 예측된 이름과 타입인, 디컴파일된 함수 텍스트에서 모델을 피지컬 튜닝한다.
  • 희귀하거나 알려지지 않은 타입을 다루기 위해 복합 타입의 BPE 기반 분해를 탐색하지만, 이는 커버리지와 성능 사이의 상충 관계로 간주된다.

실험 결과

연구 질문

  • RQ1원본 소스가 없을 경우 학습된 모델이 디컴파일된 C 코드에서 원래 변수 이름을 효과적으로 복구할 수 있는가?
  • RQ2딥러닝 모델이 코드의 문맥과 메모리 레이아웃을 기반으로 얼마나 정확하게 타입을 추론할 수 있는가?
  • RQ3DIRTY의 성능은 기존 최고 수준의 접근법과 비교해 어떻게 되는가?
  • RQ4BPE 기반 토크나이징은 디컴파일된 코드에서 희귀하거나 복잡한 타입을 예측하는 데 어떤 영향을 미치는가?
  • RQ5디컴파일된 C 코드에서 C++ 클래스와 같은 고수준 언어 구조를 다룰 때 DIRTY는 비-C 프로그램으로 일반화 가능한가, 그리고 얼마나 잘 작동하는가?

주요 결과

  • DIRTY는 디컴파일된 함수의 검증 세트에서 개발자가 사용한 원래 변수 이름을 66.4%의 정확도로 복구한다.
  • 모델은 원래 변수 타입을 복구하는 데 75.8%의 정확도를 기록하며, 이는 이전 방법들보다 유의미하게 뛰어나다.
  • 실증적 평가 결과 DIRTY의 성능는 다양한 코드베이스에서 안정적이며, 알려지지 않은 함수와 변수 패턴으로의 일반화 능력이 뛰어나다.
  • BPE를 사용한 타입 분해는 희귀 타입의 커버리지를 향상시켰지만 전체 예측 정확도를 낮추고 추론 시간을 증가시켜 설계에서의 상충 관계를 보여준다.
  • DIRTY는 std::string과 같은 C++ 관련 타입에서도 뛰어난 성능을 보이며, C로 디컴파일된 경우 고수준 언어 구조에 대해 부분적인 지원을 제공함을 시사한다.
  • 입력 길이 제약으로 인해 모델의 효과성이 제한되지만, 기준 길이인 512토큰을 초과하는 함수는 전체의 8.8%에 불과하여 실질적인 데이터 손실은 최소한이다.

더 나은 연구,지금 바로 시작하세요

논문 읽기부터 검토까지, 연구 시간을 획기적으로 줄여보세요.

카드 등록 없음 · 무료 플랜 제공

이 리뷰는 AI가 만들고, 인간 에디터가 검토했습니다.