从Zend虚拟机分析PHP加密扩展

本文探讨了如何从Zend虚拟机的角度破解PHP加密扩展,以SourceGuardian为例。通过分析PHP代码执行流程,特别是`zend_compile_string`和`zend_execute`函数,揭示了获取原始代码和OPCode的途径。文章提到了两种破解方案,一种是运行时获取OPCode,另一种是非运行时的解决方案,涉及函数调用和OPCode还原。此外,还简单提及了其他加密扩展如ionCube和Swoole Compiler的破解难点。
摘要由CSDN通过智能技术生成

原文地址:https://blog.zsxsoft.com/post/40

这次RCTF2019中,我出了一题SourceGuardian解密。和Hook zend_compile_string就能解决php_screwphp-beast等扩展一样,没有对PHP总体的执行流程做出较大更改的扩展,依然有通用的(或是较为通用的)破解方案。这其中,SourceGuardian就是一个例子。这篇文章将从Zend虚拟机的角度来谈这一类加密的破解方案。

这一题的题目和Writeup见:https://github.com/zsxsoft/my-ctf-challenges/tree/master/rctf2019/sourceguardian

我们首先需要熟悉PHP代码执行的流程──即,PHP到底是如何加载文件并执行的。PHP代码由于历史原因较为散乱,因此入手点很多。经过分析后,我认为从php-cli入手是一个不错的选择。

https://github.com/php/php-src/blob/php-7.3.5/sapi/cli/php_cli.c#L937

让我们来整理一遍吧。第一步:打开文件句柄,CLI在这里顺便处理以#!/bin/php开头的可执行文件,防止该头被输出。

if (cli_seek_file_begin(&file_handle, script_file, &lineno) != SUCCESS) {
   

第二步:调用php_execute_script。这个函数同时负责把auto_prepend引入。

php_execute_script(&file_handle);

往下看php_execute_script的代码:

https://github.com/php/php-src/blob/7208826fdeb2244136c11a2e3b31948dfac549a3/main/main.c#L2650

它调用了

retval = (zend_execute_scripts(ZEND_REQUIRE, NULL, 3, prepend_file_p, primary_file, append_file_p) == SUCCESS);

往下看zend_execute_scripts,其代码如下:

op_array = zend_compile_file(file_handle, type);
if (file_handle
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值