本帖最后由 Pueritia 于 2023-4-13 20:40 编辑
本文仅供学习交流使用,如有侵权,联系我删除。
网址:aHR0cHM6Ly9tLndhbmRhY2luZW1hcy5jb20vbG9naW4=
发送验证码后,发现协议头的中的check加密了,在发送方法下断点,往下跟踪
1
找到了加密的方法gowasm.sp,将时间戳,url头等信息传进去加密。
2
跟进去发现调用了wasm的resume方法,本人新手,面对wasm毫无思路,在多方搜索后无果后最后注册吾爱发现不少wasm的逆向文章,
最后参考的:https://www.52pojie.cn/forum.php?mod=viewthread&tid=1492577 成功逆向。
找到wasm的加载的地方,打断点,刷新下网页让他重新加载wasm,注入脚本:
[JavaScript] 纯文本查看 复制代码 wasm = i.instance.exports;
memories = [wasm.memory]
viewDWORD = (addr) =>{
const arr = new Uint32Array(memories[0].buffer.slice(addr, addr + 16));
return arr;
};
viewChar = (addr, size = 16) =>{
const arr = new Uint8Array(memories[0].buffer.slice(addr, addr + size));
return String.fromCharCode.apply(null, arr);
};
viewHEX = (addr, size = 16) =>{
const arr = new Uint8Array(memories[0].buffer.slice(addr, addr + size));
return (Array.from(arr, x =>x.toString(16).padStart(2, '0')).join(' '));
};
viewHexCode = (addr, size = 16) =>{
const arr = new Uint8Array(memories[0].buffer.slice(addr, addr + size));
return (Array.from(arr, x =>'0x' + x.toString(16).padStart(2, '0')).join(', '));
};
dumpMemory = (addr, size = 16) =>{
const arr = new Uint8Array(memories[0].buffer.slice(addr, addr + size));
return arr;
};
viewString = (addr, size = 16) =>{
const arr = new Uint8Array(memories[0].buffer.slice(addr, addr + size));
let max = size;
for (let i = 0; i < size; i++) {
if (arr[i] === 0) {
max = i;
break;
}
}
return String.fromCharCode.apply(null, arr.slice(0, max));
};
search = function(stirng) {
const m = new Uint8Array(memories[0].buffer);
// vid=35402, 9AAizQZJ
// vid=20268, a3fMpSkB
const k = Array.from(stirng, x =>x.charCodeAt());
const match = (j) =>{
return k.every((b, i) =>m[i + j] === b);
};
const max = Math.min(10_000_000, m.byteLength || m.length);
for (let i = 0; i < max; i++) {
if (match(i)) {
console.info(i);
}
}
console.info('done');
}
注入之后就可以通过view方法来查看wasm申请的内存,非常方便。
接上面,在wasm的入口继续往下追踪,发现实际是通过md5加密,在加密方法的入口处下断点,通过viewChar来观察入参。
发现有数据,增加长度后就发现了加密前的字符串,经过验证确认gowasm.sp传入的参数经过加盐操作后md5就得到了check。
同样的,在另一个地方的加密调用的gowasm.sa方法 跟进去后发现使用的AES加密,
这个算法不懂,因为这个wasm是go语言的转的,百度go的ASE算法实现
在wasm找到对应的方法,下断点,成功获取到key。然后mode 和 padding都试一遍就试出来了。
|