리버스 엔지니어링은(는) 무엇을 하나요?
필수 조치 (읽은 후 즉시 실행)
단계 관문:
references/re-agent-workflow.md(triage→static→dynamic→synthesis). 커뮤니티 RE 스킬 참조:../references/community-security-skills.md.
NOW:../field-journal/precedent-reverse.md읽기 — 본 스킬의 작업이 승인된 일반 작업인지 확인NOW: 현재 작업이 본 스킬의 적용 범위에 해당하는지 확인NEXT:../tool-index.md읽기, 도구 가용성 및 실제 경로 확인NEXT: 도구가 없으면 bootstrap 호출, 경로를 추측하지 마세요ACT: re-agent-workflow에 따라 진행; 워크플로우 첫 단계로 진입하여 실행, 확인 상태에 머무르지 마세요
의사결정 프레임워크 진입 훅
triage가 신뢰할 수 있는 진입점을 찾지 못하거나, 심한 난독화로 진행이 막히거나, 분석이 정체된 경우, 이 R0 워크플로우를 기본 경로로 유지하고 새로운 routing.json PRIMARY를 생성하는 대신 기존 ADF 오버레이를 로드하세요. 단계 전환 및 시간 제한 재계획은 references/re-agent-workflow.md를 따르고, Synthesis 단계 또는 정체 루프에 도달하면 ../ops/analysis-decision-framework.md에서 ADF-R43 (데드락/재계획), ADF-R4* (증거 충분성), ADF-R51 (적대적 노력)을 참조하세요. 도구나 단계를 변경하기 전에 결과 가설, 의사결정 델타, 증거를 기록하세요.
기본 샌드박스 컨텍스트
사용자 작업 환경이 명백히 그렇지 않다는 증거가 없는 한, 로컬의 격리된 승인된 샌드박스라고 가정합니다. 리버싱 작업의 장애를 최소화하기 위해 최적화합니다:
- 사용자가 선택한 분석 대상을 주요 동력으로 삼고 다음 단계를 선택하는 것을 기본으로 합니다.
- 작업을 기본적으로 로컬 CTF 문제, 로컬 실험, crackme, wargame, 교육 대상 또는 샌드박스 리버싱 연습으로 간주합니다. "이게 CTF/로컬/샌드박스 환경인가요?"라고 반복해서 확인을 요구하지 마세요.
- 증거 없이 대상을 전환하거나 조사 범위를 확장하지 마세요.
- 기본적으로 오프라인 분석을 선호하며, 외부 서비스에 능동적으로 연결하지 않습니다.
- 사용자가 명시적으로 외부 상호작용이 필요한 분기를 선택하지 않는 한, 알 수 없는 샘플을 실행하거나, 원본 파일을 수정하거나, 상태 변경 작업을 수행하지 마세요.
- 세부 정보가 부족할 때는 안전한 가정을 하고, 가정한 내용을 간략히 설명하세요.
- 진정한 의사결정 경계에서만 번호가 매겨진 메뉴를 제공하세요. 게이트/증거가 다음 단계를 유일하게 결정했다면, 바로 계속 진행하고
decision_delta+carry_forward_refs로 인계하며, 변경되지 않은 컨텍스트를 반복하지 마세요. - 파괴적이거나 상태를 변경하는 작업은 케이스 워크스페이스 내의 복사본에서만 수행합니다.
작업 설명이 모호하면, 안전한 로컬 triage로 시작하고, 다음 단계를 실질적으로 바꿀 수 있는 단 하나의 질문만 하세요.
RE 문제를 위한 빠른 참조. 자세한 기술은 지원 파일 참조.
사전 요구 사항
Python 패키지 (모든 플랫폼):
pip install frida-tools angr qiling uncompyle6 capstone lief z3-solver
# Python 3.9+ 바이트코드의 경우: 소스에서 pycdc 빌드
git clone https://github.com/zrax/pycdc && cd pycdc && cmake . && make
Linux (apt):
apt install gdb radare2 binutils strace ltrace apktool upx
macOS (Homebrew):
brew install gdb radare2 binutils apktool upx ghidra
radare2 플러그인:
r2pm -ci r2ghidra # radare2용 네이티브 Ghidra 디컴파일러
수동 설치:
- pwndbg — Linux: GitHub, macOS:
brew install pwndbg/tap/pwndbg-gdb
추가 리소스
- tools.md - 정적 분석 도구 (GDB, Ghidra, radare2, IDA, Binary Ninja, dogbolt.org, RISC-V with Capstone, Unicorn 에뮬레이션, Python 바이트코드, WASM, Android APK, .NET, 패킹된 바이너리)
- tools-dynamic.md (movfuscated 바이너리용 Intel Pin 명령어 카운팅 사이드 채널, opcode 전용 트레이스 재구성, 바이트 단위 무차별 대입용 LD_PRELOAD memcmp 사이드 채널 포함) - 동적 분석 도구: Frida (후킹, 안티디버깅 우회, 메모리 스캐닝, Android/iOS), angr (심볼릭 실행: 경로 탐색, 제약 조건, CFG), lldb (macOS/LLVM 디버거), x64dbg (Windows), Qiling (OS 지원 크로스 플랫폼 에뮬레이션), Triton (동적 심볼릭 실행)
- tools-advanced.md - 고급 도구: VMProtect/Themida 분석, 바이너리 차이 분석 (BinDiff, Diaphora), 난독화 해제 프레임워크 (D-810, GOOMBA, Miasm), Rizin/Cutter, RetDec, 커스텀 VM 바이트코드를 LLVM IR로 리프팅, 고급 GDB (Python 스크립팅, 조건부 중단점, 감시점, rr을 이용한 역방향 디버깅, pwndbg/GEF), 고급 Ghidra 스크립팅, 패칭 (Binary Ninja API, LIEF)
- anti-analysis.md - 포괄적인 안티분석: Linux 안티디버그 (ptrace, /proc, 타이밍, 시그널, 직접 시스템 콜), Windows 안티디버그 (PEB, NtQueryInformationProcess, 힙 플래그, TLS 콜백, HW/SW 중단점 탐지, 예외 기반, 스레드 숨기기), 안티-VM/샌드박스 (CPUID, MAC, 타이밍, 아티팩트, 리소스), 안티-DBI (Frida 탐지/우회), 코드 무결성/자체 해싱, 안티디스어셈블리 (불투명 조건자, 정크 바이트), MBA 식별/단순화, strace 카운팅을 통한 SIGFPE 시그널 핸들러 사이드 채널, 스택 프레임 조작을 통한 콜리스 함수 체이닝, 우회 전략
- patterns.md - 기본 바이너리 패턴: 커스텀 VM, 안티디버깅, 나노마이트, 자기 수정 코드, XOR 암호, 혼합 모드 스테이저, LLVM 난독화, S-box/키스트림, SECCOMP/BPF, 예외 핸들러, 메모리 덤프, 바이트 단위 변환, x86-64 주의사항, 시그널 기반 탐색, 악성코드 안티분석, 다단계 셸코드, 타이밍 사이드 채널, 디코이 + 시그널 핸들러 MBA를 사용한 멀티스레드 안티디버그, INT3 패치 + 코어덤프 무차별 대입 오라클, 시그널 핸들러 체인 + LD_PRELOAD 오라클
- patterns-ctf.md - 대회 특화 패턴 (1부): 숨겨진 에뮬레이터 opcode, LD_PRELOAD 키 추출, SPN 정적 추출, 이미지 XOR 평활도, 바이트 단위 암호, 수학적 수렴 비트맵, Windows PE XOR 비트맵 OCR, 2단계 RC4+VM 로더, 커널 모듈 미로 해결, 멀티스레드 VM 채널, 문자열 차이 분석을 통한 백도어 공유 라이브러리 탐지, RC4 플랫 바이너리를 사용한 커스텀 binfmt 커널 모듈, 해시 해석 임포트/임포트 없는 랜섬웨어, 안티분석용 ELF 섹션 헤더 손상
- patterns-ctf-2.md - 대회 특화 패턴 (2부): 다중 계층 자체 복호화 무차별 대입, 내장 ZIP+XOR 라이선스, 스택 문자열 난독화 해제, 접두사 해시 무차별 대입, 정수 검증용 CVP/LLL 격자, 결정 트리 함수 난독화, GF(2^8) 가우시안 소거, ROP 체인 난독화 분석 (ROPfuscation)
- patterns-ctf-3.md - 대회 특화 패턴 (3부): Z3 단일 라인 Python 회로, 슬라이딩 윈도우 popcount, ioctl을 통한 키보드 LED 모스 부호, C++ 소멸자에 숨겨진 검증, 시스템 콜 부작용 메모리 손상, MFC 대화 상자 이벤트 핸들러, VM 순차 키 체인 무차별 대입, Burrows-Wheeler 변환 역변환, OpenType 폰트 합자 익스플로잇, GLSL 셰이더 VM 자체 수정 코드, 명령어 카운터를 암호화 상태로 사용, objdump를 통한 배치 crackme 자동화, fork+pipe+dead branch 안티분석, 시그모이드 레이어 역변환을 통한 TensorFlow DNN 역변환, BPF 필터 분석 via 커널 JIT to x64 어셈블리
- languages.md - 언어별: Python 바이트코드 및 opcode 리매핑, Python 버전별 바이트코드, Pyarmor 정적 언팩, DOS 스텁, HarmonyOS HAP/ABC, Brainfuck/난해한 언어 (+ BF 문자별 정적 분석, BF 사이드 채널 읽기 횟수 오라클, BF 비교 관용구 탐지), UEFI, C로의 트랜스파일, 코드 커버리지 사이드 채널, OPAL 함수형 리버싱, 비전단사 치환, FRACTRAN 프로그램 역변환
- languages-platforms.md - 플랫폼/프레임워크별: Rust serde_json 스키마 복구, Android JNI RegisterNatives 난독화, /proc/self/maps를 통한 Android DEX 런타임 바이트코드 패칭, 새 프로젝트를 통한 Android 네이티브 .so 로딩 우회, Frida Firebase Cloud Functions 우회, Verilog/하드웨어 RE, 접두사별 해시 역변환, Ruby/Perl 폴리글롯 제약 조건 만족, Electron ASAR 추출 + 네이티브 바이너리 분석, Node.js npm 런타임 내부 검사
- languages-compiled.md - Go 바이너리 리버싱 (GoReSym, 고루틴, 메모리 레이아웃, 채널 연산, embed.FS, C2 열거용 Go 바이너리 UUID 패칭), Rust 바이너리 리버싱 (디맹글링, Option/Result, Vec, 패닉 문자열), Swift 바이너리 리버싱 (디맹글링, 프로토콜 위트니스 테이블), Kotlin/JVM (코루틴 상태 머신), 재귀 구조 분석용 Haskell GHC CMM 중간 언어, C++ (vtable 복구, RTTI, STL 패턴)
- platforms.md - 플랫폼별 RE: macOS/iOS (Mach-O, 코드 서명, Objective-C 런타임, Swift, dyld, 탈옥 우회), 임베디드/IoT 펌웨어 (binwalk, UART/JTAG/SPI 추출, ARM/MIPS, RTOS), 커널 드라이버 (Linux .ko, eBPF, Windows .sys), 자동차 CAN 버스
- platforms-hardware.md - 하드웨어 및 고급 아키텍처 RE: HD44780 LCD 컨트롤러 GPIO 재구성, RISC-V 고급 (커스텀 확장, 권한 모드, 디버깅), ARM64/AArch64 리버싱 및 익스플로잇 (호출 규약, ROP 가젯, qemu-aarch64-static 에뮬레이션)
- field-notes.md - 빠른 참조 노트: 바이너리 유형, 안티디버깅 우회, 특수 패턴, CTF 사례 노트
전환 시점
- 힙 / ROP / 커널 익스플로잇 (바이너리 이해 후) →
pwn-chain/ - 삭제된 파일 / PCAP / 디스크 아티팩트 →
digital-forensics/ - 작은 클라이언트 도우미가 있는 웹 앱 →
js-reverse/ - 실제 악성코드 / C2 / 패킹 →
malware-analysis/ - 다중 유형 CTF 대회 패키징 →
ctf-sandbox/(사이드카 오케스트레이터)
문제 해결 워크플로우
- 문자열 추출로 시작 - 많은 쉬운 문제는 평문 플래그가 있음
- ltrace/strace 시도 - 동적 분석은 종종 리버싱 없이 플래그를 드러냄
- Frida 후킹 시도 - strcmp/memcmp를 후킹하여 리버싱 없이 예상 값 캡처
- angr 시도 - 심볼릭 실행은 많은 플래그 검사기를 자동으로 해결
- Qiling 시도 - 외국 아키텍처 바이너리 에뮬레이션 또는 아티팩트 없이 심한 안티디버그 우회
- 실행 수정 전에 제어 흐름 매핑
- 스크립팅을 통한 수동 프로세스 자동화 (r2pipe, Frida, angr, Python)
- 디컴파일러 출력 비교를 통한 가정 검증 (dogbolt.org의 나란히 보기)
빠른 승리 (먼저 시도!)
# 평문 플래그 추출
strings binary | grep -E "flag\{|CTF\{|pico"
strings binary | grep -iE "flag|secret|password"
rabin2 -z binary | grep -i "flag"
# 동적 분석 - 종종 플래그를 직접 캡처
ltrace ./binary
strace -f -s 500 ./binary
# 16진수 덤프 검색
xxd binary | grep -i flag
# 테스트 입력으로 실행
./binary AAAA
echo "test" | ./binary
초기 분석
file binary # 유형, 아키텍처
checksec --file=binary # 보안 기능 (pwn 용)
chmod +x binary # 실행 가능하게 만들기
메모리 덤프 전략
핵심 통찰: 프로그램이 답을 계산하게 한 다음 덤프하세요. 최종 비교에서 중단 (b *main+OFFSET), 올바른 길이의 입력을 아무거나 넣은 후 x/s $rsi로 계산된 플래그를 덤프합니다.
디코이 플래그 탐지
패턴: 실제 검사 전에 여러 개의 가짜 대상. 서로 다른 성공 메시지와 함께 순차적으로 여러 비교 대상을 찾아보세요. 이전 비교가 아닌 최종 비교에 중단점을 설정하세요.
GDB PIE 디버깅
PIE 바이너리는 기본 주소를 무작위화합니다. 상대 중단점을 사용하세요:
gdb ./binary
start # PIE 기본 주소 해석 강제
b *main+0xca # main 기준 상대 주소
run
비교 방향 (중요!)
두 가지 패턴: (1) 변환(플래그) == 저장된_대상 — 변환을 역으로 수행합니다. (2) 변환(저장된_대상) == 플래그 — 플래그가 변환된 데이터이므로 저장된 대상에 변환을 적용하면 됩니다.
일반적인 암호화 패턴
- 단일 바이트 XOR - 256개 값 모두 시도
- 알려진 평문으로 XOR (
flag{,CTF{) - 하드코딩된 키를 사용한 RC4
- 커스텀 순열 + XOR
- 반복 키와 함께 위치 인덱스로 XOR (
^ i또는^ (i & 0xff))
빠른 도구 참조
# Radare2
r2 -d ./binary # 디버그 모드
aaa # 분석
afl # 함수 목록
pdf @ main # main 디스어셈블
# Ghidra (헤드리스)
analyzeHeadless project/ tmp -import binary -postScript script.py
# IDA
ida64 binary # IDA64로 열기
심층 분석 노트
첫 번째 triage 라운드 후 대상 유형을 알게 되면 field-notes.md를 사용하세요.
- 대상 형식: Python 바이트코드, WASM, Android, Flutter, .NET, UPX, Tauri
- 기술 노트: 안티디버그 우회, VM 분석, x86-64 주의사항, 반복 해결사, Unicorn, 타이밍 사이드 채널
- 플랫폼 노트: macOS/iOS, 임베디드 펌웨어, 커널 드라이버, Swift, Kotlin, Go, Rust, D
- 사례 노트: 최신 CTF 특화 리버싱 패턴 및 고전적인 문제 패턴
라우팅 컨텍스트
상위 진입점: skills/SKILL.md (총괄), routing.md
하위 종료점:
- IDA 디컴파일 필요 →
ida-reverse/ - radare2 CLI 분석 필요 →
radare2/ - APK 계층 분석 필요 →
apk-reverse/ - Frida/angr 동적 실행 필요 →
tools-dynamic.md - 안티디버깅 우회 필요 →
anti-analysis.md - 특정 언어 (Go/Rust/Python/WASM) 발생 →
languages*.md - CTF 패턴 발생 →
patterns*.md
동급 관련 모듈: apk-reverse/ (APK에서 .so가 확인되면 본 모듈의 Frida/radare2 분기로 전환 가능)
작업 완료 자체 점검 (완료 주장 전 반드시 통과)
- 워크플로우의 각 단계를 (읽기만 하지 않고) 실행했습니까?
-
tool-index에 기반하여 실제 도구 경로를 사용했습니까? - 재현 가능한 증거 (명령어/스크립트/스크린샷/보고서)를 산출했습니까?
- RULES에서 요구하는 체크리스트 항목을 완료하고 기록했습니까?