php opcodes(vld)翻译教程
一.php opcodes的由来(如果你只想知道如何解php opcodes就直接跳过这步)
1.PHP内核-Zend引擎的详解:https://www.php.cn/php-weizijiaocheng-355597.html
2.VLD扩展使用指南(VLD介绍):http://www.phppan.com/2011/05/vld-extension/
二.php opcodes对照解码表(php官网的,反应速度有点慢)
https://www.php.net/manual/en/internals2.opcodes.echo.php
三.步骤讲解
1.观察获取关键信息(文件名),操作数
2.解出php源码每行原内容
3.拼凑源码,提炼出跳转等操作
4.分析出最终源码
四. 实际演练
这里根据一道i春秋上的题进行实战讲解如何反编译php opcodes
原题链接:https://www.ichunqiu.com/battalion(挑战名称:vld)
根据信息我们会得到php opcodes
①反编译的第一步是读懂他的op栏中的所有op代表什么(因为php官网速度不怎么行在中国,所以可以先收集op资料再翻译)
EXT_STMT:基本上每个php opcodes都有EXT_STMT和RETURN两个op,可以暂时不用管,因为他们没有任何指向
echo的op就是ECHO,后面operands跟代码段的输出字符串
BEGIN_SILENCE的意思好像是索引变量的意思,和END_SILENCE相对应。没有实际解码翻译,可以不用管
FETCH_R的意思就是变量指向变量的操作,这里的实例就是将变量!1指向给$2,让$2相当于$!1(也就是$$a)
FETCH_DIM_R是数组变量指向特定变量的作用,这里就是让$3=$a[0],operands的前面是数组变量名后面是位置值
ASSIGN是分配变量的意思,如第一步就是将1分配给$a,第二步就是将’a’分配给$a;第六步就是将$3分配给$a;
IS_EQUAL的意思是判断是否相等,是弱等于比较,return中是返回值储存位置,operands中的两个值分别为比较的左右
JMPZ的意思是if操作,operands的左边对应的是if里面的步骤(例如这里的~0为$a!=0则JMPZ代表的if中的判断则是~0,$a!=0),右边对应的是该进行第几步,这里就是如果if里面的判断为假($a等于0),则跳转到第四步(#4)
JMP的意思直接就是跳转,operands里面就是#步骤
NOP没有操作
②先解释下php opcodes各段分别是什么意思
- Branch analysis from position 这条信息多在分析数组时使用。
- Return found 是否返回,这个基本上有都有。
- filename 分析的文件名
- function name 函数名,针对每个函数VLD都会生成一段如上的独立的信息,这里显示当前函数的名称
- number of ops 生成的操作数
- compiled vars 编译期间的变量,这些变量是在PHP5后添加的,它是一个缓存优化。这样的变量在PHP源码中以IS_CV标记
- op list 生成的中间代码的变量列表
line: 在源码中的行号
#: opcode 编号(每个php的php opcodes从0开始记录操作不揍)
op: 操作名称
fetch: 该操作的变量位置(全局或则本地)
ext: 与该opcode关联的额外数据,如跳转的目标opcode
return: 返回值存储的问题
operands:操作
③分析实例:
第一行和最后一行php代码分别为<?php和?>,不进行opcodes操作,其中每行末尾的;也是去掉了的
该段op的意思是,位于源码第二行,操作只有一个,输出’do+you+know+Vulcan+Logic+Dumper%3F%3Cbr%3E’
#4是将_GET给了$1,意思是接下来用$1表示_GET
#5则是将$1的数组位置设置成了flag1的值,用$2表示,相当于$2=$1[flag1]=$_GET[flag1]
#6则是将赋值,将$2给了!0,而!0=$a,所以这里的第三行php代码是$a=$_GET[flag1]
第四行有6步操作,第1步不解释(上面的op对照表的解释有),然后第2和5不解释,看第3步,是代替指向,将$5代替_GET,第4步则是数组指向赋值,先将$5数组的位置指向flag2的值,形成$5[flag2](也就是$_GET[flag2]),然让$6等于这个值($5[flag2]),第6步则是赋值,将$6赋值给!1($b)
所以第四行解释成php代码则是
$b=$_GET[flag2]
第五行有六步操作去掉第一步,第二步,第五步,分析剩下的三步,第三步是让$9代替$_GET(这个挑战里面的fetch一直是global,也就是全局指向,意思是整个php opcodes中$9都是$_GET的意思)第四步是先对数组$9指向为flag3然后将这个值给$10,形成$10=$9[flag3];第六步则是将$10的值赋值给!2($c),所以第四行php代码解释为$c=$_GET[flag3]
第六行则是进行了三步操作,去掉第一步,分析第二步,第二步是比较,判断!0是否等于fvhjjihfcv,如果不等于则调转到#38步操作,这里是一个连串的if结构,所以暂时没有翻译
第七行源码是判断!1是否等于gfuyiyhioyf,如果不等于就跳转到#35操作
第八行源码是判断!2是否等于yugoiiyhi,如果不等于就跳转到#32操作
第九行php源码是输出the+next+step+is+xxx.zip
第十行源码是跳转到#34
第十一行源码是输出'false%3Cbr%3E’(这里的第一步是#32接的是第八行源码)
这里没有第十二行,所以猜测第十二行应该是 } 或则回车
第十三行是跳转到#37
第十四行是输出false%3Cbr%3E
第十五行也没有
第十六行是跳转到#40
第十七行是输出false%3Cbr%3E
第十八行没有
十九行是NOP
然后第二十,二十一都没有,应该都是 }或则回车
第22行是输出%3C%21--+index.php.txt+%3F%3E%0D%0A%0D%0A
然后结束
现在来初步整理一下
1 <?Php
2 echo ‘do+you+know+Vulcan+Logic+Dumper%3F%3Cbr%3E’
3 $a=$_GET[flag1]
4 $b=$_GET[flag2]
5 $c=$_GET[flag3]
6 判断!0是否等于fvhjjihfcv,如果不等于则调转到第十七行
7 判断!1是否等于gfuyiyhioyf,如果不等于就跳转到第十四行
8 判断!2是否等于yugoiiyhi,如果不等于就跳转到第十一行
9 echo ‘the+next+step+is+xxx.zip’
10 跳转到第13行
11 echo ‘false%3Cbr%3E’
12 }
13 跳转到第16行
14 echo ‘false%3Cbr%3E’
15 }
16 跳转到第19行
17 echo ‘false%3Cbr%3E’
18 }
19 NOP
20 }
21 }
22 echo ‘%3C%21--+index.php.txt+%3F%3E%0D%0A%0D%0A’
23 ?>
主要的分析已经结束了,主要的就剩下解析那些if跳转了。
这里的就只有if,单独拉出来理一理就清晰了:
6 if($a=fvhjjihfcv){ 不等于则调转到第十七行
7 if($b=gfuyiyhioyf){ 不等于则调转到第十四行
8 if($c=yugoiiyhi){ 不等于则调转到第十一行
9 echo ‘the+next+step+is+xxx.zip’;
10 跳转第13行
11 echo ‘false%3Cbr%3E’
12 }
13 跳转到第16行
14 echo ‘false%3Cbr%3E’
15 }
16 跳转到第19行
17 echo ‘false%3Cbr%3E’
18 }
19 结束
意思是如果进行输出the+next+step+is+xxx.zip后就会直接进行NOP,也就结束了,所以完全梳理开形成php的if结构
if($a=fvhjjihfcv){
if($b=gfuyiyhioyf){
if($c=yugoiiyhi){
echo ‘the+next+step+is+xxx.zip’;
}else echo ‘false%3Cbr%3E’;
}else echo ‘false%3Cbr%3E’;
}else echo ‘false%3Cbr%3E’;
最后将所有的php代码翻译到一起形成完整的php代码
你可以试着翻译一下,看和我的是否相同,我相信,大体意思差不多,if的结构你可能有自己的想法。
php opcodes(vld)翻译教程的更多相关文章
- PS网页设计教程——30个优秀的PS网页设计教程的中文翻译教程
PS网页设计教程--30个优秀的PS网页设计教程的中文翻译教程 作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,"熟读唐诗三百首,不会作 ...
- pfSense用户界面汉化翻译教程
pfSense用户界面汉化翻译教程 来源 https://blog.51cto.com/fxn2025/2087182 为了记录自己的汉化过程,同时也为了方便网友自己制作汉化版本,我把自己汉化pfSe ...
- 【分享】School Rumble校园迷糊大王PSP姐姐事件+PS2游戏第一,二学期【带VNR翻译教程】
7/22/2014 TUE 为「スクールランブル 姉さん事件です」加入了BANDAI PSP的引擎. 校园迷糊大王PSP姐姐事件 下载地址1:http://www.bego.cc/file/689 ...
- [svg 翻译教程]Polyline(折线)polygon(多边形)
原文: http://tutorials.jenkov.com/svg/polygon-element.html Polyline 虽然说这个 元素我没用过,但是还是蛮强大的,也翻译下 示例 < ...
- 3.Swift翻译教程系列——Swift基础知识
英语PDF下载链接http://download.csdn.net/detail/tsingheng/7480427 Swift是用来开发iOS和OS X应用的新语言,可是很多地方用起来跟C或者OC是 ...
- [svg翻译教程]椭圆(ellipse元素)和线(line元素)
line 先看个例子,这是svg中最简单的线 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http:/ ...
- 7.Swift翻译教程系列——控制循环的流程
英语PDF下载链接http://download.csdn.net/detail/tsingheng/7480427 Swift提供了类C语言类似的控制流结构.包含for循环和while循环来多次运行 ...
- [翻译svg教程]svg学习系列 开篇
目录 [翻译svg教程]svg学习系列 开篇 [翻译svg教程 ]svg 的坐标系统 [翻译svg教程]svg 中的g元素 [翻译svg教程]svg中矩形元素 rect [翻译svg教程]svg中的c ...
- htmlunit官网简易教程(翻译)
1 环境搭建: 1)下载 从链接:http://sourceforge.net/projects/htmlunit/files/htmlunit/ 下载最新的bin文件 2)关于bin文件 里面主要包 ...
随机推荐
- TLS示例开发-golang版本
目录 前言 制作自签名证书 CA 服务器证书相关 客户端证书相关 证书如何验证 在浏览器中导入证书 导入证书 修改域名 golang服务端 目录 main.go 测试 参考 前言 在进行项目总结的时候 ...
- you-get视频下载
项目主页 https://github.com/soimort/you-get 使用you-get库一些简单命令下载视频音乐 you-get是一个基于python3的下载器,没有客户端或者可视化工具, ...
- UVA1327 && POJ1904 King's Quest(tarjan+巧妙建图+强连通分量+缩点)
UVA1327 King's Quest POJ1904 King's Quest 题意: 有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚.现有一个匹配表,将每个王子都与一个自己 ...
- 数据库触发器_trigger
部门表_删除: USE [test] GO /****** Object: Trigger [dbo].[部门_Delete] Script Date: 2015/8/31 16:41:46 **** ...
- 个人永久性免费-Excel催化剂功能第58波-批量生成单选复选框
插件的最大威力莫过于可以把简单重复的事情批量完全,对日常数据采集或打印报表排版过程中,弄个单选.复选框和用户交互,美观的同时,也能保证到数据采集的准确性,一般来说用原生的方式插入单选.复选框,操作繁琐 ...
- [leetcode] 542. 01 Matrix (Medium)
给予一个矩阵,矩阵有1有0,计算每一个1到0需要走几步,只能走上下左右. 解法一: 利用dp,从左上角遍历一遍,再从右下角遍历一遍,dp存储当前位置到0的最短距离. 十分粗心的搞错了col和row,改 ...
- C#编程之JSON序列化与反序列化
1.在C#管理NuGet程序包中添加Json.NET 2.C#将对象序列化成JSON字符串 模型类1 /// <summary> /// JSON字符串模型.是否出错 /// </s ...
- C/C++用new、delete分配回收堆中空间
int *CreateList() 10 { 11 int a[5]; 12 int *a = new int[5]; 13 delete[] a; 14 15 int a(5); 16 int a ...
- 开源分布式事务中间件Seata使用指南
介绍 Seata 是阿里巴巴开源的分布式事务中间件,一种分布式事务解决方案,具有高性能和易于使用的微服务架构. 初衷 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入 高性能 ...
- 访问腾讯云主机mysql的设置问题
---恢复内容开始--- 1.需要打开腾讯云主机的防火墙端口3306,具体实现可以在腾讯云控制台安全组中设置开放全部端口(安全组对应入站.出战规则): 2.将云主机mysql中mysql数据库user ...