当前位置: 代码迷 >> 综合 >> 决斗场 - 实验吧 WEB NSCTF web200
  详细解决方案

决斗场 - 实验吧 WEB NSCTF web200

热度:94   发布时间:2023-12-06 03:06:53.0

题目链接:http://www.shiyanbar.com/ctf/1760


这道题目可是2015NSCTF的真题哦!点开题目链接,可以看到一些题目描述和一段代码:


那么如此看来,这题是一道关于PHP审计的题目。

首先观察代码,考虑到一些没有怎么学过PHP的同学,我们先把其中的一些重要的函数提出来一个一个解释一下:

1.strrev:

strrev是一个将字符串进行翻转的函数。

2.substr:

substr是一个取字符串子串的函数,其用法为strsub(str, start, length),第一个参数为字符串,第二个参数为起始位置,第三个参数为子串长度,返回的结果就是str字符串从start这个位置开始的长度为length的子串。

3.ord:

ord函数的参数为字符串,此函数将返回字符串第一个字符的Acsii码。

3.chr:

chr函数的参数为整型,此函数将从指定的ASCII值返回字符。

4.".":

这其实不能算个函数,“.”在字符串中相当于我们Java中的“+”,用于连接字符串。

5.base64_encode:

如名,对字符串参数进行base64编码,与之对应的解码函数为base64_decode。

6.str_rot13:

如名,对字符串参数进行ROT13编码,ROT13是它自己本身的逆反;也就是说,要还原ROT13,套用加密同样的算法即可得。

解释完这些函数我们再来看这段代码,相信有点编程基础的同学都能看出来这段代码做了什么:首先是将原文进行反转,然后再将反转后的字符串的每一个字符值+1,接下来再进行base64编码、反转和ROT13编码,得到我们的密文。想要得到原文,因为所有的操作都是可逆的,我们只需要将这些步骤反着来一遍即可,代码如下:

<?php$_code = "a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";$_code = str_rot13($_code);$_code = strrev($_code);$_code = base64_decode($_code);//echo $_code;$_ans = "";for($x = 0; $x < strlen($_code); $x++) {$t = substr($_code, $x, 1);$t1 = ord($t) - 1;$t = chr($t1);$_ans = $_ans . $t;}$_ans = strrev($_ans);echo $_ans;
?>