일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- h4ckinggame
- BoB 12기 최종합격 후기
- bob
- 사회적 사실
- 에밀 뒤르켐
- CodeEngn
- codeengn basic rce 01
- 논문리뷰
- CodeEngn Basic 5
- 디지털 포렌식 트랙
- Best of the Best
- CodeEngn Basic 01
- 사회분업론
- 철학
- 리버싱
- malware
- 코드엔진 베이직
- 코드엔진 basic 5
- 코드엔진
- BoB 12기
- 자살론
- Today
- Total
SEO
WASM 리버싱 방법 본문
오늘은 WASM 리버싱 방법에 대해서 포스팅해보려고 합니다.
아직 WASM 관련 문제를 많이 풀어보지는 못했지만, 제가 알게 된 분석 방법들을 정리해보려고 합니다. 추가로 알게 되는 내용이 있다면 계속해서 업데이트 하겠습니다!!
정적 분석 방법
1. WAT(WebAssembly Text Format) 변환
https://github.com/WebAssembly/wabt
WABT(WebAssembly Binary Toolkit)를 이용하면 WASM 파일을 WAT 형식으로 쉽게 변환해서 볼 수 있습니다.
변환된 WAT 코드의 예시입니다.
(module
(type $t0 (func (param i32 i32) (result i32)))
(func $add (export "add") (type $t0) (param $p0 i32) (param $p1 i32) (result i32)
local.get $p0
local.get $p1
i32.add))
이 경우에는 WASM 문법에 대한 이해가 필요하고 복잡한 로직의 경우 분석의 난이도가 매우 높아지게됩니다.
WASM 문법을 처음 공부할 때는 WAT 형식으로 보는 것이 도움이 많이 될 것 같습니다.
2. WASM Decompile
마찬가지로 WABT에서는 C-like 스타일의 디컴파일 기능도 지원해줍니다.
global g_a:int = 1048576;
table T_a:funcref(min: 20, max: 20);
function f_c(a:{ a:int, b:int, c:int, d:int }) {
var b:int;
var f:int_ptr;
var d:int_ptr;
var e:int_ptr;
a = f_gb(a);
var c:int_ptr = f_db(a, b = f_xa(a));
if (f_ya(a)) goto B_i;
d = a.a;
if (f_ra(a)) goto B_h;
b = b + d;
a = f_eb(a, d);
if (a == 1049808[0]:int) {
if ((c[1] & 3) != 3) goto B_i;
1049800[0]:int = b;
f_ba(a, b, c);
goto B_a;
}
if (d >= 256) {
f_i(a);
goto B_i;
}
e = (a + 12)[0]:int;
if (e != (f = (a + 8)[0]:int)) {
f[3] = e;
e[2] = f;
goto B_i;
}
간단한 코드나 작은 데이터가 하드코딩된 경우에는 쉽게 C-like 수도코드로 볼 수 있어 편한 것 같습니다.
관련 문제를 풀어보며 느낀점은 WASM Decompile의 경우, 하드코딩된 데이터 쪽이 예쁘게 디컴파일되지는 않는 것 같습니다. IDA만큼 깔끔하게 디컴파일을 해주지는 않아서 복잡한 구조는 조금 해석하기 어려운 감이 있습니다.
3. WASM2C
WABT에서는 WASM을 C 코드로 변환해주는 기능도 포함하고 있습니다.
예전에는 이렇게 생성된 C 코드를 다시 빌드하여 바이너리로 만들고, 이를 IDA에 올려 분석하는 경우가 많았던 것 같습니다.
4. WASM2ida
https://github.com/vient/wasm2ida
깃허브에서 발견한 파이썬 코드인데, 3번에서 말한 기능을 자동화해줍니다.
WASM을 바로 IDA에 올려 디컴파일을 해주는 것은 아니고, 3번에서 설명한 WASM -> C -> 바이너리까지의 과정을 자동화해줍니다.
위 코드의 결과로 얻은 바이너리를 IDA에 올려 분석하는 것이 가장 편한 것 같습니다.
mandiant에서 WASM 관련 IDA 플러그인을 깃허브에 올렸던데 그건 디컴파일은 안되는 것 같더라구요?
5. Gidra plugin
https://github.com/nneonneo/ghidra-wasm-plugin
WASM 파일을 디컴파일까지해서 기드라에서 보여주는 플러그인입니다.
기드라 플러그인이 잘되어있다고 들은 적은 있었는데 확실히 확장성은 뛰어난 것 같네요...ㄷㄷㄷ
동적 분석 방법
1. Chrome 개발자 도구를 이용한 BP
Chrome 개발자 도구를 사용해 WASM 코드가 실행되는 시점에 BP를 걸어 분석할 수 있습니다.
이 경우에는 JS와 WASM의 상호작용을 확인하기 좋고, 실시간으로 값의 변화를 추적할 수 있어서 난독화 관련 코드에서 동적으로 보기 좋은 것 같습니다.
2. JEB Pro
WASM 파일 분석을 위한 전용 디버거와 디컴파일러를 제공하는 것으로 알고 있는데, WASM 파일을 통해 동적 분석을 할 수 있다는 장점이 있습니다.
편리한 GUI와 스크립팅, 시각화, 플러그인 등 여러가지 장점을 가지고 있습니다.
'Security > Reversing & Malware' 카테고리의 다른 글
Control ID로 MFC 호출 함수를 찾아보자 (MFC 리버싱) (0) | 2024.04.11 |
---|---|
LockBit 2.0으로 알아보는 Anti-Debugging 기술 - NtGlobalFlag (0) | 2024.04.01 |
LockBit 2.0으로 알아보는 COM 객체를 이용한 UAC Bypass 기법 (0) | 2024.03.18 |
[은닉 기법] 자가 삭제/코드 조각화/프로세스 할로윙 (0) | 2024.03.13 |
[AV 탐지 우회 기법] Polymorphic 및 Metamorphic 기법 (다형성 및 변형 악성코드) (0) | 2024.03.10 |