在漏洞挖掘过程中,通常会遇到被商业编码器保护的PHP代码。这些编码器将原始的PHP源代码编译为Z引擎的字节码,然后对这些字节码进行编码和混淆,混淆结果如下所示:
遗憾的是,目前没有免费或开源的工具可以解码受商业编码器保护的PHP脚本,就像没有用于反编译ZVM操作码的工具一样。针对此类情况,我们进行以下操作。
ZEngine在执行PHP脚本时起着至关重要的作用,既作为编译器,又作为运行时环境。执行过程从解析源代码开始,将其转换为抽象语法树(AST)。接着,AST被转化为Z虚拟机的操作码,最后由虚拟机执行这些操作码。
如前所述,商业编码器处理除最后一步之外的每个步骤:操作码的执行。编译后,编码器并不执行操作码,而是将操作码与元数据一起序列化,编码生成的二进制数据(blob),并封装在引导脚本中。当执行编码脚本时,会发生逆向过程:解码和反序列化blob,将操作码及其元数据加载到Z虚拟机中,最后执行操作码。
在本研究中,我对其中一个最广泛使用的PHP代码商业编码器的加载器进行了分析。为此,我创建了一种工具,可以从编码的PHP脚本中提取并反汇编ZEngine的操作码。以下是该工具工作原理的简要说明。
源代码:
?phpfunctionget_hello_text($name){return"Hello,".$name;}echoget_hello_text("PTSWARM");
编码脚本反汇编结果:
虽然反汇编的结果已经足以进行漏洞分析和搜索,但为了简化工作并最终获得更接近于常规PHP源代码的内容,我们进行了以下操作。
为Z虚拟机开发反编译器是一项棘手的任务。有超过200个操作码,开发过程非常耗时。虽然我可以使用Ghidra灵活的SLEIGH规范语言,就像我的同事为V8所做的那样,但我正在寻找一个更简单的解决方案。
我要求微软的Copilot聊天机器人反编译ZEngine操作码,并且它成功了!
请求聊天机器人反编译注释块中的PHP操作码
聊天机器人使用反编译代码的回答
然而,这感觉太简单了,所以我决定尝试反编译一些更复杂的东西。
我随机选取了一个WordPress函数,用保护器对其进行编码,然后对其进行解码和反汇编。我将结果发送到聊天室,并要求将注释块中的ZEngine操作码转换为PHP代码。
反汇编程序列表
反编译结果
我还采用了RC4函数代码,并通过发送以下请求执行了同样的操作:将注释块中的PHP操作码转换为PHP代码。
反汇编程序列表
反编译结果
接下来我运行了反编译的代码来验证它。
值得注意的是,使用AI聊天机器人进行代码反编译时,结果的质量可能会有显著差异。在某些情况下,AI可以准确地从操作码中恢复源代码,实现100%的准确性。然而,在其他情况下,结果可能不够准确,导致诸如嵌套循环被忽略等问题。此外,请求长度的限制也是一个挑战。当发送非常长的代码进行反编译时,聊天机器人可能由于数据处理能力的限制而无法完成任务。在这种情况下,可能需要将代码分割成较小的部分,或者缩短请求,只保留需要分析的关键片段。尽管如此,AI生成的结果仍能简化操作码列表的解读,该工具值得投入时间进行研究。
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。