LLM4Decompile, LLM을 활용한 바이너리 디컴파일(decompile)에 대한 연구

:pytorch:PyTorchKR:kr:: C/C++ 등과 같은 컴파일 언어들은 컴파일 과정을 통해 사람이 작성한 소스 코드를 기계어로 이뤄진 바이너리로 변환합니다. LLM으로 사람이 작성한 주석 또는 언어로 코드를 작성할 수 있다면, 반대로 컴파일된 바이너리를 소스 코드로 변환할 수도 있지 않을까? 하는 아이디어로 시작한 것 같은 LLM4Decompile을 소개합니다. :astonished:


LLM4Decompile, LLM을 활용한 바이너리 디컴파일에 대한 연구 (LLM4Decompile: Decompiling Binary Code with Large Language Models)

소개

디컴파일(decompile)은 컴파일된 기계 코드 또는 바이트 코드를 고급 프로그래밍 언어로 변환하는 과정으로, 원본 소스 코드에 접근할 수 없을 때 소프트웨어의 작동 방식을 분석하는 데 종종 사용됩니다. Ghidra 및 IDA Pro와 같은 디컴파일을 위한 도구들이 있음에도 불구하고, 변수 이름과 같은 더 세부적인 부분을 정확하게 복원하는 것은 여전히 어렵습니다. LLM을 프로그래밍 작업에 적용한 최근의 진전은 전통적인 방법보다 상당한 개선을 보였습니다. 이 논문은 디컴파일 작업에 LLM의 잠재력을 활용하여, 디컴파일 작업에 특화된 첫 번째 공개 소스 LLM을 개발하고 새로운 데이터셋, Decompile-Eval을 통한 재컴파일 가능성과 재실행 가능성 평가를 제안합니다. LLM4Decompile은 어셈블리 코드를 정확하게 디컴파일하는 데 있어 GPT-4보다 50% 향상된 성능을 보여주며 기존 방법보다 우수한 성능을 나타냅니다.

디컴파일의 본질적인 도전은 그 복잡성과 원본 소스 코드의 모든 측면, 특히 변수 이름과 제어 구조와 같은 미세한 부분을 정확하게 복원하는 데 있는 어려움에 있습니다. 기존 도구와 방법은 이러한 영역에서 종종 부족함을 보이며, 기능적으로 유사하더라도 가독성과 유지 관리성이 떨어지는 코드를 생성합니다. 이러한 격차는 디컴파일의 정확성과 효율성을 향상시킬 수 있는 혁신적인 접근 방식의 필요성을 강조하며, 소프트웨어 개발 및 보안에서 중요한 연구 분야입니다.

LLM4Decompile 소개

LLM4Decompile 모델들은 C 소스 코드와 해당 어셈블리 코드의 쌍으로 구성된 대규모 데이터셋에서 사전 학습되었습니다. 이 사전 학습을 통해 모델들은 고급 프로그래밍 언어와 저급 어셈블리 언어 사이의 격차를 효과적으로 연결할 수 있는 깊은 이해를 개발할 수 있었습니다. 이를 통해 모델들은 원본 코드의 의미와 구조를 보존하면서 정확하게 C 코드를 어셈블리 코드로부터 예측할 수 있게 되었습니다.

LLM4Decompile은 DeepSeek-Coder의 아키텍처를 기반으로 하며, C 소스 코드와 해당 어셈블리 코드의 쌍으로 구성된 40억 토큰의 대규모 데이터셋에서 미세 조정(fine-tuned)되었습니다. 모델은 1B에서 33B에 이르는 다양한 파라미터 크기를 제공하며, 다양한 계산 자원과 요구 사항에 맞게 조정될 수 있습니다. 학습 과정은 시퀀스-투-시퀀스 및 다음 토큰 예측 목표를 포함하여 최적화되었습니다. 이 학습 전략과 함께, 재컴파일 가능성과 재실행 가능성에 중점을 둔 상세한 평가 벤치마크를 통해, LLM4Decompile이 단순히 구문적으로 정확한 코드를 생성하는 것뿐만 아니라 원래 프로그램의 의미적 무결성을 보존하는지 확인합니다. 모델의 학습, 추론 과정을 더 상세히 살펴보겠습니다:

학습 방법

LLM4Decompile은 다음 토큰 예측(Next Token Prediction, NTP)과 시퀀스-투-시퀀스 예측(Sequence-to-Sequence Prediction, S2S)의 두 가지 주요 학습 목표를 가집니다:

  1. 다음 토큰 예측(NTP): 이 방식에서는 모델이 주어진 입력 시퀀스에 기반하여 다음에 올 토큰을 예측합니다. 이는 대부분의 LLM 모델에서 사용되는 표준 언어 모델링 학습 목표입니다. NTP는 모델이 어셈블리 코드의 구조와 패턴을 이해하는 데 도움이 됩니다.

  2. 시퀀스-투-시퀀스 예측(S2S): S2S 학습은 모델이 전체 입력 시퀀스(여기서는 어셈블리 코드)를 받아 전체 출력 시퀀스(즉, C 소스 코드)를 생성하도록 합니다. 이는 주로 기계 번역과 같은 작업에서 사용되며, 디컴파일 과정에서 높은 수준의 정확도를 달성하기 위해 필수적입니다.

