SourceGuardian代码混淆的还原分析

admin 2022年8月24日22:34:32评论167 views字数 2640阅读8分48秒阅读模式

SourceGuardian代码混淆的还原分析
 1.  前 言 



最近无意中拿了两套源码,刚想审计时发现控制器等主逻辑文件做了混淆,内容如:

SourceGuardian代码混淆的还原分析

1 混淆代码

简单尝试后发现我解混淆的能力不足以解开这串东西,于是简单搜索了一些关键字,如sg_load这个函数,会发现这种混淆是一个名为SourceGuardianphp拓展,sg_load源自该拓展的某个函数,搜索了一下发现网上的解密都是需要人工解密,自然并不会免费提供,根据某些文章记叙是利用php vld 扩展显示opcode去解密sg11


SourceGuardian代码混淆的还原分析
 2. sg11 



拿到源码后本想搭建起来玩玩,但奈何验证码功能跑不了,源码又加密改不了,单独访问后发现是SourceGuardian在作祟,需要我本地也安装一个拓展。


SourceGuardian代码混淆的还原分析

2 报错


安装起来倒是简单,官网:https://www.sourceguardian.com/loaders/download.php

直接把我们的phpinfo内容贴到上面进行探测,随后会给出对应系统对应的方案,例如我是macos下的php7环境,他首先给出我所缺的拓展的下载链接。

将拓展丢到拓展目录下,修改配置,加上extension=ixed.7.0.dar,重启服务器即可,其实就是普通的添加一个php拓展的操作。

这时候再去访问发现站点已经能够正常运行了,但是缺少域名授权,进不去后台,简单尝试一番,发现还是只能从源码的解混淆入手。


SourceGuardian代码混淆的还原分析
 3. vld 拓展 


项目地址:https://github.com/derickr/vld.git

依次使用:phpize./configuremake && make install即可编译好vld拓展,将拓展添加到配置文件内即可。

SourceGuardian代码混淆的还原分析
 4.  分析


SourceGuardian它会将源代码编译为混淆过的opcode,然后丢入sg_load函数内执行,要解密只能从opcode入手,通常来说,sg加密都是会在文件末端调用如:return sg_load('12345678CHECKSUM/BASE64/BASE64/BASE64/BASE64=');


那么在解混淆时用到的一个方案就是利用vld去将代码转为opcode,通过手动逆向opcode去还原代码,然而在最终触发点为sg_load的源码中我无法复现这一操作,因为转出来的opcode最最终只会呈现为调sg_load,而参数为我想获得的代码的opcode,如:

SourceGuardian代码混淆的还原分析

3 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_loadbase64样式参数的原因,需知道直到sg_load之前的内容,对我们还原源码而言并没有什么用处,也就是说原生的vld中关于compilehook输出我们可以直接删减掉。


由于opcode的调用在于zend_execute,这也就意味着对于sg11加密而言,只需要在vld_execute_ex中调用vld_dump_oparray输出我们的op_array即可获取到opcode


SourceGuardian代码混淆的还原分析
 5. Patch 



说了这么多,已经有师傅写好这一个vld针对sg11patch了:https://github.com/clouds-flight/php7-vld-sg11-patch

需要注意的是,patch仅作用于vld0.17.0版本。

patch后执行php -dvld.active=1 -dvld.execute=0 Index.php就能够看到一些比较令人欣慰的内容了:

SourceGuardian代码混淆的还原分析

4 patch后的opcode

SourceGuardian代码混淆的还原分析
 6. 还原代码 



到此还没有结束工作,因为要做的内容是还原代码,关于转储的opcode需要关注的有几列:


line#*opreturnoperands
line:在代码中的行数
#*opcode的序号,在上文也提到了输出的是op_array,也就是说opcode是以数组的格式进行存储的
opopcode,最需要关注的一列
returnopcode执行后的返回值
operands:参数,对于特殊字符如空格,斜线等进行16进制编码后加上%(其实就是url编码)

接下来以一个函数为例说明如何还原:

SourceGuardian代码混淆的还原分析

5 getreturn函数的opcode

首先是第一行Function getreturn表明这一部分是getreturn这一个函数编译出的opcode,也就是getreturn函数包括参数,代码,逻辑等都在这一部分呈现。

compiled vars指的是php程序中定义的变量,在此表明这一个函数的参数,而在opcode中使用!n来替代参数,这里表明函数有codemsgdata这三个参数。

至于opcode可参照:https://www.wenjiangs.com/docs/php-7-docs

那么还原也就不难了,函数内容实际上就是初始化一个数组,将三个参数加入数组后作为返回值,即:

function getReturn($code=1,$msg='成功',$data=null){  return array($code,$msg,$data);}


SourceGuardian代码混淆的还原分析
7. Ref 


https://blog.zsxsoft.com/post/40
https://www.sourceguardian.com/loaders/download.php
https://www.xiapilu.com/web/web-tutorial/bt-php-7-4-sg11-ixed-7-4-lin.html
https://gywbd.github.io/posts/2016/2/vld-opcode.html
https://blog.csdn.net/hao508506/article/details/52432116
      

原文始发于微信公众号(山石网科安全技术研究院):SourceGuardian代码混淆的还原分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年8月24日22:34:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SourceGuardian代码混淆的还原分析http://cn-sec.com/archives/1251815.html

发表评论

匿名网友 填写信息