团队大佬在做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 函数。
user@ubuntu ~/php-5.6.35/Zend ~ grep -rn "zend_compile_string" *
zend.c:693:zend_compile_string = compile_string;
我们发现 zend_compile_string 函数其实就是 compile_string 函数。所以我们可以通过写一个简单的PHP代码,看能否在 compile_string 中获取到 eval 参数的值
eval("phpinfo();");
首先我们编译一下下载好的PHP。注意,由于我们后面要进行调试,所以要在编译时加上 -g 参数,加调试符号。
./configure CFLAGS="-