php opcodes(vld)翻译教程

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php opcodes(vld)翻译教程脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

.PHP opcodes的由来(如果你只想知道如何解PHP opcodes就直接跳过这步)

1.PHP内核-Zend引擎的详解https://www.js-code.com/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

php opcodes(vld)翻译教程

php opcodes(vld)翻译教程

反编译的第一步是读懂他的op栏中的所有op代表什么(因为PHP网速度不怎么行在中国,所以可以先收集op资料再翻译

php opcodes(vld)翻译教程

php opcodes(vld)翻译教程

EXT_STMT:基本上每个PHP opcodes都有EXT_STMTRETURN两个op,可以暂时不用管,因为他们没有任何指向

php opcodes(vld)翻译教程

echoop就是ECHO,后面operands代码段的输出字符串

php opcodes(vld)翻译教程

BEgin_SILENCE意思好像是索引变量的意思,和END_SILENCE相对应。没有实际解码翻译,可以不用管

php opcodes(vld)翻译教程

FETCH_R的意思就是变量指向变量的操作,这里的实例就是将变量!1指向给$2,$2相当于$!1(也就是$$a)

php opcodes(vld)翻译教程

FETCH_DIM_R是数组变量指向特定变量的作用,这里就是让$3=$a[0],oPErands的前面是数组变量名后面是位置值

php opcodes(vld)翻译教程

ASSIGN是分配变量的意思,如第一步就是将1分配给$a,第二步就是将’a’分配给$a;第六步就是将$3分配给$a

php opcodes(vld)翻译教程

IS_EQUAL的意思是判断是否相等,是弱等于比较,return中是返回值储存位置,operands中的两个值分别为比较的左右

php opcodes(vld)翻译教程

JMPZ的意思是if操作,operands的左边对应的是if里面的步骤(例如这里的~0$a!=0JMPZ代表的if中的判断则是~0$a!=0),右边对应的是该进行第几步,这里就是如果if里面的判断为假($a等于0),则跳转到第四步(#4

php opcodes(vld)翻译教程

JMP的意思直接就是跳转operands里面就是#步骤

php opcodes(vld)翻译教程

NOP没有操作

先解释下PHP opcodes各段分别是什么意思

 

 

php opcodes(vld)翻译教程

line    在源码中的行号

#:     opcode 编号每个PHPPHP opcodes0开始记录操作不揍

op     操作名称

fetch   该操作的变量位置(全局或则本地)

ext:      与该opcode关联的额外数据,如跳转的目标opcode

return  返回值存储的问题

operands:操作

③分析实例:

第一行和最后一行PHP代码分别为<?PHP?>,不进行opcodes操作,其中每行末尾的;也是去掉了的

php opcodes(vld)翻译教程

 

 

该段op的意思是,位于源码第二行,操作只有一个输出’do+you+kNow+Vulcan+LOGic+Dumper%3F%3Cbr%3E’

php opcodes(vld)翻译教程

 

 

#4是将_GET给了$1,意思是接下来用$1表示_GET

#5则是将$1的数组位置设置成了flag1的值,用$2表示,相当于$2=$1[flag1]=$_GET[flag1]

#6则是将赋值,将$2给了!0,而!0=$a,所以这里的第三行PHP代码是$a=$_GET[flag1]

php opcodes(vld)翻译教程

 

 

第四行有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]

php opcodes(vld)翻译教程

 

 

第五行有六步操作去掉第一步,第二步,第五步,分析剩下的三步,第三步是让$9代替$_GET(这个挑战里面的fetch一直是global,也就是全局指向,意思是整个PHP opcodes中$9都是$_GET的意思)第四步是先对数组$9指向为flag3然后将这个值给$10,形成$10=$9[flag3];第六步则是将$10的值赋值给!2($c),所以第四行PHP代码解释为$c=$_GET[flag3]

php opcodes(vld)翻译教程

第六行则是进行了三步操作,去掉第一步,分析第二步,第二步是比较,判断!0是否等于fvhjjihfcv,如果不等于则调转到#38步操作,这里是一个连串的if结构,所以暂时没有翻译

php opcodes(vld)翻译教程

第七行源码是判断!1是否等于gfuyiyhioyf,如果不等于就跳转#35操作

php opcodes(vld)翻译教程

第八行源码是判断!2是否等于yugoiiyhi,如果不等于就跳转#32操作

php opcodes(vld)翻译教程

第九行PHP源码是输出the+next+step+is+xxx.zip

 

php opcodes(vld)翻译教程

第十行源码是跳转#34

php opcodes(vld)翻译教程

第十一行源码是输出‘false%3Cbr%3E’(这里的第一步是#32接的是第八行源码)

这里没有第十二行,所以猜测第十二行应该 } 或则回车

php opcodes(vld)翻译教程

第十三行是跳转#37

php opcodes(vld)翻译教程

第十四行是输出false%3Cbr%3E

第十五行也没有

php opcodes(vld)翻译教程

第十六行是跳转#40

php opcodes(vld)翻译教程

第十七行是输出false%3Cbr%3E

第十八行没有

php opcodes(vld)翻译教程

十九行是NOP

然后第二十,二十一都没有,应该都是 }或则回车

php opcodes(vld)翻译教程

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代码

php opcodes(vld)翻译教程

你可以试着翻译一下,看和我的是否相同,我相信,大体意思差不多,if的结构你可能有自己的想法。

脚本宝典总结

以上是脚本宝典为你收集整理的php opcodes(vld)翻译教程全部内容,希望文章能够帮你解决php opcodes(vld)翻译教程所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。