SEO

WASM 리버싱 방법 본문

Security/Reversing & Malware

WASM 리버싱 방법

Crain 2024. 11. 20. 01:32
반응형

오늘은 WASM 리버싱 방법에 대해서 포스팅해보려고 합니다.

아직 WASM 관련 문제를 많이 풀어보지는 못했지만, 제가 알게 된 분석 방법들을 정리해보려고 합니다. 추가로 알게 되는 내용이 있다면 계속해서 업데이트 하겠습니다!!


정적 분석 방법

1. WAT(WebAssembly Text Format) 변환

https://github.com/WebAssembly/wabt

 

GitHub - WebAssembly/wabt: The WebAssembly Binary Toolkit

The WebAssembly Binary Toolkit. Contribute to WebAssembly/wabt development by creating an account on GitHub.

github.com

 

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

 

GitHub - vient/wasm2ida: Convert WebAssembly binaries to decompilable ELF non-executables

Convert WebAssembly binaries to decompilable ELF non-executables - vient/wasm2ida

github.com

깃허브에서 발견한 파이썬 코드인데, 3번에서 말한 기능을 자동화해줍니다.

WASM을 바로 IDA에 올려 디컴파일을 해주는 것은 아니고, 3번에서 설명한 WASM -> C -> 바이너리까지의 과정을 자동화해줍니다.

위 코드의 결과로 얻은 바이너리를 IDA에 올려 분석하는 것이 가장 편한 것 같습니다.

mandiant에서 WASM 관련 IDA 플러그인을 깃허브에 올렸던데 그건 디컴파일은 안되는 것 같더라구요?

 

5. Gidra plugin

https://github.com/nneonneo/ghidra-wasm-plugin

 

GitHub - nneonneo/ghidra-wasm-plugin: Ghidra Wasm plugin with disassembly and decompilation support

Ghidra Wasm plugin with disassembly and decompilation support - nneonneo/ghidra-wasm-plugin

github.com

WASM 파일을 디컴파일까지해서 기드라에서 보여주는 플러그인입니다.

기드라 플러그인이 잘되어있다고 들은 적은 있었는데 확실히 확장성은 뛰어난 것 같네요...ㄷㄷㄷ

 

 

 

동적 분석 방법

1. Chrome 개발자 도구를 이용한 BP

Chrome 개발자 도구를 사용해 WASM 코드가 실행되는 시점에 BP를 걸어 분석할 수 있습니다.

이 경우에는 JS와 WASM의 상호작용을 확인하기 좋고, 실시간으로 값의 변화를 추적할 수 있어서 난독화 관련 코드에서 동적으로 보기 좋은 것 같습니다.

 

2. JEB Pro

WASM 파일 분석을 위한 전용 디버거와 디컴파일러를 제공하는 것으로 알고 있는데, WASM 파일을 통해 동적 분석을 할 수 있다는 장점이 있습니다.

편리한 GUI와 스크립팅, 시각화, 플러그인 등 여러가지 장점을 가지고 있습니다.

 

 

 

 

반응형