Skip to main content
QUICK REVIEW

[논문 리뷰] Towards Neural Decompilation

Omer Katz, Yuval Olshaker|arXiv (Cornell University)|2019. 05. 20.
Adversarial Robustness in Machine Learning참고 문헌 28인용 수 8
한 줄 요약

이 논문은 신경 기계 번역(NMT) 기반 접근법을 통해 자동 디컴파일링을 제안한다. 컴파일러의 정방향 번역(LLVM IR 또는 x86 어셈블리어에서 인간이 읽을 수 있는 C 코드로의 변환)을 기반으로 디컴파일러를 훈련시키며, 이는 핸드크래ft된 규칙 대신 학습된 패tern을 활용함으로써 기존의 룰 기반 시스템보다 훨씬 뛰어난 성능을 보인다. 성능 평가 결과, LLVM 기준으로 97%, x86 기준으로 88%의 성공률을 기록하였다.

ABSTRACT

We address the problem of automatic decompilation, converting a program in low-level representation back to a higher-level human-readable programming language. The problem of decompilation is extremely important for security researchers. Finding vulnerabilities and understanding how malware operates is much easier when done over source code. The importance of decompilation has motivated the construction of hand-crafted rule-based decompilers. Such decompilers have been designed by experts to detect specific control-flow structures and idioms in low-level code and lift them to source level. The cost of supporting additional languages or new language features in these models is very high. We present a novel approach to decompilation based on neural machine translation. The main idea is to automatically learn a decompiler from a given compiler. Given a compiler from a source language S to a target language T , our approach automatically trains a decompiler that can translate (decompile) T back to S . We used our framework to decompile both LLVM IR and x86 assembly to C code with high success rates. Using our LLVM and x86 instantiations, we were able to successfully decompile over 97% and 88% of our benchmarks respectively.

연구 동기 및 목표

  • 각 새로운 언어나 기능을 위해 전문가의 개입이 필요한 기존 룰 기반 디컴파일러의 높은 비용과 유연성 부족 문제를 해결하기 위해.
  • 기존 컴파일러로부터 어떤 디컴파일러도 자동으로 생성할 수 있도록 하여 디컴파일러 개발의 수동 작업을 줄이기 위해.
  • 과도한 goto 문이나 저수준 구조를 사용하지 않고 의미적으로 동일한, 인간이 읽을 수 있는 C 코드를 생성함으로써 디컴파일된 코드의 품질을 향상시키기 위해.
  • 기존 신경 디컴파일링 접근법이 도메인 특화 지식이 부족하여 원본 코드와 컴iles되지 않거나 의미적으로 일치하지 않는 문제를 극복하기 위해.

제안 방법

  • 프레임워크는 두 단계 방식을 사용한다: 첫 번째 단계에서는 변수나 상수 할당 없이 제어 흐름과 구문 구조를 유지하는 구조적 코드 템플릿을 생성한다.
  • 두 번째 단계에서는 컴파일러가 생성한 소스 코드에서 어셈블리어로의 쌍을 기반으로 훈련된 신경 시퀀스 투 시퀀스 모델을 사용해 실제 값으로 템플릿을 채운다.
  • 컴파일러의 정방향 번역을 활용하여 역방향 매핑을 암묵적으로 학습함으로써, 직접적인 디컴파일링 감독 없이도 엔드 투 엔드로 디컴파일러를 훈련시킬 수 있다.
  • 도메인 특화 지식은 컴파일러 최적화된 의미적으로 동일한 코드 쌍을 사용하여 통합되며, 일반화 능력과 정확도를 향상시킨다.
  • 모델은 신경 기계 번역과 유사한 어텐션 메커니즘을 갖춘 시퀀스 투 시퀀스 신경망을 사용하며, 프로그래밍 언어의 구문과 의미에 맞게 조정된다.
  • 훈련 데이터는 컴파일러 출력물에서 구성되며, 훈련 세트와 테스트 세트 간에 겹침이 없으며, 복잡한 다중 문장 프로그램까지 포함된 벤치마크는 최대 668개의 입력 토큰을 포함한다.

실험 결과

연구 질문

  • RQ1높은 정확도로 저수준 코드를 고수준 소스 코드로 디컴파일하는 데 있어 신경 기계 번역 모델을 효과적으로 적용할 수 있는가?
  • RQ2컴파일러의 정방향 번역에서만 학습함으로써 수작업 규칙이 필요 없는 디컴파일러를 자동으로 학습시킬 수 있는가?
  • RQ3컴파일러 최적화된 코드에서 유래한 도메인 지식을 통합하면 디컴파일된 출력의 품질과 컴파일 시간 정확도가 향상되는가?
  • RQ4복잡한 실세계 코드 스니펫에 대해 신경 디컴파일러의 성능이 기존 룰 기반 디컴파일러와 비교해 어떻게 되는가?
  • RQ5동일한 훈련 파라다임을 사용하여 LLVM IR 및 x86 어셈블리어와 같은 다양한 저수준 표현 간에 일반화가 가능한가?

주요 결과

  • 프레임워크는 다양한 테스트 케이스를 대상으로 97%의 성공률로 LLVM IR 벤치마크를 의미적으로 동일한 C 코드로 디컴파일하는 데 성공하여 높은 정확도를 입증하였다.
  • x86 어셈블리어의 경우 88%의 성공률을 기록하였으며, 이는 이전 신경 접근법이 컴파일이나 정확도 문제로 어려움을 겪었던 것과는 대조적으로 뚜렷한 성능 향상을 보였다.
  • 모델은 goto 문을 포함하지 않고 고수준 언어 구조를 사용한 디컴파일된 코드를 생성하여 기존 디컴파일러보다 더 읽기 쉽게, 재컴파일 가능하게 만들었다.
  • 컴파일러가 생성한 쌍에서 학습함으로써 전문가가 수작업으로 규칙을 정의하는 것의 필요성을 제거하여 새로운 언어나 타겟에 빠르게 적응할 수 있도록 하였다.
  • 엄격한 훈련-테스트 분리로 인한 데이터 泄露를 방지하고 도메인 특화 지식을 통합함으로써 이전의 신경 디컴파일링 방법보다 우수한 성능을 보였다.
  • 이전 연구가 단일 문장에 국한된 것과는 달리, 이 방법은 최대 668개의 입력 토큰과 177개의 출력 토큰을 처리하는 복잡한 프로그램도 성공적으로 처리하였다.

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

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

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

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