콘텐츠로 이동

diswasm - WebAssembly 디컴파일러 및 역공학 도구 치트시트

diswasm - WebAssembly 디컴파일러 및 역공학 도구 치트시트

diswasm은 WebAssembly (.wasm) 바이너리에 대한 오픈소스 디컴파일러 및 역공학 도구입니다. 더 많은 애플리케이션 로직이 wasm로 배포되고 있습니다 — 브라우저, 엣지 기능, 플러그인, 심지어 악성코드까지 — 분석가들이 이를 읽어야 합니다. diswasm은 wasm 모듈을 파싱하고, 함수를 분석하고, 구조를 복구하고, 스택 머신 바이트코드에서 더 높은 수준의 의사코드를 생성하므로 원본 wasm보다 훨씬 이해하기 쉽습니다. WebAssembly Binary Toolkit (WABT)를 보완하여 완전한 wasm 역공학 워크플로우를 제공합니다.

설치

방법방식
소스에서git clone https://github.com/wasmkit/diswasm && cd diswasm
빌드저장소의 빌드 단계를 따릅니다 (언어별)
보조 도구WABT (wasm2wat) 및 wasm-tools와 쌍을 이루어 사용
확인알려진 .wasm에 대해 실행하고 출력 검토

wasm 먼저 이해하기

개념의미
모듈.wasm 단위: 함수, 메모리, 테이블, 전역 변수
스택 머신wasm은 피연산자 스택에서 실행 (레지스터 없음)
WATWebAssembly 텍스트 형식 (인간이 읽을 수 있는 .wat)
섹션type, import, function, code, data, export, …
타입i32, i64, f32, f64 (참조 타입 포함)

기본 워크플로우

# 1) WABT의 분석기로 구조 검사
wasm2wat module.wasm -o module.wat

# 2) diswasm으로 의사코드에 디컴파일
diswasm module.wasm > module.pseudo

# 3) 복구된 함수 및 제어 흐름 읽기
단계도구출력
분석wasm2wat (WABT).wat 텍스트 (저수준)
디컴파일diswasm의사코드 (고수준)
Objdump 스타일wasm-objdump (WABT)섹션/옵코드

diswasm이 복구하는 것

기능도움이 되는 것
함수 경계각 함수가 시작/종료되는 위치
제어 흐름block/loop/if가 구조화된 코드로 재구성
로컬/매개변수함수당 타입이 지정된 변수
메모리 연산선형 메모리에 대한 로드/저장
가져오기/내보내기호출되는 호스트 함수 / 노출되는 함수

출력 읽기 (분류)

신호찾기
가져온 호스트 함수JS/호스트 호출 (env.*)이 기능 드러냄
문자열/데이터 섹션임베드된 상수, URL, 키
내보낸 함수모듈의 진입점
메모리 증가 / 대량 연산압축 해제 또는 큰 버퍼
간접 호출함수 테이블 디스패치 (난독화)

보조적인 wasm 도구

도구역할
diswasmwasm을 의사코드로 디컴파일
WABT (wasm2wat, wasm-objdump)분석 / 검사
wasm-toolsRust 저수준 조작/검증
Binaryen (wasm-dis)컴파일러 급 분석/최적화
Ghidra + wasm 플러그인완전한 역공학 환경

일반적인 워크플로우

# 미지의 브라우저 wasm 페이로드 분석
wasm2wat suspicious.wasm -o suspicious.wat   # 구조
diswasm suspicious.wasm > suspicious.c       # 읽을 수 있는 로직
grep -iE "fetch|eval|XMLHttp|import" suspicious.wat  # 기능

# wasm 모듈의 두 버전 비교
diswasm v1.wasm > v1.pseudo; diswasm v2.wasm > v2.pseudo
diff v1.pseudo v2.pseudo

diswasm vs 다른 접근법

측면diswasmwasm2wat (WABT)JEB (상용)
출력 수준의사코드저수준 WAT의사코드 디컴파일러
비용무료/오픈소스무료/오픈소스상용
최적 용도빠른 읽을 수 있는 디컴파일충실한 분석깊고 세련된 역공학

자료