攻防世界 web2
这个题需要考察php的代码审计,需要具备一定的php知识
<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
function encode($str){
$_o=strrev($str);
// echo $_o;
for($_0=0;$_0<strlen($_o);$_0++){
$_c=substr($_o,$_0,1);
$__=ord($_c)+1;
$_c=chr($__);
$_=$_.$_c;
}
return str_rot13(strrev(base64_encode($_)));
}
highlight_file(__FILE__);
/*
逆向加密算法,解密$miwen就是flag
*/
?>
最后一段说这个就是思路
首先先看看代码中的几个函数
Strlen()函数 将返回字符串的长度
Strrev()函数 将字符串倒置并且返回
Substr()函数 将返回字符串的一部份
此函数里面有三个参数 分别是string,start,length
代表字符串,开始的位置,返回字符的长度
Ord()函数 将返回第一个字符的ASCLL的值
Chr()函数 将ASCLL值返回成为字符
Str_rot13函数 将字符串进行ROT13编码 也就是把每一个字母向前移13个 这个和字母表26个英文相呼应我们编码两次即可以进行解密,相当于没有加密,此函数对非字母字符无效,仍保持为原来的字符
. 符号 代表拼接两个字符
想要了解更多可以看看
php常用函数最全总结_筑梦悠然的博客-CSDN博客_php常用函数大全
现在便可以做题了
经过知道函数意义 我们可以一步步看懂这个加密过程
<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
function encode($str){//这里是加密函数
$_o=strrev($str); //这里对字符串进行倒置
// echo $_o;
for($_0=0;$_0<strlen($_o);$_0++) {
$_c=substr($_o,$_0,1); //从$_0中一个一个将字符取出
$__=ord($_c)+1; //字符ASCLL码值+1
$_c=chr($__); //ASCLL码值变回字符
$_=$_.$_c; //拼接每一个字符
}
return str_rot13(strrev(base64_encode($_)));//将字符串先base64加密 ,再倒置,再进行ROT13编码
}
highlight_file(__FILE__);
/*
逆向加密算法,解密$miwen就是flag
*/
?>
由此我们进行逆向解密
应该从下面开始来
先base64解密 base64_decode()
使用 strrev()倒置字符串
再进行ROT13编码 刚好26个字母进行两次刚好完成解密
之后就是将字符的ASCLL码值-1
字符串再进行倒置
同样我们也使用php,使用echo将解密结果输出
可以使用本地环境或者在线环境
PHP 在线工具 | 菜鸟工具
<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
$a=base64_decode(strrev(str_rot13($miwen)));
for($b=0;$b<strlen($a);$b++){
$c=substr($a,$b,1);
$d=ord($c)-1;
$c=chr($d);
$e=$e.$c;
}
$f=strrev($e);
echo $f;
?>
得到flag
flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977}
此为本小白思路,若有错误欢迎指出