echo094 / decode-js

JS混淆代码的AST分析工具 AST analysis tool for obfuscated JS code
MIT License
547 stars 295 forks source link

obfuscator: Fallback模式无法正确分离排序函数及其它细节上的bug #50

Closed Colorsssss closed 8 months ago

Colorsssss commented 8 months ago

脚本链接在这 https://72f8db0415fd.7d36e417.ap-northeast-2.token.awswaf.com/72f8db0415fd/4027e7a6d188/d88522192a3d/challenge.js

F:\decode-js-main\src\plugin\obfuscator.js:308 let loc = path.scope.getBinding(lost).path ^

TypeError: Cannot read properties of undefined (reading 'path') at Program (F:\decode-js-main\src\plugin\obfuscator.js:308:48) at NodePath._call (F:\decode-js-main\node_modules\@babel\traverse\lib\path\context.js:53:20) at NodePath.call (F:\decode-js-main\node_modules\@babel\traverse\lib\path\context.js:40:17) at NodePath.visit (F:\decode-js-main\node_modules\@babel\traverse\lib\path\context.js:100:31) at TraversalContext.visitQueue (F:\decode-js-main\node_modules\@babel\traverse\lib\context.js:103:16) at TraversalContext.visitSingle (F:\decode-js-main\node_modules\@babel\traverse\lib\context.js:77:19) at TraversalContext.visit (F:\decode-js-main\node_modules\@babel\traverse\lib\context.js:131:19) at traverseNode (F:\decode-js-main\node_modules\@babel\traverse\lib\traverse-node.js:24:17) at traverse (F:\decode-js-main\node_modules\@babel\traverse\lib\index.js:62:34) at decodeGlobal (F:\decode-js-main\src\plugin\obfuscator.js:304:7)

lost输出了一下是window

echo094 commented 8 months ago

这是一个使用特定版本的obfuscator混淆的代码(>=2.15.4 javascript-obfuscator/javascript-obfuscator@5683e75a9148585c7efc0d3f48ea225b83cc1e3e, <2.19.0 javascript-obfuscator/javascript-obfuscator@9da81caf3d2dbba50ad57a42fe4f60415933f4c2)。此时StringArray仍使用简单的数组定义,但StringArrayCallsWrapper使用了两层函数的形式。

对于这种StringArray没有明确特征的版本,应该使用Fallback模式通过匹配StringArrayRotateFunction定位。

但是这个脚本的StringArrayRotateFunction与后续业务代码合并到了一个表达式中,导致将业务代码错误的识别为了混淆代码。

以上是第一个问题。

echo094 commented 8 months ago

这个脚本应该是在obfuscator基础上的魔改版本(或者说在使用另一个工具混淆后,使用了obfuscator二次混淆),有些string-array的编码格式和obfuscator的任何版本都对不上。

在解完第一次混淆后,你会发现代码中还会有数十处(局部的)string-array方式混淆,我并不觉得这是手动提取了一段段代码分别混淆的产物,应该是有专门的工具全自动操作。

因此,你需要反复调用obfuscator插件,直到出现Cannot find string list!,表示已经找不到更多的string-array。