원문 캡처 · github.com
원문 캡처 · github.com

EasyRE-Agent 저장소는 바이너리와 과제를 입력하면 선택한 모델이 분석하고 답을 검증하는 도구다. 정답 대신 단계별 힌트나 튜터 안내를 받을 수도 있다.

기능과 대상

EasyRE-Agent는 리버스 엔지니어링 도구 모음을 담은 Docker 컨테이너 안에서 AI 에이전트를 실행한다. Claude Code, OpenAI Codex, OpenAI 호환 API(OpenRouter, Ollama, LM Studio, vLLM 등)를 지원하며, 검증기가 정답을 받아들일 때까지 에이전트가 작업을 이어간다. 검증은 정규식, 성공 메시지 또는 사용자가 지정한 명령으로 수행한다.

힌트 모드에서는 에이전트가 과제를 비공개로 푼 뒤 단계별 힌트를 제공하며, 콘솔에도 답을 표시하지 않는다. 튜터 모드에서는 사용자가 한 작업과 확인한 결과를 말하면 답을 공개하지 않고 다음 단계를 안내한다. 작업마다 시간·토큰 한도를 설정하고, 나중에 시간이나 모델을 바꿔 이어서 실행할 수 있다. 모델별 전체 작업 시간·토큰·비용 통계와 답, 풀이 경로, 스크립트, 막힌 시도, 사용 모델을 담은 보고서도 제공한다.

이 프로젝트는 크랙미, CTF 리버싱 과제, 퍼즐 바이너리를 대상으로 한다. 실제 악성코드 분석용은 아니다. 컨테이너는 SYS_PTRACE, seccomp=unconfined, 네트워크 접근 권한을 사용하고 대상 프로그램을 실행한다. 실제 악성코드는 네트워크가 차단된 격리 VM에서만 분석하라고 안내한다.

제작자는 도구 설치와 연결이 번거로운 문제를 Docker 이미지로 해결하고, 실제 파일과 도구 및 검증기를 이용해 그럴듯한 답을 걸러내며, Claude·Codex·OpenAI 호환 모델을 선택할 수 있도록 만들었다고 설명한다. 학습을 위해 정답을 바로 보여주지 않는 힌트·튜터 모드도 포함했다.

설치와 첫 실행

설치에는 약 10GB의 여유 디스크 공간이 필요하다. Windows, Linux, macOS에서 Docker를 설치한 뒤 프로젝트 폴더에서 설정 스크립트를 실행한다. 첫 이미지 빌드는 몇 분 걸릴 수 있다.

Windows에서는 Docker Desktop을 기본 설정(WSL 2)으로 설치해 실행하고, 프로젝트 폴더의 setup.cmd를 더블클릭한다. Linux에서는 Docker Engine과 Compose 플러그인을 설치하고 사용자가 sudo 없이 Docker를 쓸 수 있도록 설정한 뒤 로그아웃·로그인한다.

sh
sudo usermod -aG docker $USER

그다음 프로젝트 폴더에서 sh setup.sh를 실행한다. macOS에서도 Docker Desktop for Mac을 설치해 실행한 뒤 sh setup.sh를 실행한다. Apple Silicon(M1–M4)에서는 x86_64/amd64 에뮬레이션을 위해 Settings → General → Use Rosetta를 켠다. 이미지는 x86-64이므로 에뮬레이션으로 실행되며, 작동하지만 빌드와 실행이 느려진다. Linux ARM에서도 x86 에뮬레이션(qemu/binfmt)이 있어야 실행되며 느리다. Wine이 32비트 x86 라이브러리를 필요로 하기 때문이다.

과제 파일은 tasks 아래 폴더에 넣고, 선택 사항인 task.md에 설명을 쓴다. 예를 들어 tasks/crackme/에 파일을 둔 뒤 Windows에서는 다음처럼 실행한다. Linux와 macOS에서는 명령 앞부분을 sh easyre.sh로 바꾸며 나머지는 같다.

text
.\\easyre.cmd run crackme --success "Correct"
.\\easyre.cmd open

