핵심 요약
- leanrea는 리버스 엔지니어링 MCP 서버인 REA(Reverse Engineer Anything) 대신, 8KB짜리
SKILL.md한 장으로 코딩 에이전트가otool,nm,go version -m,rg같은 명령줄 도구를 직접 실행하게 하는 에이전트 스킬입니다. - 이름과 달리 REA 팀이 만든 경량판이 아니며, 저자는 REA와 관계가 없다고 밝히고 있습니다.
- 저자가 Claude Code(Sonnet 5.5, macOS)로 4개 과제를 3회씩 돌린 결과, leanrea 조건은 REA 조건보다 실행 시간이 38%, 비용이 35% 적었고, 정답 점수는 74/75로 REA 조건(75/75)보다 1점 낮았습니다.
- 반복 3회, 모델 1종, 머신 1대의 자체 측정이며, 도구 정의를 필요할 때만 불러오는 Claude Code 기본 설정에서는 REA MCP 서버만 연결했을 때의 대기 컨텍스트 부담이 leanrea와 거의 같았습니다.
- 라우터 명령 9개가 에이전트 실행 시 깨지는 문제 등이 이슈로 보고되어 있으며, 2026년 10월 19일 기준 수정 PR이 아직 병합되지 않았습니다.
leanrea 소개
소스 코드 없이 설치된 앱이나 바이너리의 동작을 알아내는 리버스 엔지니어링(reverse engineering)에 코딩 에이전트를 쓰는 사례가 늘고 있습니다. 대표적인 방식은 REA (
REA: Ghidra와 IDA 같은 분석 도구를 하나의 MCP로 묶어 코딩 에이전트에 연결하는 리버스 엔지니어링 도구)처럼 여러 분석 도구를 하나의 MCP(Model Context Protocol) 서버로 묶어 에이전트에 연결하는 것입니다. 그런데 에이전트는 이미 셸에서 otool, nm, strings, jadx 같은 도구를 실행할 수 있으므로, 그 사이에 MCP 계층을 하나 더 두는 것이 정말 이득인지는 따로 따져 볼 문제입니다. 이번에 소개하는 leanrea는 이 질문을 시험하기 위해 MCP 계층을 제거하고, 대상 종류별로 가장 빠른 명령과 흔한 함정만 적은 8KB 스킬 파일 하나로 같은 일을 하게 만든 프로젝트입니다.
leanrea 자체는 분석 엔진이나 도구를 설치하지 않습니다(필요한 도구가 없으면 대체 명령을 쓰고, 사용자가 허락할 때만 brew install로 설치하게 합니다). 에이전트 스킬(agent skill)은 에이전트가 작업에 맞춰 불러 읽는 지시문 파일인데, leanrea의 본체는 leanrea/SKILL.md 한 장입니다. 이 파일은 대상이 Electron 앱인지, Mach-O 바이너리인지, Go 바이너리인지에 따라 먼저 실행할 명령을 알려 주고, 한 번의 셸 호출로 목록을 모으는 붙여 넣기용 명령을 제공합니다. 그 뒤의 분석은 에이전트가 Bash로 실제 도구를 직접 실행해 진행합니다.
leanrea는 이름과 달리 REA의 공식 경량판이 아닙니다. leanrea는 AI 관련 유튜브 영상을 만드는 AICodeKing이 2026년 10월 17일에 공개한 저장소입니다. 저자는 REA와 제휴 관계가 없다고 밝히면서, 스킬에 담은 함정 대부분은 REA의 코드와 문서를 읽고 정리한 것이라고 적고 있습니다. 저장소에는 스킬 파일 외에 REA와 비교한 벤치마크 하네스와 실행별 원시 결과가 함께 들어 있어, 아래 비교 수치를 직접 대조하거나 재현할 수 있습니다.
leanrea vs. REA
두 프로젝트는 같은 종류의 대상을 다루지만, 에이전트에 무엇을 더하는지가 다릅니다. 저자가 정리한 비교 중 REA 6.5.0 기준 항목은 다음과 같습니다:
| 항목 | REA 6.5.0 | leanrea |
|---|---|---|
| 설치되는 것 | 25MB npm 패키지 + MCP 서버 | SKILL.md 한 장 |
| 지시문 분량 | 스킬 23.5KB + 참고 문서 48.8KB | 8KB |
| 에이전트에 추가되는 도구 | 207개 (정의 3.35MB) | 0개 (Bash 사용) |
| "Reply OK" 요청의 컨텍스트, 도구 전부 로드 | 400.7k 토큰, $1.60 | 34.5k 토큰, $0.09 |
| 결과의 형태 | Evidence ID가 붙은 구조화된 기록 | 에이전트가 읽은 명령 출력 |
표의 컨텍스트 행은 조건을 함께 읽어야 합니다. 400.7k 토큰은 Claude Code의 지연 도구 검색(deferred tool search)을 끈 경우입니다. 이 기능은 도구 정의를 처음부터 모두 싣지 않고 필요할 때 찾아 불러옵니다. Claude Code 기본값인 이 기능을 켜면 REA MCP 서버만 연결했을 때의 대기 부담은 34.9k 토큰(+3.5k)입니다. leanrea 스킬을 불렀을 때의 34.5k 토큰(+3.1k)과 거의 같고, REA 스킬까지 함께 부르면 42.7k 토큰(+11.3k)이 됩니다 (bench/BENCHMARK.md Context overhead 표). 즉, 모든 도구를 한꺼번에 싣는 에이전트에서는 차이가 크고, 도구 검색을 지원하는 에이전트에서는 대기 비용 차이가 작습니다.
마지막 행은 저장소 비교표에는 없고, 앞선 PyTorchKR의 REA 소개 글에서 정리한 차이를 덧붙인 것입니다. REA는 결과마다 근거 기록과 확인하지 못한 부분(unknown)을 함께 돌려주고, 스냅샷으로 저장해 나중에 다시 조회할 수 있습니다. leanrea는 같은 원칙을 지시문으로만 요구합니다. 답변의 주장마다 직접 본 것(seen), 추론한 것(inferred), 찾지 못한 것(unknown)을 표시하라고 적어 두었지만, 그 표시를 검증하거나 보관하는 장치는 없습니다.
leanrea를 사용하면 좋을 사용자
이미 셸 도구에 익숙하고, Electron 앱, macOS 바이너리, Go 바이너리처럼 정적 분석으로 답이 나오는 대상을 빠르게 조사하려는 개발자에게 leanrea가 잘 맞습니다. 설치가 파일 복사 한 번으로 끝나고, MCP 서버를 등록할 수 없거나 도구를 전부 미리 싣는 에이전트에서도 같은 방식으로 쓸 수 있습니다. 저자 측정에서 REA 조건보다 비용과 대화 턴 수가 줄어든 것도 이런 대상들이었습니다.
반대로 분석 근거를 기록으로 남겨 다른 사람이 검증해야 하는 보안 연구나 감사 업무라면, 현재의 leanrea는 REA를 대신할 선택지가 아닙니다. leanrea는 근거 표시를 에이전트에게 맡기므로 결과 기록 형식이 정해져 있지 않고, Ghidra 디컴파일 같은 깊은 네이티브 분석은 명령 한 줄 안내에 그칩니다. 분석 대상이 신뢰할 수 없는 파일이라면, 에이전트가 그 파일 안의 문자열을 읽으면서 Bash로 명령을 실행하는 구조라는 점도 고려해야 합니다. leanrea 저장소에는 REA처럼 분석 권한과 법적 책임을 다루는 문서가 없으므로, 그 판단도 사용자가 따로 해야 합니다.
leanrea 스킬 파일의 구성
leanrea의 SKILL.md는 크게 4가지 부분으로 구성되어 있습니다: 규칙(Rules), 첫 수(First move), 라우터(Router), 속도 패턴(Speed patterns)입니다. 저자는 파일 첫머리에 에이전트가 이 도구들을 이미 알고 있다고 전제합니다. 그래서 이 파일에는 대상별로 가장 빠른 명령과 함정만 적었다고 밝히고 있습니다.
leanrea의 작업 규칙
규칙 부분은 에이전트가 시간을 쓰는 방식을 정합니다. 원본 대신 복사본에서 작업하고, file -b와 매직 바이트(magic bytes)로 대상 형식을 먼저 판별한 뒤 가장 싼 목록 수집부터 실행하도록 합니다. 큰 파일이나 압축된(minified) 파일은 cat으로 읽지 말고 찾는 문자열 주변만 잘라 읽게 합니다. 서로 독립된 조사 명령은 ;로 묶어 한 번의 셸 호출로 실행하고, 출력은 항상 head나 -m으로 자르게 합니다. 목표 호출 횟수는 2~4회입니다. 묶어서 한 번 조사하고, 한두 번 잘라 읽은 뒤 답하는 흐름입니다.
번들러가 코드를 숨김 폴더에 넣는 함정도 규칙에 들어 있습니다. Electron 앱의 .webpack/, .vite/처럼 점으로 시작하는 폴더는 rg가 기본 설정에서 건너뛰므로, 압축을 푼 트리는 항상 rg -uu로 검색하라고 적혀 있습니다. 파일 내용을 잘라 읽을 때 쓰는 명령의 예는 다음과 같습니다:
rg -o '.{0,200}NEEDLE.{0,200}' F | head
leanrea의 대상별 라우터
라우터는 대상 종류별로 판별 신호와 가장 빠른 명령을 짝지은 표입니다. 표의 행은 다음 대상으로 나뉘어 있습니다: Electron과 asar 아카이브, 압축된 웹 번들과 소스맵, Hermes 바이트코드, Mach-O, 네이티브 코드 로직(디스어셈블), ELF와 PE, Go, Rust, .NET, Android APK, Flutter, WASM, SQLite, plist, pcap과 HAR, 펌웨어, 웹사이트, 실행 중인 프로세스. 예를 들어 Go 바이너리 행은 go version -m 하나로 툴체인, 모듈 경로, 의존성 버전, 빌드 플래그를 한 번에 얻을 수 있다고 안내하고, Go가 없을 때는 strings로 빌드 정보를 찾는 대체 명령을 함께 적어 둡니다:
go version -m T
아래는 GitHub에 렌더링된 라우터 표의 앞쪽 7개 행입니다. 열 이름은 Target (detect)와 Fastest path이고, Electron 행의 셀이 Surface: 뒤에서 잘려 보이는 것은 아래 이슈 절에서 다루는 파이프 문제 때문입니다:
네이티브 바이너리와 Electron 앱에는 첫 수로 붙여 넣는 한 줄짜리 명령이 따로 있습니다. 네이티브 쪽은 file, lipo, otool -L, nm, strings를 한 번에 실행하고 디스어셈블 결과를 파일로 저장합니다. Electron 쪽은 @electron/asar로 app.asar를 풀고 진입점과 contextBridge 노출 지점을 찾습니다. 속도 패턴 부분은 문자열과 임포트(import) 목록부터 보고, 명령어를 하나씩 읽기보다 호출 순서를 읽으며, 버전을 비교할 때는 코드보다 목록부터 비교하라는 요령을 정리합니다.
leanrea 벤치마크
저자는 Claude Code 2.1.301을 비대화형(claude -p)으로, Sonnet 5.5 모델과 macOS arm64 환경에서 실행해 세 조건을 비교했습니다. 스킬과 MCP를 모두 쓰지 않은 조건(none), leanrea 스킬 조건, REA MCP와 REA 자체 스킬을 함께 쓴 조건(rea)입니다. 과제는 4가지입니다. 실제 Electron 데스크톱 앱의 기능 추적(electron)과 그 앱의 네이티브 애드온 분석(native), 심볼을 제거한 gh 바이너리의 버전 확인(go), 디스어셈블만으로 단일 인스턴스 잠금의 통신 방식을 밝히는 과제(deep)입니다. 과제마다 3회씩, 세 조건을 나란히 동시에 실행했고, 답은 저자가 손으로 만든 정답 키와 정규식으로 채점했습니다.
조건별 12회 실행의 합계는 다음과 같습니다:
| 조건 | 실행 시간 합계 | 비용 | 턴 수 | 토큰 | 점수 |
|---|---|---|---|---|---|
| leanrea | 388초 | $2.17 | 55 | 2.40M | 74/75 |
| 스킬 없음 | 479초 | $2.21 | 81 | 3.11M | 67/75 (거부 1회) |
| REA (MCP + REA 스킬) | 627초 | $3.36 | 124 | 5.93M | 75/75 |
REA 조건과 비교하면 leanrea는 실행 시간이 38%, 비용이 35%, 턴 수가 56%, 토큰이 60% 적었습니다. leanrea가 놓친 1점은 electron 과제의 한 실행에서 v2 IPC(Inter-Process Communication, 프로세스 간 통신) 채널 대신 이전 채널을 답한 경우이고, 저자는 두 채널이 모두 존재한다고 설명합니다. 스킬 없음 조건의 67점은 정규식이 Go 1.27.1 표기를 놓친 채점 오류 1건을 저자가 바로잡은 값입니다. 원시 결과 파일 bench/results/final.jsonl을 직접 합산해 보면 위 합계가 그대로 나오며, 채점 정정 전 스킬 없음 조건의 점수는 66점입니다.
같은 원시 파일의 도구 호출 기록을 세어 보면 REA 조건의 성격도 보입니다. REA 조건의 12회 실행에서 에이전트가 호출한 도구 112회 중 Bash가 84회, REA의 MCP 도구가 17회, 도구 검색이 11회였습니다. 같은 과제를 leanrea 조건은 Bash 43회로 마쳤습니다. REA를 연결해도 에이전트가 대부분의 조사를 셸에서 진행했다는 뜻이며, 저자의 개별 명령 비교도 같은 방향입니다. Go 빌드 정보는 REA CLI가 0.56초, go version -m이 0.06초였습니다. Electron 앱 분석은 REA CLI가 무결성 검사 옵션을 추가해야 실행되었고, 47.9초 동안 140MB의 JSON을 만들었습니다(REA는 이런 대용량 결과에서 요약 뷰만 뽑아 보는 방법을 문서로 안내합니다). 같은 앱에서 asar 추출과 rg -uu 검색은 4.8초에 24KB였습니다.
저자가 밝힌 한계도 함께 봐야 합니다. 조건마다 3회 반복이고, 모델 1종과 머신 1대, 대상 3개만 썼습니다. Ghidra, Hopper, jadx를 설치하지 않아 네이티브 과제는 두 조건 모두 Xcode 도구로 진행했으므로, REA의 강점인 디컴파일러 연동은 이 측정에 반영되지 않았습니다. 저자도 스킬 없는 모델이 이미 이 작업을 잘한다고 적고 있습니다. leanrea가 스킬 없음 조건보다 나아진 폭(약 19% 빠르고 턴 수 32% 감소)은 REA 대비 차이보다 작고, 비용은 같았습니다. REA는 측정 이후 6.7.0까지 새 버전을 냈으므로, 수치는 6.5.0 기준입니다.
leanrea 사용 전 확인할 이슈
leanrea 저장소는 공개 직후부터 실행 오류와 안전 문제를 지적하는 이슈와 PR이 올라와 있고, 2026년 10월 19일 기준 이슈는 모두 열려 있고 수정 PR도 병합되지 않았습니다. 이 중 사용자에게 직접 영향을 주는 것은 다음 세 가지입니다.
첫째, 라우터 표 안의 명령이 그대로는 동작하지 않을 수 있습니다. 이슈 #1에 따르면 라우터가 마크다운 표라서 명령 속 파이프가 \|로 이스케이프되어 있는데, 에이전트는 SKILL.md를 원문 그대로 읽어 역슬래시까지 복사합니다. 그 결과 6개 행의 명령 9개가 오류를 내거나 아무것도 찾지 못합니다. Electron의 sort -u 명령, Mach-O의 otool -l 명령, Go의 대체 명령 2개, Rust의 strings 명령 2개, pcap과 HAR 명령 등이 해당하며, 표를 목록으로 바꾸는 수정 PR #2가 올라와 있습니다.
둘째, 네이티브 코드 행이 안내하는 Ghidra 명령의 DecompileAll.java는 Ghidra에 기본으로 들어 있는 스크립트가 아니어서 Script not found 오류로 멈춥니다. 이 스크립트를 저장소에 추가하는 PR #5는 app.asar만 복사하면 asar 추출이 실패하므로 app.asar.unpacked/ 폴더도 함께 복사해야 한다는 점도 지적합니다. 셋째, 이슈 #3 작성자는 Electron 첫 수 명령의 rm -rf $X가 따옴표 없이 쓰여 TMPDIR 경로에 공백이 있으면 의도하지 않은 디렉터리를 지울 수 있다고 보고했고, 수정 PR #4가 올라와 있습니다. 이 작성자는 벤치마크 실행기가 Bash를 사전 승인한 채 격리 없이 에이전트를 실행한다는 점도 지적했습니다. 실제 공격을 시연한 것은 아니라고 밝히면서도, 벤치마크를 일회용 VM이나 제한된 컨테이너에서 실행하라고 권고합니다.
leanrea 설치와 사용
leanrea는 skills CLI (
Vercel Skills (Skills.sh): 여러 AI 에이전트들을 지원하는 오픈소스 스킬 생태계)로 설치합니다. 이 명령은 저장소에서 leanrea 스킬을 찾은 뒤, Claude Code, Codex, Cursor, Gemini CLI, OpenCode 등 어느 에이전트에 설치할지 묻습니다. Node.js가 설치된 환경에서 다음 명령을 실행합니다:
npx skills add aicodeking/leanrea
모든 프로젝트에서 쓰려면 -g를, Claude Code에만 확인 질문 없이 설치하려면 -a claude-code -y를 붙입니다. 저자가 안내하는 변형과 갱신 명령은 다음과 같습니다:
npx skills add aicodeking/leanrea -g # install for your user, in every project
npx skills add aicodeking/leanrea -a claude-code -y # Claude Code only, no prompts
npx skills add aicodeking/leanrea -g -a '*' -y # every supported agent, user level
npx skills update leanrea # pull the latest version later
skills CLI 없이 설치하려면, 저장소를 내려받은 뒤 스킬 폴더를 Claude Code의 스킬 디렉터리로 복사합니다. 이때 저장소 안의 leanrea/leanrea 폴더가 스킬 본체입니다:
git clone https://github.com/aicodeking/leanrea
mkdir -p ~/.claude/skills && cp -R leanrea/leanrea ~/.claude/skills/
스킬 기능이 없는 에이전트라면 leanrea/SKILL.md의 내용을 규칙 파일이나 시스템 프롬프트에 붙여 넣을 수 있습니다. 설치한 뒤에는 다음처럼 질문 앞에 /leanrea를 붙여 호출합니다:
/leanrea How does the search feature in Foo.app work? Show the evidence.
벤치마크를 재현하려면 macOS, 벤치마크 대상 Electron 앱, Homebrew로 설치한 gh, Node.js, 로그인된 Claude Code가 필요합니다. bench/ 디렉터리에서 ./setup.sh로 REA 6.5.0과 대상 파일을 준비하고 ./run_all.sh로 36회를 실행하며, 저자는 Sonnet 기준 약 8달러가 든다고 적고 있습니다. 정답 키는 저자가 쓴 앱 버전과 go1.27.1로 빌드한 gh에 맞춰져 있어, 버전이 다르면 키를 새로 만들어야 합니다.
leanrea의 라이선스
leanrea는 MIT 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.
leanrea 프로젝트 GitHub 저장소
더 읽어보기
-
REA: Ghidra와 IDA 같은 분석 도구를 하나의 MCP로 묶어 코딩 에이전트에 연결하는 리버스 엔지니어링 도구
-
Awesome Reverse Engineering: MCP 서버까지 작업별로 정리한 리버스 엔지니어링 도구 목록
-
Reverify: 바이너리를 읽는 AI의 주장을 결정론적 도구가 실제 내용(byte)으로 판정하는 리버스 엔지니어링 도구
-
x64dbg-MCP Server: 런타임 설치 없이 x64dbg를 AI 어시스턴트에 연결하는 Zig 기반 플러그인
이 글은 GPT 모델로 정리한 초안을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 댓글로 알려주시기를 부탁드립니다. ![]()
파이토치 한국 사용자 모임
에서 이런 글들을 계속 정리하고 있습니다. 회원 가입으로 주요 글들을 이메일
로, 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로 새 글 알림을 받아보세요! ![]()
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()

