专栏首页逢魔安全实验室解密混淆的PHP程序

解密混淆的PHP程序

0x01 背景

团队大佬在做PHP代码审计的时候发现PHP代码是被混淆过的。虽然可以通过自己手动解密可以还原原先的PHP代码,但是混淆过程比较复杂且自己写脚本还原非常麻烦。所以,我这边通过PHP底层的操作对混淆后的PHP代码进行还原。

0x02 PHP代码混淆原理

PHP代码混淆一般来说有两种方法:

  • 需要PHP扩展
  • 无需PHP扩展

本文我们主要讲解无需PHP扩展的代码混淆的解密。大多数的无需扩展的php代码混淆原理上都是使用eval进行代码的执行。如果我们能够得到eval函数的参数,即可获得解密后的代码。

不过,一般来说PHP的混淆都会通过多次eval来还原并执行php代码,所以我们可以通过hook PHP的eval函数来打印其参数来解密代码。

0x03 Hook eval

PHP中的eval函数在Zend里需要调用zend_compile_string函数,我们可以通过调试看看zend_compile_string函数。

我们发现zend_compile_string函数其实就是compile_string函数。所以我们可以通过写一个简单的PHP代码,看能否在compile_string中获取到eval参数的值

 <?php
     eval("phpinfo();");
 ?>

首先我们编译一下下载好的PHP。注意,由于我们后面要进行调试,所以要在编译时加上-g参数,加调试符号。

./configure CFLAGS="-g" CXXFLAGS="-g"
make -j16

接着我们使用gdb调试php程序。首先设置程序的参数,且在compile_string函数下好断点。

然后让php程序跑起来

发现程序断下来后,我们发现compile_string的第一个参数source_string为php代码中eval函数的参数在Zend中的结构——即zval_structsource_string.value.str.val即为参数的字符串形式。

  • 通过修改compile_string函数来打印eval的参数,代码如下

修改好之后重新编译php,运行被加密的php代码

解密后的PHP代码如下

可以看到已经完全还原了被混淆的PHP代码

  • 通过编写php扩展来解密php脚本

编写php扩展的原理就是用我们的函数hook zend_compile_string函数,将函数的参数打印出来后再交还给zend_compile_string函数执行即可。

./ext/ext_skel --extname=decrypt_code

首先,我们写一个自己的hook函数。此函数的功能就是判断eval函数的参数是否为字符串,如果不是,则按原路径执行;如果是,则将参数打印出来后按照原路径执行。

接着,我们修改PHP扩展加载函数

此函数的功能就是保存zend_compile_string函数的地址,接着用我们的hook函数替换zend_compile_string的地址。当eval函数调用zend_compile_string时,就调用了我们的hook函数。

最后,我们修改PHP扩展的卸载函数

当这个扩展被卸载的时候将函数的hook解除。

最后,编译我们的扩展

phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make

接着,在php.ini中加上我们的扩展。

extension=decrypt_code.so

运行此脚本也可得到同样的输出。

0x04 利用其他函数还原的解密

其实,混淆代码的解密就是类似于代码执行。最终还是要执行PHP代码,而执行PHP代码的方法很多,除了eval函数还有assertcall_user_funccall_user_func_arraycreate_function等。这些函数的底层也是调用了zend_compile_string,所以也可以利用hook eval来还原混淆后的加密代码。

0x05 Example

一段示例代码。

运行一下,得到解密后的结果。

0x06 Refer

http://blog.evalbug.com/2017/09/21/phpdecode_01/

https://security.tencent.com/index.php/blog/msg/19

http://php-security.org/2010/05/13/article-decoding-a-user-space-encoded-php-script/index.html

https://lightless.me/archives/Zend-Extension-PHP-WAF.html

https://www.leavesongs.com/PENETRATION/unobfuscated-phpjiami.html

本文分享自微信公众号 - 逢魔安全实验室(FormSec),作者:WeaponX

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于Chorme headless的xss检测实践

    https://blog.formsec.cn/2018/07/12/%E5%9F%BA%E4%BA%8EChrome-headless%E7%9A%84XSS...

    xfkxfk
  • 某IOT蠕虫病毒分析之UPX脱壳实战

    ? ? 关于upx的脱壳的文章比较多,基本上都是Windows平台下的脱壳文章,处理起来比较简单。FormSec将在本文中分析一款mips下病毒程序使用的u...

    xfkxfk
  • UAF Writeup - pwnable.kr

    0x00 UAF — pwnable.kr是一个韩国的CTF练习的网站,有很多经典的CTF题目供爱好者练习。 UAF(Use After Free)释放后重用...

    xfkxfk
  • RASP攻防 —— RASP安全应用与局限性浅析

    随着Web应用攻击手段变得复杂,基于请求特征的防护手段,已经不能满足企业安全防护需求。在2012年的时候,Gartner引入了“Runtime applicat...

    腾讯安全应急响应中心
  • 深入浅析PHP7.0新特征(五大新特征)

    截止到目前为止,PHP官方已经发布了php7的RC5版本,预计在11月份左右会发布第一个正式版本!现在来说php7的重大特性肯定已经是定型了,不会再有什么变动了...

    wangxl
  • 短网址程序YOURLS安装及配置教程与设置中文

    YOURLS是一款使用PHP+Mysql开发的短链接程序,相比公共短网址好处是数据掌握在自己手中,可控性更高。

    皇上得了花柳病
  • ​开源:安卓手机app控制arduino,通过esp8266-01

    原理简述:利用发布订阅模式。第一步,新建主题,第二步,arduino通过esp8266订阅这个主题。第三步、通过app往这个主题发消息。由于单片机订阅了这个主题...

    巴法
  • PHP 系列:PHP Web 开发基础

    PHP是动态类型的Web开发的脚本语言,PHP以页面文件作为加载和运行的单元,PHP现在有了Composer作为开发包管理。 1.使用Composer管理依赖 ...

    zhisheng
  • 关于PHP程序员解决问题的能力

    原文出处: 韩天峰(@韩天峰-Rango) 这个话题老生长谈了,在面试中必然考核的能力中,我个人认为解决问题能力是排第一位的,比学习能力优先级更高。解决问题...

    wangxl
  • MATLAB操作redis

    redis是一个key-value存储系统。它支持存储的value类型更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted...

    万木逢春

扫码关注云+社区

领取腾讯云代金券