WebAssembly
概述
WebAssembly(简称 Wasm)是一项为现代 Web 打造的底层、高性能、可移植的字节码格式。它允许使用 C、C++、Rust 等语言编写的代码,在浏览器中以接近原生应用的速度运行
核心优势
🚄 高性能:Wasm 是一种紧凑的二进制格式,能被浏览器快速解码和编译为机器码。执行效率接近原生程序,非常适合处理计算密集型任务
🛡️ 高安全性:Wasm 代码运行在一个内存安全的沙箱环境中。它无法直接访问系统内存或执行危险操作,并遵循浏览器同源策略,有效保障了用户安全
🌍 可移植性:作为一套 “虚拟指令集架构”,Wasm 代码不依赖特定硬件或操作系统,编译一次即可在各种主流平台(Windows、macOS、Linux)和设备上运行
🔧 语言无关性:它不偏爱任何特定编程语言,可作为 C++、Rust、Go、Python 等多种语言的通用编译目标,让开发者可以用熟悉的语言编写高性能 Web 应用
工作原理
编写源码:开发者使用 C、C++、Rust 等语言编写程序逻辑
编译为 Wasm:通过 Emscripten、wasm-ld 等工具链,将源码编译为 .wasm 的二进制字节码文件
加载与执行:Web 应用通过 JavaScript API(如 WebAssembly.instantiateStreaming())获取并实例化 Wasm 模块
无缝互操作:实例化后,JavaScript 可以调用 Wasm 模块中的函数,Wasm 模块也能回调 JavaScript 函数或调用 Web API
实战案例
webassembly(WASM + XTEA)

WASM 不能直接使用 IDA 打开逆向,需要先转为 C
1 | wasm2c webassembly.wasm -o webassembly.c |

定位到 main() 函数

关键是其中调用的 f15() 函数,在其中看到 var_i3 = 2654435769u;,十六进制是 0x9e3779b9,这是 XTEA/TEA 的经典 delta
函数开头将 Key[4] 设置为了 0
1 | // 从内存地址 var_i0 开始,将连续的 16 字节(128 位)内存空间全部清零 |
加密则是将 0-31 字节分成了四组分别进行 XTEA 加密(AI 给出的,代码太复杂了)
1 | // 第一组 |
代码最后则是在做异或处理,例如第 34 位
1 | var_i1 = i32_load8_s(... +34u); |
将异或的数值提取出来
1 | xor_table = [ |
编写脚本
1 | """ |
