声明:
本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
前言:
听说最近某宝水果滑块出了一个bx-pp参数 是wasm加密,抱着好奇的心态打开的网站.
打开网站可以看到这个新的参数bx-pp
我们直接搜bx-pp可以定位到位置接下来跟栈的过程就略过直接到重要的部分,直接定位到下面这个位置,可以看到b应该就是加密的入口 其他则是加密的参数,我们看看参数都传了一些什么.
u:0
f:0
g:"a"
h:"1706839682508"
m:"md5"
k:'qweasdzxcg'
y:'673b248503cfe1dc61cbbe3feb7b6924f9b8ce84081dffc66e3175cb138da6c7db927017d1627c374db7fcb0b9a1931a'
a:'1'
i:'1'
r:'1
w:3000
重复观察几次后发现会变动的参数是h、y 其他参数
我们继续跟进b方法看看,可以看到wasm的身影了,好接下来掏出反编译的工具进行分析
打开Ghidra把wasm下载下来之后拖入分析
我们看到调用的是o.h的方法,同理我们在Ghidra反编译的方法里面找到h方法如下图:
接下来我们据根据网页上的wasm跟Ghidra反编译的c代码进行联调,这里先拿一个func13方法进行讲解
我们可以看到这个部分是取了一个时间戳然后定义了一个1000的值两者进行除的操作我们这个可以在反编译的代码中也看到这个部分
同理下面的代码就是11对应所以我们就可以用代码进行还原
一一对应进行还原成js代码最后可以发现func13主要的操作就是把时间戳分成前十位和后三位,实现的js代码如下:
// js代码实现
t = 1706842045600
QY = t%1000
QZ = parseInt(t/1000)
这里我们可以看出func13处理出来的两个值的用途这里我分开去说先对QZ进行-1操作再经给下面进行循环*0x5851f42d4c957f2d后+1循环的次数就是QY的次数
这里为了方便我直接用c++进行接下来的还原操作
先定义入口然后再定义一个方法把我刚才说的操作用c++代码进行还原接下来的部分还是和一开始的部分一样根据Ghidra进行还原
还原后执行结果如下:
那上面这串字符串什么用呢?我们接着往下看跳过繁琐的过程我们讲最后是如何生成的,我们定位到下面这个部分在浏览器上我们输出一下这个位置的字符串(func6函数作用是获取了内存中这个位置存在字符串的长度)
通过输出我们可以看到三个参数
第一个:32位的值
第二个:明文
第三个:就是我们上面一开始的y值
我们一开始可以看到有个md5的字眼再根据反编译中一段散列的hash算法我们可以大概率猜测第一个值是md5加密值,我们用工具进行校验看看,用加密工具加密明文后可以看到这个值刚好对上32位的值,成功验证了我们的猜想
接着往下看我们可以看到这里有一个类似占位符的代码那是不是这里是把刚才的几个值都填进去呢?
带着猜想我们继续控制台输出,可以看到这不就是我刚才输出的那一段么,到此距离成功复现加密值就差最后一步了
我们接着往下看的时候可以看到这一段代码,熟悉的人可能一眼就看出来这段代码做异或和移位操作去生成字符串
我们写一个算法来实现一下,上面那个是网页生成的下面是根据我们算法生成的我们可以看到在我画红点的部分charcode为10的时候他会处理成a、code为12的时候处理成c 那同理我们也对应处理
修改代码之后再次验证,这次我们可以看到等于true说明加密值对了,至此对于bx-pp的加密整体流程就算是结束了
最后可以直接用python代码还原算法
有兴趣的可以加入我的星球后续会持续分享和更新