Miasm - 역공학 프레임워크 치트시트
Miasm은 바이너리를 분석, 생성, 조작하기 위한 무료 오픈 소스 Python 프레임워크입니다. 많은 아키텍처(x86/x64, ARM, MIPS, PPC 등)에서 디스어셈블하고, 자체 **중간 표현(IR)**으로 코드를 승격하고, JIT로 실행을 에뮬레이션하고, 기호 실행을 사용하여 난독화 해제 및 제약 조건 해결을 수행할 수 있습니다. 프로그래밍 도구 키트입니다. Python에서 구동하므로 GUI 도구가 쉽게 스크립팅할 수 없는 역공학 및 언팩 작업을 자동화하는 데 강력합니다.
설치
| 방법 | 명령어 |
|---|
| pip | pip install miasm |
| 소스에서 | git clone https://github.com/cea-sec/miasm && cd miasm && pip install -e . |
| 선택 JIT (LLVM) | pip install llvmlite(더 빠른 에뮬레이션 백엔드) |
| Docker | 저장소에서 docker build -t miasm . |
| 확인 | python -c "import miasm; print('ok')" |
핵심 모듈
| 모듈 | 목적 |
|---|
miasm.analysis.binary | 바이너리 컨테이너 로드(ELF/PE/raw) |
miasm.analysis.machine | 아키텍처 추상화(Machine("x86_64")) |
miasm.core.locationdb | 분석 전체에서 주소/레이블 추적 |
miasm.ir | 명령어의 중간 표현 |
miasm.analysis.dse | 동적 기호 실행 엔진 |
miasm.jitter | 에뮬레이션/JIT 엔진 |
디스어셈블리
from miasm.analysis.binary import Container
from miasm.analysis.machine import Machine
from miasm.core.locationdb import LocationDB
loc_db = LocationDB()
cont = Container.from_stream(open("target.bin", "rb"), loc_db)
machine = Machine(cont.arch)
mdis = machine.dis_engine(cont.bin_stream, loc_db=loc_db)
asmcfg = mdis.dis_multiblock(cont.entry_point) # 재귀 디스어셈블리 → CFG
for block in asmcfg.blocks:
print(block)
| 호출 | 설명 |
|---|
mdis.dis_block(addr) | 단일 기본 블록 디스어셈블 |
mdis.dis_multiblock(addr) | CFG로 재귀 디스어셈블 |
asmcfg.blocks | 기본 블록 반복 |
asmcfg.dot() | 제어 흐름 그래프를 Graphviz로 내보내기 |
중간 표현(IR)
lifter = machine.lifter_model_call(mdis.loc_db)
ircfg = lifter.new_ircfg_from_asmcfg(asmcfg)
for lbl, irblock in ircfg.blocks.items():
print(irblock)
IR은 아키텍처 특정 명령어를 작은 타입 언어로 정규화하며, 이는 크로스 아키텍처 분석 및 기호 추론을 가능하게 합니다.
에뮬레이션(Jitter)
from miasm.analysis.machine import Machine
jitter = Machine("x86_64").jitter("llvm") # 또는 "python", "gcc"
jitter.init_stack()
# 코드 매핑, 레지스터 설정, 그런 다음:
jitter.run(0x401000)
| 백엔드 | 트레이드오프 |
|---|
python | 휴대 가능, 가장 느림 |
gcc | 더 빠름, 컴파일러 필요 |
llvm | 가장 빠름, llvmlite 필요 |
| 기능 | 사용 |
|---|
add_breakpoint(addr, cb) | 주소에서 Python 콜백 실행 |
vm.set_mem(addr, data) | 실행 전 메모리 쓰기 |
| 사용자 정의 syscalls/APIs | 에뮬레이션 중 라이브러리 호출 훅 |
기호 실행
from miasm.ir.symbexec import SymbolicExecutionEngine
sb = SymbolicExecutionEngine(lifter)
symbolic_pc = sb.run_at(ircfg, 0x401000)
print(sb.symbols) # 기호 레지스터/메모리 상태
기호 실행은 난독화 해제, 입력 해결, 불필요한 코드/불명확한 조건 단순화의 기초입니다.
일반적인 워크플로우
| 목표 | 접근법 |
|---|
| CFG를 보기 위해 내보내기 | asmcfg.dot() → Graphviz로 렌더링 |
| 언팩/난독화 해제 | jitter로 에뮬레이션, OEP에서 메모리 덤프 |
| 입력 해결 | 기호 실행 + SMT 솔버(z3) |
| 크로스 아키텍처 분석 | IR로 승격, 아키텍처에 관계없이 동일한 패스 실행 |
Miasm vs 다른 RE 프레임워크
| 측면 | Miasm | angr | Ghidra |
|---|
| 언어 | Python | Python | Java/GUI |
| IR | 자체 IR | VEX | P-code |
| 에뮬레이션 | 기본 JIT | Unicorn 기반 | 에뮬레이터 API |
| 기호 실행 | 예 | 예(핵심 장점) | 제한됨 |
| 최고 | 스크립팅된 분석, 난독화 해제 | 기호/CTF | 대화식 RE |
리소스