js逆向|对wasm文件的两种简单解法

关注它,不迷路。

之前写过一篇文章,使用pywasm来导出wasm里的函数,具体内容见下面的文章:

JS逆向:Wasm文件导出函数的调用|猿人学爬虫对抗赛第十五题

依然以猿人学的题目作为练手地址,看看今天介绍的2种wasm文件的解法。

一,使用WebAssembly.instantiate方法

我们看到网站上有这样的一段代码:

a610840e32cd11e0d1564d9d9577bdad.png

我们可以依葫芦画瓢,写出类似的代码:

exports.yrx15_wasm = (buf)=>{
    let wasm_buffer = new Uint8Array(buf).buffer
    res = WebAssembly.instantiate(wasm_buffer)
    return res.then(
        res => {
            instance = res.instance
            q = instance.exports.encode
            m = function () {
                t1 = parseInt(Date.parse(new Date()) / 1000 / 2);
                t2 = parseInt(Date.parse(new Date()) / 1000 / 2 - Math.floor(Math.random() * (50) + 1));
                return q(t1, t2).toString() + '|' + t1 + '|' + t2;
            }
            return m()
        }
    )
}

再使用 node_vm2 这个库来调用这段js,参数buf传递的是Python里的list类型数据:

with open("main.wasm","rb") as fp:
  wasm_buf = fp.read()


wasm_buf = (list(wasm_buf))




with NodeVM.code(js) as nodevm:
    print(nodevm.call_member('yrx15_wasm',wasm_buf))

两段代码合并,运行后,即可拿到正确的结果。

以上思路由 @包子 提供,再此感谢。

一,使用wasm2js这个库导出加密函数

直接安装wasm2js这个库,github地址在这里:

https://github.com/thlorenz/wasm2js

按照它提供的方法,把wasm文件转成js代码:

const wasm2js = require('wasm2js');
const fs = require('fs');


const wasmBuffer  = fs.readFileSync("main.wasm");
const js = wasm2js(wasmBuffer);


fs.writeFile("result.js", js, (err) => {});

运行这段js后,js代码保存到了 result.js 文件里面。打开这个文件,在后面添加如下代码:

t1 = parseInt(Date.parse(new Date())/1000/2);
t2 = parseInt(Date.parse(new Date())/1000/2 - Math.floor(Math.random() * (50) + 1));


let res = loadWebAssembly().exports.encode(t1,t2);


res = res.toString() + '|' + t1 + '|' + t2;


console.log(res);

运行后,即可拿到结果。这里的 encode 即为导出的方法。

以上思路由 @朱子育 提供,再此感谢。

以上完整代码及运行实例均放在星球的  wasm专题 里了,地址:

https://t.zsxq.com/3FIUBQj

以上,就是今天的全部内容,感谢阅读。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值