某乎x96jsvmp算法还原新手初体验

admin 2022年6月7日23:18:55评论112 views字数 1814阅读6分2秒阅读模式

某乎x96jsvmp算法还原新手初体验

跟栈跟值分析移步大佬文章 没人比大佬更详细 这里主要分析还原算法

样本:aHR0cHM6Ly93d3cuemhpaHUuY29tLw==


主要日志断点位置:

e.r[this.s][r](i[0], i[1]) -->主要是charCodeAt和charAt

e.r[this.c] + e.r[this.n] -->  密文拼接

e.r[this.c] | e.r[this.n]  -->  对每组每个元素的运算

e.r[this.c] & e.r[this.n] --> 密文运算  

e.r[this.c] >>> e.r[this.n] --> 每组二 三 四次密文运算

不妙 这里说完了怎么分析


直接进入算法分析环节

查看日志 从结果反跟 获得信息:密文为 'aXFqc4uykHtY6Rt0M_Y8FD98e8NpgU28G0Yyo09yoTNX'  当然这里是正确的结果

某乎x96jsvmp算法还原新手初体验

   

再往上看 发现 是计算出每个值并拼接而成 且仔细的靓仔也发现了 "X" 来自对照表.charAt(4,) 那么 "4" 来自哪里内 我们接着往上

某乎x96jsvmp算法还原新手初体验

     

push(4) pop(4)没用 接着往上

锵锵 对left值进行 & 63 得到 那么接着跟left的4

   

某乎x96jsvmp算法还原新手初体验

 

又是两个值运算  注意这两个值  经过1204791  >>> 得到4 charAt(4,) = “X”   当然还对1204791有兴趣 上跟

某乎x96jsvmp算法还原新手初体验

     

没有发现 right值18 反倒是一直在用left的值1204791 又对其12- 6- 63运算 并得到了密文后四位"oTNX"  继续跟1204791的生成 搜索 = 1204791

某乎x96jsvmp算法还原新手初体验

某乎x96jsvmp算法还原新手初体验

     

也是两个值运算得到  right值就在上面  这么近先跟它

某乎x96jsvmp算法还原新手初体验

     

两个值运算  好家伙永无止境了嘛 不是

某乎x96jsvmp算法还原新手初体验

     

终于看到传入的明文了 取了下标0并charCodeAt 明明是最后一个密文拼接还取0  搜索"8b7997937c8e4f4a0ca46008f9285561u0000".charCodeAt(  嗯 是倒着取明文的

某乎x96jsvmp算法还原新手初体验

某乎x96jsvmp算法还原新手初体验

     

所以前面1204791 的right值= charCodeAt(0,) ^ 42  << 16  当然42 和16 都是根据加密轮数变化的

1204791的left值就长跟短说 搜索 = 25143


删去点没有的日志 1204791的left值 = 55  |  charCodeAt(1,) << 8   这么简单 不是 由跑出个55是未知的 还有前面不是 << 16  这里又<< 8

     

某乎x96jsvmp算法还原新手初体验

只对charCodeAt(1,)  ^ 0   嗯 四个密文到头了  取了前三个下标内容 猜测就是倒序3个一组

     

某乎x96jsvmp算法还原新手初体验

单单一组 "oTNX" 的结束了 纵观全局也是这样处理的 无非运算时对几个固定值随加密轮数变化

结论

某乎x96jsvmp算法还原新手初体验

 

算法

测试这个函数,与浏览器生成的值是一样的   当然可以写的更优雅点



var jjj = "RuPtXwxpThIZ0qyz_9fYLCOV8B1mMGKs7UnFHgN3iDaWAJE-Qrk2ecSo6bjd4vl5"function sign(data){ let a = b = c = 0 let A = [42,0,0,0] let B = [8,16,8,16] let C = [63,6,12,18] let len = data.length len % 3 == 1 ? data += "u0000u0000" : len % 3 == 2 ? data += "u0000" : null len = data.length let result = '' function AA(){ a == A.length ? a = 0:null return A[a++] } function BB(){ b == B.length ? b = 0:null return B[b++] } function CC(){ c == C.length ? c = 0:null return C[c++] } for(;len > 0; len = len-3) { let D = (data.charCodeAt(len -1) ^ AA()) | ((data.charCodeAt(len -2) ^ AA()) << BB()) let E = D | ((data.charCodeAt(len -3) ^ AA()) << BB()) result += jjj.charAt(E & CC()) result += jjj.charAt((E >>> CC()) & 63) result += jjj.charAt((E >>> CC()) & 63) result += jjj.charAt((E >>> CC()) & 63) } return result}//sign(data)


该内容转载自网络,更多内容请点击“阅读原文”

某乎x96jsvmp算法还原新手初体验



原文始发于微信公众号(web安全工具库):某乎x96jsvmp算法还原新手初体验

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月7日23:18:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某乎x96jsvmp算法还原新手初体验http://cn-sec.com/archives/1095691.html

发表评论

匿名网友 填写信息