最近无意中拿了两套源码,刚想审计时发现控制器等主逻辑文件做了混淆,内容如:
简单尝试后发现我解混淆的能力不足以解开这串东西,于是简单搜索了一些关键字,如sg_load这个函数,会发现这种混淆是一个名为SourceGuardian的php拓展,sg_load源自该拓展的某个函数,搜索了一下发现网上的解密都是需要人工解密,自然并不会免费提供,根据某些文章记叙是利用php vld 扩展显示opcode去解密sg11。
拿到源码后本想搭建起来玩玩,但奈何验证码功能跑不了,源码又加密改不了,单独访问后发现是SourceGuardian在作祟,需要我本地也安装一个拓展。
安装起来倒是简单,官网:https://www.sourceguardian.com/loaders/download.php
直接把我们的phpinfo内容贴到上面进行探测,随后会给出对应系统对应的方案,例如我是macos下的php7环境,他首先给出我所缺的拓展的下载链接。
将拓展丢到拓展目录下,修改配置,加上extension=ixed.7.0.dar,重启服务器即可,其实就是普通的添加一个php拓展的操作。
这时候再去访问发现站点已经能够正常运行了,但是缺少域名授权,进不去后台,简单尝试一番,发现还是只能从源码的解混淆入手。
项目地址:https://github.com/derickr/vld.git
依次使用:phpize、./configure、make && make install即可编译好vld拓展,将拓展添加到配置文件内即可。
SourceGuardian它会将源代码编译为混淆过的opcode,然后丢入sg_load函数内执行,要解密只能从opcode入手,通常来说,sg加密都是会在文件末端调用如:return sg_load('12345678CHECKSUM/BASE64/BASE64/BASE64/BASE64=');
那么在解混淆时用到的一个方案就是利用vld去将代码转为opcode,通过手动逆向opcode去还原代码,然而在最终触发点为sg_load的源码中我无法复现这一操作,因为转出来的opcode最最终只会呈现为调sg_load,而参数为我想获得的代码的opcode,如:
同时需要明确一点,前面也提到了,sg11加密他会对源码的opcode也进行混淆,而vld拓展是不具备对混淆后的opcode做分析的能力,这一点在vld项目中也是明确提出了。那么我们要解混淆实际上只需要魔改vld即可,参照:https://blog.zsxsoft.com/post/40
在一些混淆中只是将php代码进行加密,而在php源码中的compile_file或者compile_string函数皆是用于将php代码转为opcode,而这些混淆在代码运行时需要进行解密,最后调用的依旧是compile,此时hook住函数即可简单取得解密后的php源码,而vld拓展hook的正是这两处,这也正是我们使用vld时他会原样吐出sg_load和base64样式参数的原因,需知道直到sg_load之前的内容,对我们还原源码而言并没有什么用处,也就是说原生的vld中关于compile的hook输出我们可以直接删减掉。
由于opcode的调用在于zend_execute,这也就意味着对于sg11加密而言,只需要在vld_execute_ex中调用vld_dump_oparray输出我们的op_array即可获取到opcode。
说了这么多,已经有师傅写好这一个vld针对sg11的patch了:https://github.com/clouds-flight/php7-vld-sg11-patch
需要注意的是,patch仅作用于vld0.17.0版本。
patch后执行php -dvld.active=1 -dvld.execute=0 Index.php就能够看到一些比较令人欣慰的内容了:
到此还没有结束工作,因为要做的内容是还原代码,关于转储的opcode需要关注的有几列:
首先是第一行Function getreturn表明这一部分是getreturn这一个函数编译出的opcode,也就是getreturn函数包括参数,代码,逻辑等都在这一部分呈现。
compiled vars指的是php程序中定义的变量,在此表明这一个函数的参数,而在opcode中使用!n来替代参数,这里表明函数有code、msg、data这三个参数。
至于opcode可参照:https://www.wenjiangs.com/docs/php-7-docs
那么还原也就不难了,函数内容实际上就是初始化一个数组,将三个参数加入数组后作为返回值,即:
原文始发于微信公众号(山石网科安全技术研究院):SourceGuardian代码混淆的还原分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论