WASM逆向分析

wasm是基于堆栈的虚拟机的二进制指令格式。在这次比赛中遇到,记录一下。

 

IDA反编译插件

下载地址:https://github.com/fireeye/idawasm

 

食用方法:

  • install the python module:

    python.exe setup.py install

  • manually install the WebAssembly file loader:

    mv loaders\wasm_loader.py %IDADIR%\loaders\wasm_loader.py

  • manually install the WebAssembly processor:

    mv procs\wasm_proc.py %IDADIR%\procs\wasm_proc.py

 

WASM编译环境搭建

git clone https://github.com/juj/emsdk.git

cd emsdk

./emsdk install --build=Release sdk-incoming-64bit binaryen-master-64bit

./emsdk activate --global --build=Release sdk-incoming-64bit binaryen-master-64bit

source ./emsdk_env.sh

 

编译C为WASM

emcc biu.c -s WASM=1 -o biu.html -g4 -O2

 

-s WASM=1指定输出为wasm形式,Emscripten默认为asm.js的形式

-o biu.html可以指定生成html文件、以及wasm文件

-g4指定debug信息等级,详情看—-help

-O2指定优化等级,详情看—-help

 

WABT工具包

WABT(我们将其称为“ wabbit”)是用于WebAssembly的一套工具,包括:

  • wat2wasm:从 WebAssembly文本格式转换为 WebAssembly二进制格式
  • wasm2wat wat2wasm的逆函数,从二进制格式转换回文本格式(也称为.wat)
  • wasm-objdump:显示有关wasm二进制文件的信息。与objdump类似。
  • wasm-interp:使用基于堆栈的解释器解码并运行WebAssembly二进制文件
  • wasm-decompile:将wasm二进制文件反编译为可读的类似C的语法。
  • wat- desugar:解析规范解释程序支持的.wat文本格式(S表达式,平面语法或混合格式)并打印“规范”平面格式
  • wasm2c:将WebAssembly二进制文件转换为C源代码和标头
  • wasm-strip:删除WebAssembly二进制文件的部分
  • wasm-validate:验证WebAssembly二进制格式的文件
  • wast2json:将wasm spec测试格式的文件转换为JSON文件和关联的wasm二进制文件
  • wasm-opcodecnt:计算指令的操作码使用量
  • spectest-interp:读取Spectest JSON文件,然后在解释器中运行其测试

将wasm转换为C语言,主要用到wasm2c

 

食用方法

git clone --recursive https://github.com/WebAssembly/wabt

cd wabt

mkdir build

cd build

cmake ..

cmake --build .

 

 

wasm2c使用

测试文件:https://lanzous.com/id1pybe

/home/ubuntu/wabt/build/wasm2c chall.wasm -o out.c

将chall.wasm转换为out.c

此时的C代码并不直观。

 

优化

 将之前反编译出来的wasm.c,wasm.h,以及wabt项目内的wasm-rt.h,wasm-rt-impl.c,wasm-rt-impl.h三个文件放到同一个文件夹。

gcc -c out.c -o out.o

 

这样得到的源文件在IDA中分析就会轻松一些

 

i32_load形式的函数为取值函数,第一个参数为取值对象,第二个参数为偏移
i32_store形式的函数为操作存储函数,第一个参数为存储对象,第二个参数为存储位置,第三个参数为操作方式

 

动态调用

Python开启服务器

全局安装

npm i http-server -g

快速使用

http-server

默认端口8080,指定端口

http-server <path> -a 127.0.0.1 -p 8090

如果路径中有index.html,默认为主页

 

HTML调用

参考:https://developer.mozilla.org/zh-CN/docs/WebAssembly/Using_the_JavaScript_API

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Simple template</title>
    <script>
        fetch('chall.wasm')
    .then(res =>
      res.arrayBuffer()
    ).then(bytes =>
      WebAssembly.instantiate(bytes, importObject)
    ).then(results => {
      results.instance.exports.exported_func();
    });
    </script>
  </head>
  <body>
  </body>
</html>

chall.wasm放在与index.html同目录

 

 其他

https://xz.aliyun.com/t/5170

https://xz.aliyun.com/t/2854

https://www.anquanke.com/post/id/179556

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebAssembly(Wasm)可以与FFmpeg集成,以在网页中进行视频处理和编解码操作。通过结合Wasm和FFmpeg,您可以在浏览器中实现强大的视频处理功能,如转码、剪辑、水印添加等。 以下是使用Wasm和FFmpeg进行视频处理的一般步骤: 1. 获取FFmpeg的Wasm版本:首先,您需要获取FFmpeg的Wasm版本。有一些项目在GitHub上提供了编译好的Wasm版本,您可以从这些项目中获取FFmpeg的Wasm文件。 2. 加载Wasm模块:将FFmpeg的Wasm文件加载到您的网页中。您可以使用JavaScript的WebAssembly API来加载和实例化Wasm模块。 3. 初始化FFmpeg:在Wasm模块加载完成后,您需要通过调用FFmpeg的初始化函数来初始化FFmpeg环境。这通常涉及到设置输入输出流、注册解码器和编码器等操作。 4. 执行视频处理操作:一旦FFmpeg成功初始化,您可以使用FFmpeg提供的各种函数执行视频处理操作。例如,您可以调用解码函数将视频解码为原始帧数据,然后对帧数据进行处理,最后调用编码函数将处理后的帧数据编码为目标视频格式。 5. 输出处理结果:根据您的需求,您可以将处理后的视频保存到本地文件或直接在网页上播放。 请注意,在使用Wasm和FFmpeg进行视频处理时,考虑到性能和资源的限制是非常重要的。视频处理通常是一项计算密集型任务,可能会对浏览器的性能产生一定的影响。因此,您应该仔细考虑处理的复杂性,并评估在特定设备和浏览器上的性能表现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值