js逆向|对wasm文件的两种简单解法
关注它,不迷路。
之前写过一篇文章,使用pywasm来导出wasm里的函数,具体内容见下面的文章:
JS逆向:Wasm文件导出函数的调用|猿人学爬虫对抗赛第十五题
依然以猿人学的题目作为练手地址,看看今天介绍的2种wasm文件的解法。
一,使用WebAssembly.instantiate方法。
我们看到网站上有这样的一段代码:
我们可以依葫芦画瓢,写出类似的代码:
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
以上,就是今天的全部内容,感谢阅读。