前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >wasm 在前端安全测试应用中的逆向实战

wasm 在前端安全测试应用中的逆向实战

作者头像
玖柒的小窝
修改2021-11-02 11:05:43
1.8K0
修改2021-11-02 11:05:43
举报
文章被收录于专栏:各类技术文章~

前言

Wasm 是一种底层汇编语言,具有文本格式支持,其目标是可移植、安全和高效。

Wasm 的模块可以被导入的到一个网络 app(或Node.js)中,并且暴露出供 JavaScript 使用的 Wasm 函数。

Wasm 与其他虚拟机的主要区别在于,它没有针对任何特定的编程语言进行优化,而只是抽象底层硬件,字节码直接对应于现代 cpu 的指令和内存模型。

简单的来说就是它是比较底层的汇编语言,它比较难懂,它比较安全

上面的概念部分只是了解下关于 wasm 的基本概念,主要还是得看实操

今日网站

aHR0cHM6Ly9tYXRjaC55dWFucmVueHVlLmNvbS9tYXRjaC8xNQ==

抓包分析与加密定位

访问网站可以看到要求我们获取到当前页面的总数

所以先开抓包看看页面信息的获取

大致分析一下可以知道访问首页是没有加密参数的,但是翻页的时候是需要一个加密参数m

所以需要分析的参数就是这个m

我们找到 js 的堆栈

在第三个的位置可以找到这个 js 加密的位置

可以看到这里提交了参数list,这里的mwindow.m调用后的结果

通过箭头2可以找到window.m的逻辑

这里就引出了window.q这个函数

打上断点再点击翻页可以断在window.q

我们跟进去看看这里window.q的逻辑

通过上一个的js逻辑我们大概可以猜出来上面这一大段应该是来自wasm

文件应该是从/static/match/match15/main.wasm加载

我们找到这个wasm文件

复现

这里的wasm文件拿到了但是我们要怎么去分析它呢?

这里有两种方法,看了下网上关于 wasm 的轮子非常多,可以将 wasm 转换成 c、c++ 等,方法远不只两个

方法一

第一种是使用wasm2js

代码语言:javascript
复制
# 项目地址
https://github.com/thlorenz/wasm2js
复制代码

安装

代码语言:javascript
复制
npm install wasm2js
复制代码

然后可以使用这个包读取这个wasm文件还原成js,然后扣逻辑就可以了

方法二

第二种是使用现成的 python 第三方包pywasm

安装

代码语言:javascript
复制
pip install pywasm
复制代码

使用 demo

代码语言:javascript
复制
import pywasm
# pywasm.on_debug()

runtime = pywasm.load('./examples/fib.wasm')
r = runtime.exec('fib', [10])
print(r) # 55
复制代码

看了下官方的 demo,好像非常简单

那我们也试一下

这里比较难受的是,我们在读取wasm之后要调用那个方法?

还是要找到wasm的入口才行,所以又回到了解析 wasm 的路子上

还好网上轮子不少,下面这个网站提供

wat2wasm demo

wasm2wat demo

两种格式的互转

代码语言:javascript
复制
https://webassembly.github.io/wabt/demo/
复制代码

我们这里需要选择的是wasm2wat,就是将wasm转化为c语言

解析之后的样子像下面这样

这里其实就可以看到大概的逻辑了,这里文件导出了encode,我们可以在外部调用这个方法,传入t1、t2即可

如果你感觉转化为c语言也不是很好懂的话,可以再用下面的这个包

代码语言:javascript
复制
https://github.com/WebAssembly/wabt
https://github.com/WebAssembly/wabt/blob/main/docs/decompiler.md
复制代码

但是编译一次发现还不如wasm2js好用

通过在线编译器我们已经知道了这个 wasm 文件的导出方法是encode,所以试着带入计算

代码语言:javascript
复制
import math
import random
import time
import pywasm


t = int(time.time())
t1 = int(t / 2)
t2 = int(t / 2 - math.floor(random.random() * 50 + 1))
wasm_vm = pywasm.load("demo1.wasm")
m = wasm_vm.exec("encode", [t1, t2])
print(m)
print(str(m) + '|' + str(t1) + '|' + str(t2))
复制代码

这样就可以得出m的值了

之后会再写两篇关于 wasm 的内容,wasm 还是很有意思的,主要是轮子很多可以拿来就用,过程全靠躺

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 今日网站
    • 抓包分析与加密定位
      • 复现
        • 方法一
        • 方法二
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档