打开链接是PHP源码
给了一串密文,并对这串密文进行了一系列操作加密,注释里说解密$miwen就是flag
在此我们先介绍一些PHP内置函数:
strrev(string): 反转字符串
strlen(string): 返回字符串的长度
substr(string, start, length): 返回字符串的一部分
string: 所需要的字符串
start: 在字符串何处开始
length: 规定被返回字符串的长度,默认是直到字符串的结尾
ord(string): 返回字符串首个字符的 ASCII 值
chr(): 从指定的 ASCII 值返回对应的字符
str_rot13(string): 对字符串执行 ROT13 编码
ROT13 编码:把每一个字母在字母表中向前移动 13 个字母,数字和非字母字符保持不变,
编码和解码都是由该函数完成的,如果把已编码的字符串作为参数,那么将返回原始字符串
base64_encode(string): 使用 MIME base64 对数据进行编码
知道这些后我们开始写PHP解密脚本
因为最后返回的是 str_rot13(strrev(base64_encode($_)))
所以我们先对密文进行这三个的解密(注意顺序要反过来)
即 base64_decode(strrev(str_rot13($miwen)))所以前半部分脚本为:
<?php $miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws"; $Myon = base64_decode(strrev(str_rot13($miwen))); echo $Myon; ?>
(Myon只是我随便定义的一个变量,PHP中$就是变量的意思)
得到 ~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg
后半部分脚本只需对它给的源码进行一些修改即可
给的源码:
for($_0=0;$_0<strlen($_o);$_0++){ $_c=substr($_o,$_0,1); $__=ord($_c)+1; $_c=chr($__); $_=$_.$_c; }
将解密后得到的字符串赋给 $_o
后面的 +1 变为 -1
输出最后的变量
<?php $_o = "~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg"; for($_0=0;$_0<strlen($_o);$_0++){ $_c=substr($_o,$_0,1); $__=ord($_c)-1; $_c=chr($__); $_=$_.$_c; } echo $_; ?>
可是我们发现并没对,运行后得到 }77925d0af7327d30646c918bfda5d37b_FTCSN{:galf
再次查看源码,发现前面还有一句 $_o=strrev($str);
strrev() 是反转字符串,所以我们这里还要对它进行一个反转:
<?php
echo strrev("}77925d0af7327d30646c918bfda5d37b_FTCSN{:galf");
?>
得到 flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977
合起来的PHP脚本为:
<?php $miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws"; $_o = base64_decode(strrev(str_rot13($miwen))); for($_0=0;$_0<strlen($_o);$_0++){ $_c=substr($_o,$_0,1); $__=ord($_c)-1; $_c=chr($__); $_=$_.$_c; } echo strrev($_); ?>