이 두 학습 목표는 LLM4Decompile이 어셈블리 코드를 정확하게 이해하고, 이를 C 소스 코드로 효과적으로 번역할 수 있도록 합니다.

추론 방법

LLM4Decompile의 추론 과정은 주어진 어셈블리 코드를 입력으로 받아, 학습된 모델을 사용하여 대응하는 C 소스 코드를 생성합니다. 추론 시, 모델은 학습 과정에서 적용된 S2S 방식을 사용하여, 어셈블리 코드의 전체 시퀀스를 분석하고 이를 C 코드의 전체 시퀀스로 번역합니다. 이 과정에서 모델은 어셈블리 코드 내의 다양한 패턴, 구조, 그리고 명령어 간의 관계를 이해하고, 이를 고급 언어의 구문과 의미에 맞게 재구성합니다.

추론 과정에서는 또한 미세 조정된 모델의 성능을 최적화하기 위해 다양한 디코딩 전략을 적용할 수 있습니다. 예를 들어, 빔 서치(Beam Search)를 사용하여 가능성 있는 여러 번역 후보 중에서 최적의 출력 시퀀스를 선택할 수 있습니다.

성능 평가

LLM4Decompile 모델의 성능 평가는 Decompile-Eval 벤치마크를 통해 주로 이뤄졌습니다. 이 Decompile-Eval 벤치마크는 모델을 통해 디컴파일된 코드를 다시 컴파일(Re-compilability)하고, 다시 실행(Re-executability)할 수 있는지 여부를 가지고 평가하게 됩니다. 기존의 평가 방법이 N-gram 유사도나 편집 거리 같은 텍스트 기반의 유사성 측정에 초점을 맞춘 것과 달리, Decompile-Eval은 프로그램의 구문적 정확성과 함께 실행 시의 의미적 정확성을 검증합니다. Decompile-Eval의 구성 및 평가 방법, 평가 결과는 다음과 같습니다:

Decompile-Eval 벤치마크의 구성

Decompile-Eval 벤치마크는 HumanEval 벤치마크를 기반으로, C 언어로 변환된 164개의 프로그래밍 과제와 관련 테스트 케이스를 포함합니다. 이 과제들은 다양한 프로그래밍 문제를 포괄하며, 디컴파일 기술의 다양한 측면을 평가하기 위한 실제적인 예시를 제공합니다.

재컴파일 가능성(Re-compilability)

재컴파일 가능성은 디컴파일된 코드를 다시 GCC 컴파일러 등을 사용하여 컴파일할 수 있는지 여부를 평가합니다. 이 지표는 디컴파일된 코드가 구문적으로 정확하고, 컴파일러가 이해할 수 있는 형태로 잘 구성되어 있는지를 확인합니다. 즉, 코드가 문법적으로 올바르며, 필요한 모든 선언과 구문이 적절히 포함되어 있는지를 평가하는 것입니다.

재실행 가능성(Re-executability)

재실행 가능성은 디컴파일된 코드가 실제로 실행될 때 원본 프로그램과 동일한 동작을 하는지를 검증합니다. 이를 위해, 디컴파일된 코드를 실행하여 테스트 케이스를 통과하는지 확인합니다. 프로그램이 모든 테스트 케이스에서 예상된 결과를 생성한다면, 그 코드는 원본의 의미를 정확하게 보존한 것으로 간주됩니다. 이는 단순한 구문적 정확성을 넘어서, 프로그램의 로직과 기능이 올바르게 복원되었는지를 평가하는 중요한 지표입니다.

LLM4Decompile 모델의 성능 평가 결과

  • 재컴파일 가능성(Re-compilability): LLM4Decompile 모델이 생성한 코드 중 약 90%가 GCC 컴파일러를 사용하여 성공적으로 재컴파일되었습니다. 이는 모델이 생성한 코드가 구문적으로 정확하며, 코드의 구조와 문법을 잘 이해하고 있음을 의미합니다.

  • 재실행 가능성(Re-executability): 특히, 6B 버전의 LLM4Decompile 모델을 사용했을 때, 디컴파일된 코드의 약 21%가 모든 테스트 케이스를 성공적으로 통과하여 프로그램의 의미(semantics)를 정확하게 포착했습니다. 이는 이전 버전인 GPT-4 대비 약 50%의 성능 향상을 의미합니다.

  • LLM4Decompile 모델은 여러 파라미터 사이즈(1B에서 33B)를 가지며, 크기가 클수록 일반적으로 성능이 향상됨을 보여주었습니다. 그러나 모델 크기 증가에 따른 성능 향상은 일정 수준 이상에서는 둔화되는 경향을 보였습니다.

  • 평가 과정에서 사용된 Decompile-Eval 벤치마크는 재컴파일 및 재실행 가능성을 중심으로 구성되었으며, 이는 기존에 사용되던 N-gram 유사도나 편집 거리와 같은 평가 지표보다 프로그램의 실질적인 기능성을 더 잘 반영합니다.

더 읽어보기

LLM4Decompile 논문

LLM4Decompile GitHub 저장소

LLM4Decompile 모델들




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있으니 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:kr:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:gift: 아래:arrow_lower_right:쪽에 좋아요:heart:를 눌러주시면 힘이 됩니다~ :star_struck: