콘텐츠로 이동

Miasm - 역공학 프레임워크 치트시트

Miasm - 역공학 프레임워크 치트시트

Miasm은 바이너리를 분석, 생성, 조작하기 위한 무료 오픈 소스 Python 프레임워크입니다. 많은 아키텍처(x86/x64, ARM, MIPS, PPC 등)에서 디스어셈블하고, 자체 **중간 표현(IR)**으로 코드를 승격하고, JIT로 실행을 에뮬레이션하고, 기호 실행을 사용하여 난독화 해제 및 제약 조건 해결을 수행할 수 있습니다. 프로그래밍 도구 키트입니다. Python에서 구동하므로 GUI 도구가 쉽게 스크립팅할 수 없는 역공학 및 언팩 작업을 자동화하는 데 강력합니다.

설치

방법명령어
pippip 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 프레임워크

측면MiasmangrGhidra
언어PythonPythonJava/GUI
IR자체 IRVEXP-code
에뮬레이션기본 JITUnicorn 기반에뮬레이터 API
기호 실행예(핵심 장점)제한됨
최고스크립팅된 분석, 난독화 해제기호/CTF대화식 RE

리소스