첫 명령은 과제를 풀고, 두 번째 명령은 보고서를 연다. --success는 정답일 때 프로그램이 출력하는 문자열이다. 그런 출력이 없다면 생략한다.

설정 스크립트는 Docker 실행 여부를 확인하고 이미지를 빌드한 뒤 모델을 선택하고 로그인하게 한다. 지원 선택지는 Claude 구독(Pro 또는 Max), Anthropic API 키, Codex를 통한 ChatGPT 계정, OpenAI API 키, OpenRouter, aistudio.google.com의 Google Gemini API 키, 도구 호출을 지원하는 모델을 실행 중인 Ollama, 서버를 실행 중인 LM Studio다. 마지막으로 easyre doctor를 실행해 설정을 검사한다.

문제가 생기면 다음 명령으로 모델 프로필, 인증 정보, API 연결, Wine, 스킬을 점검한다. 각 문제와 해결 방법을 보여준다.

text
.\\easyre.cmd doctor

모델을 바꾸려면 설정을 다시 실행하거나 프로필을 이용한다. Windows에서 색상 대신 ←[32m 같은 코드가 보이면 Windows Terminal을 쓰거나 .env에 NO_COLOR=1을 추가한다.

명령과 검증

주요 명령은 과제 실행·재개, 힌트·튜터 모드, 작업 목록·보고서 열기, 모델 프로필·상태 점검, 통계 조회, 작업 종료·삭제, Claude/Codex 로그인이다. easyre run TARGET은 ./tasks 아래 폴더나 파일을 대상으로 한다. easyre resume JOB은 작업을 이어가고, easyre hint JOB [--answer]는 다음 힌트를 주거나 답을 공개한다. easyre tutor JOB은 튜터 대화를 계속한다. easyre open [JOB] [folder]는 보고서·튜터 대화 또는 폴더를 연다. easyre rm JOB... | --FILTER의 필터는 --open, --closed, --unsolved, --solved, --all이다.

--desc 또는 --desc-file로 과제 설명을 지정할 수 있다. 기본값은 과제 폴더의 task.md, opis.txt, README.md다. --success REGEX는 성공 출력, --verify CMD는 검증 명령을 지정하며 {}는 후보 답으로 바뀐다. {}가 없으면 답을 표준 입력으로 전달한다. --flag-format REGEX는 답 형식을 제한한다. --profile은 config/backends.toml의 모델 프로필, --backend는 claude(기본값)·codex·openai, --model은 백엔드 모델을 고른다. --mode는 solve(기본값)·hint·tutor다. --budget-min의 기본 시간 한도는 120분이며 --budget-tokens로 출력 토큰 한도도 정할 수 있다. --logs는 진행 막대 대신 에이전트 명령을 실시간 출력하고, -i는 Claude Code/Codex UI를 이용한 대화형 세션을 연다.

text
.\\easyre.cmd run crackme --success "(?i)correct"
.\\easyre.cmd run keygenme --verify "wine /work/src/app.exe {}" --success "Valid"
.\\easyre.cmd run ctf-rev --flag-format "CTF\\{.+\\}"
.\\easyre.cmd run crackme --mode hint
.\\easyre.cmd hint crackme
.\\easyre.cmd run crackme --mode tutor --success "Correct"
.\\easyre.cmd tutor crackme
.\\easyre.cmd run crackme --backend openai --model qwen3-coder --budget-min 30
.\\easyre.cmd resume crackme --budget-min 60

검증 순서는 다음과 같다. --flag-format이 설정돼 있으면 먼저 형식을 확인한다. --verify가 있으면 이를 실행하고 출력을 --success와 대조한다. --success가 없으면 종료 코드 0을 성공으로 본다. --success만 설정했고 과제에 .exe 또는 ELF 파일이 정확히 하나 있으면 해당 파일에 후보 답을 표준 입력으로 넣어 자동 실행한다. .exe는 Wine으로 실행한다. 검증기가 없으면 에이전트가 스스로 답을 입증해야 하며 보고서에는 unverified라고 표시된다.

작업의 검증을 실제로 수행하는 easyre check '<answer>'와 힌트 모드에서 hints.md에 답이 없고 충분한 항목이 있는지 확인하는 easyre done은 에이전트가 컨테이너 안에서 쓰는 명령이다. check는 성공하면 답을 작업에 저장하고 에이전트가 보고서를 쓰게 한다. 실패하면 에이전트가 계속 작업하며 모든 시도는 .easyre/attempts.log에 기록된다. 직접 콘솔에서 실행하면 검사할 작업이 없어 안내만 출력한다. 결과는 easyre jobs와 easyre open으로 확인한다.

힌트·튜터와 결과물

튜터 모드는 먼저 에이전트가 답을 비공개로 구하고, 콘솔에는 진행 상황만 보여준다. 이어지는 대화에서 사용자가 무엇을 했고 무엇을 봤는지 말하면 올바른 방향을 확인하고 막다른 길을 경고하며 작은 다음 단계를 제안한다. /hint는 힌트, /answer는 확인을 거쳐 답 공개, /quit은 종료 명령이다. easyre tutor <job>으로 대화를 이어갈 수 있다. 대화는 작업 폴더의 tutor.md에 저장되며, 응답에 실수로 답이 포함되면 [hidden]으로 바뀐다.

easyre open은 최신 작업의 report.md(튜터 작업은 tutor.md)를 기본 앱으로 열고, 작업 이름을 지정하면 해당 이름으로 시작하는 최신 작업을 연다. folder를 지정하면 작업 폴더를 연다. 이 명령은 Docker가 아닌 컴퓨터에서 실행되므로 바로 열린다. 작업마다 jobs/<이름>-<시각>/ 폴더가 생긴다. report.md에는 답, 풀이 경로, 스크립트가 담기며 hints.md와 tutor.md는 해당 모드에서 생성된다. TASK.md는 과제 설명, src/는 수정하지 않은 과제 파일, agent/는 메모·스크립트·수정 사본, .easyre/는 설정·전체 로그·시도 내역 등을 보관한다. 보통 보고서나 힌트 파일만 보면 된다. agent/notes.md에는 추론 과정이, .easyre/log.jsonl에는 디버깅을 위한 단계별 기록이 있다.

힌트·튜터 모드도 작업과 검증 단계는 같지만 답을 공개하지 않는다. 답은 비공개 .easyre/answer에 저장한 뒤 힌트 모드에서는 등급별 hints.md를 작성하고 easyre done으로 검사하거나, 튜터 대화를 시작한다.

백엔드와 프로필

claude는 Claude Code를 헤드리스 모드와 서브에이전트·스킬 기능으로 실행하며, .env에 구독용 CLAUDE_CODE_OAUTH_TOKEN 또는 ANTHROPIC_API_KEY가 필요하다. codex는 OpenAI Codex CLI를 사용하며 easyre login codex 또는 OPENAI_API_KEY로 설정한다. openai는 bash, read_file, write_file, read_skill 도구를 사용하는 내장 에이전트 루프다. OPENAI_BASE_URL, OPENAI_API_KEY, OPENAI_MODEL을 설정하며 Google Gemini(프로필 gemini), OpenRouter, Ollama, LM Studio 등 OpenAI 호환 API를 지원한다. Ollama를 호스트에서 실행하는 설정 예시는 다음과 같다. 모델은 도구 호출을 지원해야 한다.

text
EASYRE_BACKEND=openai OPENAI_BASE_URL=http://host.docker.internal:11434/v1 OPENAI_MODEL=qwen3-coder

config/backends.toml에 프로필을 저장하면 이름으로 모델을 바꿀 수 있다.

toml
default = "claude-opus"

[profiles.claude-opus]
backend = "claude"
model = "claude-opus-5-5"

[profiles.ollama-qwen]
backend = "openai"
base_url = "http://host.docker.internal:11434/v1"
model = "qwen3-coder"
api_key = "ollama"

[profiles.openrouter]
backend = "openai"
base_url = "https://openrouter.ai/api/v1"
model = "deepseek/deepseek-chat"
api_key_env = "OPENROUTER_API_KEY"

easyre profiles는 프로필을 나열하고 *로 기본 프로필을 표시한다. run ... --profile ollama-qwen으로 로컬 모델을 사용하고, resume ... --profile claude-opus로 같은 작업을 다른 모델에 이어 맡길 수 있다. Claude 프로필은 claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5처럼 전체 모델 ID를 사용한다. 새 모델이 나오면 설정에서 ID를 바꾸거나 opus, sonnet, haiku 별칭으로 최신 모델을 따라갈 수 있다. 백엔드가 보고한 정확한 모델은 작업별로 저장되며 easyre jobs, easyre stats, 보고서 머리말, easyre profiles의 last run에 표시된다. api_key_env는 .env에서 키를 읽어 프로필 파일에 비밀 정보를 넣지 않는다. --profile을 생략하면 기본 프로필 또는 .env의 EASYRE_PROFILE을 쓰며, 프로필 없이 --backend를 지정하면 백엔드를 직접 사용한다.

easyre stats는 모든 작업의 모델별 시간·토큰·비용을 합산한다. Claude는 비용을 직접 보고하는데, 이는 API 환산 가격이며 구독에 추가 비용이 붙는 것은 아니다. 다른 API는 config/backends.toml 프로필에 토큰 100만 개당 USD 가격인 price_in, price_out을 추가한다.

분석 과정과 도구

스킬은 skills/<name>/SKILL.md에 있는 짧은 Markdown 작업 지침이다. 에이전트는 대상에 맞는 스킬을 골라 필요한 때 불러오며, 사용 시점·절차·명령·주의점을 읽는다. 제공 스킬은 일반 리버싱 방법론, PE/ELF 네이티브 바이너리(C, C++, Go, Rust, Delphi, VB6), .NET·Unity(Mono/IL2CPP), Python 패키지·바이트코드, JAR·APK, JavaScript·Node·Electron, AutoIt, WebAssembly, 사용자 정의 VM, Wine 동적 분석, 제약 해결·기호 실행·에뮬레이션, 암호·인코딩 식별, 문서·아카이브·이미지·캡처·사용자 형식 분석, Ghidra 헤드리스 스크립트다. 모두 준비 완료로 표시돼 있다. 새 스킬은 skills/_TEMPLATE.md를 skills/<name>/SKILL.md로 복사하면 자동으로 나타난다.

도구 모음은 docker compose build 중 toolchain/install.sh가 설치한다. 설치 모듈은 toolchain/modules/*.sh에 있고 .env의 EASYRE_TOOLS로 고른다. 기본값 all은 모두 설치한다. 이미지 크기를 줄이려면 필요한 모듈만 지정하고 다시 빌드한다.

모듈포함 도구크기
wine(항상 설치)Wine 32/64, Xvfb, MinGW 런타임 DLL(.exe 및 GUI 실행)—
corebinutils, gdb, radare2, upx, binwalk, yara, FLOSS, capa 및 capstone, keystone, unicorn, z3, lief, pefile, pwntools, pycryptodome약 0.5GB
diediec(Detect It Easy), 컴파일러·패커 탐지약 0.3GB
ghidra헤드리스 Ghidra, 대응 JDK, prefetch 훅약 1.5GB
dotnet.NET SDK, ilspycmd, Il2CppDumper, de4dot약 1GB
jvmjadx, apktool, cfr약 0.2GB
pythonpyinstxtractor-ng, pycdc/pycdas, decompyle3/uncompyle6약 0.1GB
js@electron/asar, webcrack, js-beautify약 0.1GB
autoitautoit-ripper, Wine에서 실행하는 AutoIt 인터프리터약 0.05GB
wasmwabt 도구 모음약 0.02GB
angrangr 9.x 기호 실행(10 미만으로 고정)약 1GB

모듈은 각각 독립적이고 반복 실행할 수 있다. 네트워크가 연결된 컨테이너에서 에이전트가 작업 중 빠진 모듈을 설치할 수도 있다. 작업마다 새 컨테이너를 쓰므로 설치 내용은 작업이 끝나면 사라진다.

sh
sh /opt/easyre/toolchain/modules/ghidra.sh

ghidra 모듈이 있으면 트리아지가 주 네이티브 바이너리에 백그라운드 분석을 실행한다. Ghidra 헤드리스 분석 결과인 decompiled.c, functions.txt, strings.txt, imports.txt는 agent/prefetch/에 저장된다. 모듈이 없으면 훅이 없어 트리아지에서 이 분석을 건너뛴다.

text
EASYRE_TOOLS=core,die,ghidra
prefetch <binary> <output_dir>

디스크 공간은 측정값이 아닌 대략치다. Ubuntu 기반 이미지와 Python·기본 유틸리티는 약 0.4GB, Node.js와 Claude Code·Codex CLI는 약 0.5GB, Wine 모듈은 약 2GB다. 나머지 모듈은 모두 약 4.8GB이며 기본 EASYRE_TOOLS=all 이미지 전체는 약 8~9GB다. 빌드 캐시에 1~3GB가 추가로 필요하며 docker builder prune으로 지울 수 있다. EASYRE_TOOLS를 일부 모듈로 제한하면 공간을 아낄 수 있다. 큰 모듈은 ghidra 약 1.5GB, dotnet과 angr 각각 약 1GB다. core,die만 설치하면 이미지는 약 4~5GB다. jobs/에도 과제 복사본과 에이전트 파일이 쌓인다.

작업 실행 예시

저장소는 콘솔에서 시리얼을 입력받아 Correct! 또는 Wrong을 출력하는 크랙미 예시를 든다. easyre의 고정 코드가 단계 1~3과 5~7을 처리하며, 단계 4는 미리 스크립트로 정해진 과정이 아니다. 모델이 스킬과 config/AGENT.md 규칙을 참고해 도구를 선택한다.

text
tasks/keygenme/keygenme.exe
tasks/keygenme/task.md        Find the valid serial.
.\\easyre.cmd run keygenme --success "Correct"

새 컨테이너에서 작업을 시작할 때 easyre.cmd는 docker compose run --rm easyre easyre run …을 실행한다. tasks/, jobs/, easyre, config/, skills/를 연결한다. 작업 설정은 jobs/keygenme-<timestamp>/에 src/(과제 복사본과 압축 해제 파일), agent/, .easyre/를 만든다. 설명은 task.md 또는 opis.txt, README.md에서 가져오고 작업 디렉터리를 /work로 연결한다. 예시에서는 --success가 있고 .exe가 하나뿐이므로 후보를 표준 입력으로 전달하는 wine /work/src/keygenme.exe가 검증기가 된다.

트리아지는 각 파일에서 file, 바이트 표식(PyInstaller, .NET, UPX, Go, Rust, Delphi, AutoIt, WASM, Electron 등), 손상된 MZ 헤더 복구, diec를 수행한다. 주 네이티브 바이너리에서는 Ghidra 사전 분석을 백그라운드로 시작해 functions.txt, strings.txt, imports.txt, decompiled.c를 만들고 끝에 DONE을 쓴다. 결과는 triage.md에 기록된다.

에이전트는 규칙, 모드별 보고서 형식, 스킬 목록, 도구 안내, 검증기, 과제 설명, 트리아지 결과를 받는다. Claude 백엔드에서는 claude -p --output-format stream-json --model claude-opus-5-5 …를 실행하고 모든 이벤트를 .easyre/log.jsonl에 기록한다. 일반적인 분석에서는 대상 유형에 맞는 스킬을 읽고 프로그램을 한 번 실행한 뒤 성공·실패 문자열과 입력 검사 함수를 찾는다. 디컴파일 결과와 필요하면 디스어셈블리를 읽고, 추측 대신 파일에서 상수를 가져온다. 발견과 실패한 접근은 agent/notes.md에 hypothesis | evidence | result 형식으로 기록한다. 간단한 역산에는 Python, 복잡한 제약에는 z3를 쓰고, 실행이 분석보다 나으면 unicorn, angr, WINEDEBUG=+relay, winedbg 등을 사용할 수 있다. 마지막으로 실제 프로그램에 후보를 넣어 확인하고 easyre check를 실행한 뒤 /work/report.md를 작성한다.

예시의 디컴파일된 검사는 입력 길이가 12인지 확인하고 각 바이트에 ((s[i] ^ 0x5A) + i) != expected[i] 조건을 적용한다. 에이전트는 .rdata에서 expected를 읽어 검사를 역산한다.

c
if (strlen(s) != 12) return 0;
for (i = 0; i < 12; i++)
 if (((s[i] ^ 0x5A) + i) != expected[i]) return 0;
return 1;
python
exp = bytes.fromhex("1b2a3c...")
print(bytes(((e - i) & 0xff) ^ 0x5A for i, e in enumerate(exp)).decode())

다른 대상에서는 첫 단계의 스킬과 도구가 달라진다. UPX에는 upx -d, .NET/Unity에는 ilspycmd, de4dot, il2cppdumper, PyInstaller에는 pyinstxtractor-ng와 pycdc, APK/JAR에는 jadx, apktool, cfr, Electron에는 asar와 webcrack, AutoIt에는 autoit-ripper, WebAssembly에는 wasm-decompile과 Node를 쓴다. 암호 과제에는 capa, yara, pycryptodome을, 사용자 정의 VM에는 핸들러 맵·디스어셈블러·z3를 사용할 수 있다.

검증 단계에서는 후보를 검증기에 넣는다. 예시에서는 최대 120초 동안 wine /work/src/keygenme.exe에 답을 전달하고 출력이 Correct와 일치하는지 확인한다. 통과한 답은 .easyre/ANSWER에 저장하고 에이전트에 보고서 작성을 지시한다. 실패하면 계속 작업하며 시도는 .easyre/attempts.log에 기록한다.

안전장치에는 정답이 승인되지 않았는데 멈추려 할 때 작업을 재개시키는 중단 훅(최대 30회)이 있다. 사람의 도움이 정말 필요할 때 HELP.md를 쓰는 경우만 조기 종료할 수 있다. 모델 프로세스가 끝나면 같은 세션을 최대 12회 재개한다. 사용량 제한에는 15분 기다리며, 기존 세션이 사라졌으면 새 세션을 시작하되 파일과 메모는 유지한다. 기본 시간 한도는 --budget-min의 120분이고 --budget-tokens로 토큰 한도를 더할 수 있다. 한도에 도달하면 보고서에 not solved (time)이라고 쓴다. Ctrl+C로 멈추면 보고서를 만들고 easyre resume keygenme로 이어갈 수 있다.

보고서 맨 위에는 상태, 백엔드와 정확한 모델, 시간, 토큰, 비용, 검증 결과와 답을 표시한다. easyre open으로 열 수 있다. easyre, config/, skills/는 컨테이너에 실시간 연결되므로 수정 사항을 반영하는 데 다시 빌드할 필요가 없다.

프로젝트 구성과 라이선스

easyre는 작업·트리아지·백엔드·검증기·보고서·힌트 명령을 제공한다. setup.cmd와 setup.sh는 최초 빌드, 모델 선택, 로그인, 점검을 담당하고 easyre.cmd와 easyre.sh는 운영체제별 실행 래퍼다. config/에는 에이전트 지침·모드 규칙·중단 훅·백엔드 설정, skills/에는 작업 지침, toolchain/install.sh와 toolchain/modules/에는 도구 설치 스크립트가 있다. 도구별 표는 toolchain/README.md, 기반 이미지와 볼륨 설정은 Dockerfile, docker-compose.yml에 있다.

프로젝트는 MIT 라이선스다. 라이선스 파일에서 확인할 수 있다.