radare2은(는) 무엇을 하나요?
radare2 CLI를 위한 바이너리 분석 스킬입니다. GUI에 의존하지 않고 명령줄을 통해 정찰, 분석, 탐색, 내보내기 및 경량 수정을 수행하는 데 중점을 둡니다.
필수 조치(읽은 후 즉시 실행)
NOW:../field-journal/precedent-reverse.md를 읽으십시오. — 이 스킬의 작업이 승인된 일반 작업인지 확인합니다.NOW: 현재 작업이 이 스킬의 적용 범위에 해당하는지 확인합니다.NEXT:../tool-index.md를 읽고 도구 가용성과 실제 경로를 확인합니다.NEXT: 도구가 없으면 bootstrap을 호출하고 경로를 추측하지 마십시오.ACT: "워크플로" 첫 단계로 진입하여 실행하고, 확인 상태에 멈추지 마십시오.
적용 범위
사용자가 다음과 같은 의도를 가질 때 이 스킬을 우선적으로 사용해야 합니다:
r2/radare2를 사용하여exe,dll,so,elf,apk,dex,wasm등의 파일을 분석해야 하는 경우rabin2,rasm2,radiff2,rahash2,rax2사용법을 묻는 경우- 명령줄 디스어셈블, 함수 확인, 문자열 확인, 임포트/익스포트 확인, 크로스 레퍼런스 조회, 패치 작업이 필요한 경우
radare2배치 명령,-c자동화 명령 또는r2pipe스크립트를 작성해야 하는 경우
사용자가 명시적으로 GUI 리버스 엔지니어링, Hex-Rays 스타일의 의사 코드, 또는 IDA 워크플로를 요구한다면 ida-reverse를 우선 고려하십시오. 웹 JS 리버스 엔지니어링의 경우 reverse-engineering을 우선 고려하십시오.
환경 확인 우선
r2가 사용 가능하다고 가정하지 마십시오. 먼저 확인하십시오:
r2 -v
rabin2 -v
설치되지 않은 경우, 일반적인 설치 위치를 확인하거나 설치를 안내하십시오.
Windows에서 일반적인 실행 파일:
radare2.exerabin2.exerasm2.exeradiff2.exerahash2.exerax2.exer2pm.exe
내장 리소스
이 스킬에는 두 가지 리소스가 포함되어 있습니다. 매번 임시로 명령어를 구성하지 말고 우선 재사용하십시오.
scripts/recon.ps1
표준 정찰 스크립트로, 1차 개요 분석에 적합합니다. 다음을 출력합니다:
- 기본 정보
- 섹션
- 임포트
- 익스포트
- 문자열
- 선택적
r2 -A자동 분석 요약
호출 방법:
powershell -File "<skill-root>\radare2\scripts\recon.ps1" -TargetPath "C:\path\to\sample.exe"
r2 자동 분석을 포함하려면:
powershell -File "<skill-root>\radare2\scripts\recon.ps1" -TargetPath "C:\path\to\sample.exe" -RunAnalysis
references/cheatsheet.md
더 많은 명령어 세부 사항, 일반 시나리오 템플릿이 필요하거나 문법을 빠르게 기억해야 할 때, 기억에 의존하여 추측하지 말고 이 치트시트를 읽으십시오.
알려진 현상
Windows에서 .sdb 누락 경고가 간헐적으로 발생
일부 PE 파일에서 rabin2 정찰 시 다음과 유사한 경고가 나타날 수 있습니다:
ERROR: Cannot find ...\share\format\dll\*.sdb
주요 출력이 여전히 정상적으로 반환된다면, 일반적으로 기본 정찰 결론에 영향을 미치지 않으므로 계속 분석하면 됩니다. 이러한 부수적인 경고 때문에 분석 실패로 바로 판단하지 마십시오.
기본 원칙
1. 먼저 정찰한 후 심층 분석
처음부터 전체 자동 분석을 수행하지 마십시오. 먼저 가벼운 명령어로 파일 형식, 아키텍처, 진입점, 문자열, 임포트 테이블을 확인한 후 aaa, aaaa 또는 대상 분석을 수행할지 결정하십시오.
2. 최소 충분 명령어 우선
radare2 명령어가 매우 많으므로, 사용자는 일반적으로 최단 경로만 필요로 합니다:
- 파일 정보 보기:
rabin2 -I - 문자열 보기:
rabin2 -z - 임포트/익스포트 보기:
rabin2 -i/rabin2 -E - 대화형 분석:
r2 <file>후 부분 명령 실행
3. 수정 시 신중 유지
사용자가 바이너리 패치를 요청하는 경우:
- 기본적으로 읽기 전용으로 먼저 엽니다:
r2 <file> - 명시적으로 수정이 필요한 경우에만 쓰기 모드 사용:
r2 -w <file>또는 세션 내에서oo+ - 수정 전에 위험성을 알리고 의도치 않은 원본 파일 덮어쓰기를 방지합니다.
일반 워크플로
워크플로 1: 빠른 정찰
바이너리 파일을 처음 받았을 때 적합합니다.
하드 게이트(MUST — 충족되지 않으면 워크플로 2 및 이후 단계 진입 금지)
PE/ELF/Mach-O 등 임포트 테이블이 있는 바이너리의 경우, 함수 수준 분석이나 동적 단계에 진입하기 전에 MUST 임포트 테이블 검사를 완료하고 Evidence로 기록해야 합니다:
rabin2 -i <sample>(또는recon.ps1출력의 imports 섹션)을 실행합니다. DLL/SYS의 경우 추가로rabin2 -E를 실행하고E-exports로 기록합니다.- 전체/분류된 임포트 테이블 결과를 Evidence에 기록합니다(권장 ID:
E-imports또는E-triage-imports). 최소한 다음을 포함해야 합니다:- 재현 명령어(
repro_command) - 주요 임포트 분류 요약: 네트워크 / 파일 / 암호화 / 프로세스 인젝션 / 레지스트리 / 기타 의심스러운 API
- 임포트 테이블이 비어 있거나, 파싱에 실패하거나, 도구에서 오류가 발생한 경우: MUST 실패 현상과 원본 출력을 Evidence로 기록하고, 조용히 건너뛰지 마십시오.
- 임포트 테이블이 "너무 깨끗한" 경우(기본 DLL만 있음): MUST 동적 로딩 의심을 명시하고, SHOULD 동적 API 캡처로 전환합니다.
- 재현 명령어(
- .NET 등 전통적인 IAT가 없는 경우: MUST 동등한 앵커 포인트(dnSpy/IL/메타데이터 요약)를 통해 동일한 Evidence 시맨틱 슬롯에 기록하고, 빈 상태로 넘어가는 것을 금지합니다.
- 패킹된 샘플의 IAT 복구: x86은 ImportREC(또는 동등), x64는 Scylla(또는 동등)를 사용합니다. 복구 실패 시 MUST
E-iat-repair-fail을 기록한 후 동적 API 중단점으로 전환합니다. 정적 IAT에서 무한히 고집하는 것을 금지합니다. (reverse-engineering/references/re-agent-workflow.md§1.2 참조) - 사용자가 명시적으로 "임포트 테이블 검사 재수행 / 임포트 테이블 재확인 / IAT 재수행"을 요청하는 경우: MUST 지목된 단계 자체를 재수행합니다(차단 시 먼저 가능성 문턱 확인: 전제 조건 설명 + 확인 요청; 강제 시 quality=unreadable 표시). 관련 없는 단계로 대체하여 완료를 가장하는 것을 금지합니다.
임포트 테이블(또는 합법적인 동등 앵커 포인트/IAT 실패 우회) Evidence가 기록되기 전까지: MUST NOT "기본 정찰 완료"라고 주장하고, MUST NOT 워크플로 2+의 심층 분석 결론에 진입합니다.
내장 스크립트를 직접 실행하는 것을 우선 권장:
powershell -File "<skill-root>\radare2\scripts\recon.ps1" -TargetPath "sample.exe"
수동 최소 명령어만 필요한 경우:
rabin2 -I sample.exe
rabin2 -z sample.exe
rabin2 -i sample.exe
rabin2 -E sample.exe
관심 지점:
- 파일 형식, 비트 수, 아키텍처, 플랫폼
- 진입점 주소
- 의심스러운 문자열: URL, 경로, 오류 메시지, 레지스트리, 명령줄 인자
- 임포트 함수: 네트워크, 파일, 암호화, 프로세스 인젝션, 레지스트리 작업(MUST Evidence 기록, 위 하드 게이트 참조)
워크플로 2: 대화형 함수 분석
r2 sample.exe
진입 후 일반적으로 사용:
aaa # 일반 자동 분석
afl # 함수 목록
iz # 문자열 목록
iS # 섹션 목록
is # 심볼 목록
s entry0 # 진입점으로 이동
pdf # 현재 함수 디스어셈블
VV # 시각적 모드 진입(터미널이 적합한 경우)
q # 종료
설명:
- 기본적으로
aaa를 우선 사용하고, 처음부터 더 무거운aaaa를 사용하지 마십시오. - 샘플이 크거나 분석이 느린 경우, 진입점 근처만 분석하고 수동으로 확장할 수 있습니다.
워크플로 3: main / 핵심 로직 찾기
afl~main
afl~sym.
iz~http
iz~error
axt <addr>
접근 방식:
- 먼저
main, 진입점, 문자열 참조로 시작합니다. axt를 사용하여 특정 문자열이나 주소를 참조하는 위치를 찾습니다.- 참조 지점을 찾은 후
s <addr>,pdf를 수행합니다.
워크플로 4: 16진수 및 메모리 보기
px 64 # 현재 주소부터 64바이트 16진수
pd 20 # 20개 명령어 디스어셈블
psz # 현재 주소의 문자열 읽기
pxa # 더 친화적인 16진수 뷰
워크플로 5: 바이너리 패치
사용자가 명시적으로 파일 수정을 요청한 경우에만 사용:
r2 -w sample.exe
진입 후 예시:
s 0x401000
wa nop
wa jmp 0x401050
wq
일반적인 쓰기 작업:
wa <asm>: 어셈블리 쓰기wx <hex>: 원시 바이트 쓰기wq: 쓰고 종료
수정 전에 원본 파일을 백업하는 것이 좋습니다. 사용자가 백업을 언급하지 않았다면, 최소한 한 번 경고합니다.
워크플로 6: 비대화형 자동화
일회성 출력 결과에 적합:
r2 -A -q -c "afl;iz;ii;q" sample.exe
일반적인 인자:
-A: 시작 시 자동 분석-q: 조용한 모드-c: 명령어 문자열 실행
명령어가 많다면, 유지보수하기 어려운 매우 긴 문자열을 넣지 말고 읽기 쉬운 순서로 정리하는 것이 좋습니다.
내장 정찰 스크립트를 먼저 기반으로 사용하고, 그런 다음 맞춤 명령어를 추가할지 결정하는 것이 더 권장됩니다.
일반적인 하위 도구
rabin2
정적 정보 추출에 적합:
rabin2 -I sample.exe # 기본 정보
rabin2 -S sample.exe # 섹션
rabin2 -s sample.exe # 심볼
rabin2 -i sample.exe # 임포트
rabin2 -E sample.exe # 익스포트
rabin2 -z sample.exe # 문자열
rabin2 -zz sample.exe # 더 자세한 문자열
rasm2
빠른 어셈블리/디스어셈블리에 적합:
rasm2 -d "9090"
rasm2 -a x86 -b 64 "xor eax, eax"
radiff2
두 바이너리 비교에 적합:
radiff2 old.exe new.exe
radiff2 -C old.exe new.exe
rahash2
해시 계산에 적합:
rahash2 -a md5 sample.exe
rahash2 -a sha256 sample.exe
rax2
진수 및 인코딩 변환에 적합:
rax2 0x401000
rax2 4198400
rax2 -s hello
권장 분석 순서
알 수 없는 샘플을 만났을 때, 다음 순서를 따르십시오:
rabin2 -I로 형식, 아키텍처, 진입점 확인rabin2 -z로 문자열 확인rabin2 -i로 임포트 함수 확인 — MUST + Evidence(하드 게이트, 워크플로 1 참조)- 대화형 분석이 필요하다면, 그때
r2진입(단계 3의 Evidence가 기록된 경우에만) - 먼저
aaa, 그 다음afl/iz/pdf - 문자열 참조, 임포트 호출, 진입점 흐름을 통해 점진적으로 핵심 함수를 찾습니다.
이 순서의 장점은 노이즈가 적고 방향 감각을 빨리 확립할 수 있다는 점입니다. 단계 3은 선택적 최적화가 아니라 심층 분석 진입 전 하드 게이트입니다.
Windows 주의 사항
- 경로에 공백이 있는 경우, 명령어에 올바르게 따옴표를 추가해야 합니다.
- 현재 터미널에서
r2를 찾을 수 없다면PATH가 방금 업데이트된 것일 수 있으므로 새 터미널을 열고 다시 시도하십시오. - 일부 샘플은 관리자 권한으로 읽어야 하지만, 기본적으로 사용자가 명시적으로 필요로 하지 않는 한 권한을 적극적으로 상승시키지 마십시오.
- 의심스러운 샘플에 대해 동적 디버깅을 수행하기 전에 먼저 사용자 의도를 확인하여 오작동을 방지하십시오.
출력 스타일
사용자가 단순히 명령어만 원하는 것이 아니라 실제 파일 분석을 요청하는 경우:
- 먼저 정찰 결과 요약을 제공합니다.
- 그런 다음 주요 증거(문자열, 임포트, 함수, 주소)를 나열합니다.
- 마지막으로 다음 단계 제안이나 심층 분석을 계속 진행합니다.
명령어만 나열하고 왜 이렇게 하는지 설명하지 마십시오.
일반적인 요청 예시
예시 1: exe 분석
사용자: "이 exe가 뭘 하는지 radare2로 봐줘"
처리 방법:
- 먼저
rabin2 -I/-z/-i사용 r2진입 필요 여부 판단aaa,afl,pdf로 진입점 및 주요 문자열 참조 심층 분석
예시 2: 문자열이 호출된 위치 찾기
사용자: "이 오류 문자열이 어떤 함수에서 트리거됐어?"
처리 방법:
iz~키워드로 문자열 주소 찾기axt <addr>로 참조 찾기- 참조 지점으로 이동
s <addr>후pdf
예시 3: 분기 변경
사용자: "이 jne를 je로 바꿔줘"
처리 방법:
- 먼저 대상 주소 확인
- 쓰기 모드로 진입할 것임을 명시적으로 알림
wa je <target>또는 직접wx사용- 수정 후 다시 디스어셈블하여 확인
피해야 할 사항
radare2를aaa명령어 하나만 있는 도구로 취급하지 마십시오.- 위험성을 설명하지 않고 쓰기 모드로 사용자 파일을 열지 마십시오.
- 기본 정찰을 수행하기 전에 결론을 내리지 마십시오.
- 임포트 테이블 검사(
rabin2 -i/ recon imports)를 건너뛰는 것을 금지합니다. Evidence에 기록되지 않으면 다음 단계로 넘어갈 수 없습니다. 사용자가 임포트 테이블 재수행을 요청했는데 다른 단계를 수행하여 대체하는 것을 금지합니다. - IAT 복구 실패 후 정적으로 고집하는 것을 금지합니다.
E-iat-repair-fail을 기록한 후 동적으로 전환합니다. 64비트 샘플에 ImportREC만 사용하는 것을 금지합니다. - 웹 JS 리버스 엔지니어링을 이 스킬로 잘못 유도하지 마십시오. 그것은
reverse-engineering의 범위입니다.
참고 자료
- 명령어 치트시트:
references/cheatsheet.md - 표준 정찰 스크립트:
scripts/recon.ps1
radare2-skills 생태계
radare2-skills 프로젝트(radareorg/radare2-skills)는 더 완전한 생태계 도구와 워크플로를 제공합니다:
- r2xsql: SQL로 바이너리 임포트 테이블 / 문자열 / 함수 조회
- r2mcp / r2http: MCP 도구 및 HTTP 상태화 명령 채널
- radius2: 심볼릭 실행, 심볼릭 동적 분석
- r2pm: 플러그인 관리, 확장
- decompiler plugins: radare2 플러그인 메커니즘
사용 전략:
- 사용자가
r2xsql,r2mcp,r2http,radius2,r2pm,rabin2,rasm2,radiff2,rahash2,rax2를 언급하면, 본 스킬(radare2/SKILL.md)로 우선 라우팅합니다. - 이러한 도구는 단지 생태계 가속기일 뿐이며, 우회할 수 없습니다: 권한 게이트,
tool-index검증, Evidence 임포트, 쓰기 모드 확인. - 최소 재현 명령어 예시 제공:
r2xsql -s <file> -q "SELECT ..."curl.exe -sS --data-binary 'aaa' http://127.0.0.1:9393/cmdradius2 -p <binary> ...r2pm -ci <plugin>
본 스킬은 기존 하드 게이트와 증거 체인 무결성을 유지하며, 어떤 권한이나 Evidence 단계도 건너뛰는 것을 허용하지 않습니다.
라우팅 컨텍스트
상위 진입점: skills/SKILL.md(총괄), routing.md
상위 대안: ida-reverse/(디컴파일/의사 코드가 필요할 때 IDA로 업그레이드)
하위 출력점:
- 동적 분석 필요 →
reverse-engineering/tools-dynamic.md(Frida/GDB) - 심층 디컴파일 필요 →
ida-reverse/ - PAT에서 흥미로운 문자열을 발견한 후 크로스 레퍼런스 필요 →
ida-reverse/(IDA의 xref가 더 강력함)
동급 관련 모듈: ida-reverse/(상호 보완: r2 정찰은 빠르고, IDA 디컴파일은 깊음)
온디맨드 부트스트랩(On-Demand Bootstrap)
본 스킬의 진입 스크립트는 통합 부트스트랩 시스템에 연결되어 있습니다. radare2가 없을 때 바로 오류를 내지 않고 자동으로 설치를 시도합니다.
자동화 기능 경계
| 도구 | 자동 설치 가능 | 설치 방식 | 설명 |
|---|---|---|---|
| r2 | ✓ | GitHub Release ZIP (w64) | %USERPROFILE%\Tools\radare2\에 자동 다운로드 및 압축 풀기 |
| rabin2 | ✓ | 위와 동일(radare2 배포판에 포함) | — |
| rasm2 | ✓ | 위와 동일 | — |
| radiff2 | ✓ | 위와 동일 | — |
| rahash2 | ✓ | 위와 동일 | — |
| rax2 | ✓ | 위와 동일 | — |
부트스트랩 트리거 지점
scripts/recon.ps1:rabin2또는r2가 없으면 자동으로bootstrap-reverse.ps1호출
부트스트랩 실패 시
자동 설치가 실패하면(네트워크 문제, GitHub API 속도 제한 등), 스크립트는 명확한 오류와 함께 수동 설치 링크를 출력합니다.
수동 설치: https://github.com/radareorg/radare2/releases 에서 radare2-*-w64.zip을 다운로드하고, %USERPROFILE%\Tools\radare2\에 압축을 푼 후 bin\ 디렉토리가 PATH에 있는지 확인합니다.
작업 완료 자체 점검(완료를 주장하기 전에 MUST 통과)
- 워크플로의 각 단계를 (읽기만 한 것이 아니라) 실제로 실행했습니까?
- 임포트 테이블 검사를 실행하고 Evidence(E-imports / E-triage-imports 또는 .NET 동등 항목)에 기록했습니까? DLL/SYS의 경우 E-exports가 포함되었습니까?
- IAT 복구 실패 시 E-iat-repair-fail을 기록하고 동적으로 전환했습니까? 재수행 요청이 동일한 단계로 되돌아갔습니까?
-
tool-index를 기반으로 실제 도구 경로를 사용했습니까? - 재현 가능한 증거(명령어/스크립트/스크린샷/보고서)를 생성했습니까?
- RULES에서 요구하는 Checklist 항목을 완료하고 기록했습니까?