핵심 요약
소스 코드가 유실된 오래된 바이너리 파일을 현대적 언어로 변환하는 작업은 리버스 엔지니어링의 난제 중 하나이다. 본 아티클은 LLM(Gemini)과 오픈소스 디컴파일러 Ghidra를 결합하여 이 과정을 자동화하는 접근법을 다룬다. Ghidra가 생성한 가독성 낮은 pseudo-C 코드를 LLM이 문맥을 분석하여 변수명과 함수명을 의미 있게 복구함으로써, 최종적인 코드 변환의 정확도를 높이는 워크플로우를 설명한다. 특히 LLM의 '의미적 가중치'가 코드 분석의 정확도에 미치는 영향을 기술적으로 분석한다.
배경
C 언어 및 어셈블리 기초 지식, Ghidra 사용 경험, LLM 프롬프트 엔지니어링 및 MCP 개념 이해
대상 독자
리버스 엔지니어링 자동화 및 LLM을 활용한 코드 분석에 관심 있는 보안 연구원 및 개발자
의미 / 영향
LLM을 통해 기존에 수동으로 이루어지던 난해한 바이너리 분석 작업의 비용과 시간을 획기적으로 줄일 수 있으며, 이는 레거시 시스템의 현대화 및 보안 취약점 분석에 큰 영향을 미칠 것이다.
섹션별 상세
LLM은 대규모 데이터에서 패턴을 식별하는 요약 능력과 서로 다른 언어 간의 신경망 기계 번역 능력이 뛰어나 리버스 엔지니어링 작업에 적합하다.
Ghidra는 강력한 디컴파일 성능을 제공하지만 컴파일 시 손실된 변수명이나 구조체 정보를 복구하지 못해 사람이 이해하기 어려운 pseudo-C 코드를 생성하는 한계가 있다.

Gemini 1.5 Flash와 같이 긴 컨텍스트 창을 가진 모델은 전체 코드베이스의 함수 호출 관계(Xref)를 분석하여 난해한 변수(iVar1 등)를 의미 있는 명칭(player_ptr 등)으로 자동 변환할 수 있다.
MCP(Model Context Protocol)와 GhidrAssistMCP 도구를 활용하면 Ghidra 환경과 LLM을 직접 연결하여 함수 디컴파일 및 변수 이름 변경 루프를 자동화할 수 있다.
의미 있는 변수명으로의 변환은 단순히 가독성을 높이는 것을 넘어, LLM의 트랜스포머 어텐션 메커니즘이 훈련 데이터 내의 유사한 논리 패턴을 더 잘 포착하게 하여 최종 코드 변환의 정확도를 극대화한다.
실제 사례로 32비트 DLL 파일인 MajorMUD 게임 바이너리를 대상으로 하여, LLM이 학습 데이터에 없는 폐쇄형 소스 코드를 논리적으로 재구성하는 과정을 입증했다.
실무 Takeaway
- Ghidra의 pseudo-C를 LLM에 직접 입력하기보다 의미 있는 변수명으로 먼저 치환하는 중간 단계를 거쳐야 LLM의 추론 정확도를 높일 수 있다.
- Gemini의 긴 컨텍스트 창과 MCP 도구를 결합하면 수백 KB 규모의 바이너리 전체에 대한 리버스 엔지니어링 워크플로우를 자동화할 수 있다.
- LLM은 훈련 과정에서 습득한 '의미적 가중치'를 활용하므로 player_ptr 같은 명칭이 주어질 때 게임 로직과 메모리 관리 패턴을 더 정확하게 예측한다.
언급된 리소스
GitHubGhidra
GitHubGhidrAssistMCP
AI 분석 전체 내용 보기
AI 요약 · 북마크 · 개인 피드 설정 — 무료