에이전트로 개선하는 Rust 기반 디컴파일러
agent-first Rust 디컴파일러, Ghidra 호환 및 WebAssembly 지원
TL;DR
Kuna는 Rust로 구현된 에이전트 우선 decompiler로 Ghidra에서 포팅되어 분기한 프로젝트입니다. 단계별(stage) 파이프라인과 자연어 스펙, 옵션 카탈로그를 통해 LLM 에이전트가 특정 변환을 토글하고 자율적으로 디컴파일러를 개선하는 워크플로우를 목표로 삼고 있습니다. 로컬 CLI, Ghidra 통합, 브라우저 WebAssembly 배포를 모두 지원하며 회귀 테스트 스위트와 DecBench 연동으로 실험·검증 루프를 갖추고 있습니다.
주요 기능
- 단일 Rust 바이너리로 배포되며 다양한 플랫폼에서 실행할 수 있도록 설계되어 있다. CLI를 통한 로컬 실행뿐만 아니라 WebAssembly를 통한 브라우저 내 실행을 지원해 바이너리 비공개성을 유지하면서 디컴파일을 수행할 수 있다. Ghidra 호환 출력 포맷을 유지하므로 기존 Ghidra 워크플로에 통합하기 위한 경로가 마련되어 있다.
- 파이프라인은 단계별(stage-based) 구조로 구분되어 있어 각 단계가 명확하게 정의된다. 이러한 구조 때문에 LLM 에이전트가 특정 단계의 동작을 찾아 수정하거나 기능을 추가하기 쉬운 형태를 제공한다. 런타임에 조회 가능한 stage 레지스트리와 옵션 카탈로그를 통해 에이전트 제어 표면이 분리되어 있다.
- SLEIGH 컴파일러(slacomp)와 함께 동작하며 .slaspec 소스에서 .sla 아티팩트를 생성하는 빌드 흐름을 포함한다. README와 레포지토리 내 docs/spec 및 docs/phases.md가 자연어 스펙과 단계 모델을 병렬로 제공해 인간·에이전트가 높은 레벨 설계를 이해할 수 있게 돕는다. 테스트 스위트와 레거시 XML 회귀(test/datatests)로 빌드 검증 루프가 내장되어 있다.
- 에이전트 우선(agent-first) 설계를 지향해 LLM이 디컴파일러를 호출하고 옵션을 토글하면서 자체 개선 루프를 돌릴 수 있게 한다. docs/options.md가 LLM 제어면을 문서화하며 AGENTS.md에 기여 규칙과 에이전트 작업 흐름이 정리되어 있다. DecBench 연동으로 정량적 개선 캠페인을 운영할 수 있는 구조를 의도하고 있다.
어떻게 동작하는가
바이너리를 로드한 뒤 여러 단계(stage)를 순차적으로 적용해 중간 표현을 정제하고 최종적으로 C, header, 어셈블리 파일을 출력하는 구조를 따른다. 각 단계는 별도의 모듈로 분리되어 있어 stage 레지스트리에서 목록 조회와 매핑이 가능하고, 옵션 카탈로그(transform)로 LLM이 개별 변환을 토글해 동작을 바꿀 수 있다. SLEIGH 스펙은 slacomp로 컴파일되어 디코더가 사용하는 .sla 아티팩트로 전환되며, 전체 프로세스는 로컬 CLI, Ghidra 통합, 또는 WebAssembly 브라우저 구현으로 실행될 수 있다.
해결 문제
전통적 디컴파일러는 사람이 직접 디컴파일러를 개선하는 흐름에 맞춰져 있어 LLM 에이전트가 대량으로 개입하기 어렵다는 문제를 겨냥한다. Kuna는 단계별 파이프라인과 자연어 스펙, 옵션 카탈로그를 통해 에이전트가 특정 기능을 찾아 수정하고 런타임에 토글할 수 있도록 접점을 제공한다. 결과적으로 에이전트 기반의 자율적 개선 루프를 실험·운영할 수 있는 인프라와 검증용 회귀 스위트를 함께 제공한다.
차별점
- Ghidra에서 포팅된 Rust 기반 코드베이스로 출발했지만 이후 파이프라인과 기능에서 분기해 독자적인 설계를 유지한다. 이로 인해 SLEIGH 호환성과 동시에 Rust 생태계의 빌드·테스트 도구를 활용하는 이점이 있다. 포팅·검증 이력은 docs/history.md와 레이아웃에서 확인할 수 있다.
- 단계(stage) 기반의 명확한 구획을 통해 LLM 에이전트가 개별 단계의 소스와 사양을 직접 찾아 개선할 수 있도록 구조화되어 있다. 이 구조는 디버깅과 부분 개선을 쉽게 하며, 에이전트 주도의 변경을 작은 단위로 검증할 수 있는 테스트 패턴과 연결되어 있다. 테스트 게이트(make test / make test-stages / make rust-test)가 코드 변경 시 자동 회귀를 강제한다.
- 브라우저 내 WebAssembly 빌드를 제공해 바이너리 비공개 측면을 유지하면서 로컬 머신에서 완전한 디컴파일을 수행할 수 있다. 또한 Ghidra GUI에 통합 가능한 확장(integrations/ghidra)이 있어 기존 리버싱 툴체인으로 유연하게 연결할 수 있다. docs/options.md를 통해 에이전트 제어면을 문서화해 자동화 캠페인에서 직접 옵션 조작이 가능하다.
사용 사례
- LLM 기반 에이전트가 자동으로 디컴파일 규칙을 개선하는 연구 캠페인에 사용 가능하다. 옵션 카탈로그와 DecBench 연동으로 자동화된 실험·메트릭 루프를 구성할 수 있어 에이전트 주도의 개선 효과를 정량화하는 데 적합하다. 에이전트가 대량으로 실험하면서 얻은 패치와 스펙을 다시 푸시해 도구를 순환 개선하는 워크플로우를 지원한다.
- 리버싱 도구체인에 Ghidra 호환 디컴파일 결과를 삽입해 기존 분석 엔지니어링에 통합할 때 유용하다. Ghidra 확장 경로를 제공하므로 기존 GUI 환경에서 Kuna의 출력을 활용할 수 있다. 이 방식은 기존 워크플로우를 바꾸지 않으면서 새로운 디컴파일러를 도입하려는 팀에 적합하다.
- 민감한 바이너리의 로컬 분석을 위해 브라우저 내 WebAssembly 배포를 활용할 수 있다. 서버에 바이너리를 업로드하지 않고도 완전한 디컴파일을 실행하므로 비공개 요구가 있는 상황에서 유용하다. integrations/web에 배포 코드가 포함되어 있어 자체 호스팅이 가능하다.
시작하기
프로젝트는 Rust 툴체인(cargo)만 있으면 빌드할 수 있으며 상위 Makefile로 바이너리와 SLEIGH 스펙을 함께 빌드하도록 되어 있다. make binaries로 decompiler와 slacomp, kuna CLI를 빌드하고 make specs로 .slaspec을 컴파일해 필요한 SLEIGH 아티팩트를 준비한 뒤 decompiler/target/release/kuna를 실행하면 된다. 개발 중에는 decompiler 하위 cargo workspace에서 cargo build 및 cargo test --workspace로 작업하고, 제공된 테스트 게이트를 통해 회귀를 확인하면 된다.
요구사항
- Rust toolchain(예: cargo) 설치
- make와 표준 빌드 도구(Unix 환경 권장)
- Ghidra 통합이나 WASM 배포를 하려면 해당 환경의 추가 설정이 필요
274
Stars
12
Forks
+207
Trending
0
조회수
관련 토론
아직 관련 토론이 없습니다.
댓글
댓글을 작성하려면 로그인이 필요합니다.