> 文章列表 > 攻防世界-web2(逆向加密算法)

攻防世界-web2(逆向加密算法)

攻防世界-web2(逆向加密算法)

打开链接是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($_);
?>