[CTF/网络安全]攻防世界 web2 解题详析
题目描述:解密
环境给出代码:
<?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($_)));
}
/*
逆向加密算法,解密$miwen就是flag
*/
?>
代码审计
这段代码定义了一个函数 encode,接受一个字符串参数 $str,并返回对其进行加密后的结果。加密算法包括三个步骤:
- 使用 strrev 函数将字符串翻转;
- 对翻转后的每个字符,将其 ASCII 值加 1,然后转换为相应的字符;
- 将得到的新字符串使用 base64 编码,再对编码后的结果进行 strrev 翻转和 str_rot13 处理,最终得到加密后的结果。
其中,str_rot13 是一个简单的字符替换算法,将每个字符替换为它在字母表中向后移动 13 位后对应的字符。这个算法是一种经典的简单加密方法,可以用来隐藏字符串的真实含义。
姿势
可通过逆向加密算法的步骤,对 $miwen 进行相反的操作,即先使用 str_rot13 还原,然后使用 strrev 翻转,再使用 base64 解码,最后对每个字符的 ASCII 值减 1 ,再进行翻转即可得到 flag。
还原后得到:
n1mYotDfPRFRVdEYjhDNlZjYld2Y5IjOkdTN3EDNlhzM0gzZiFTZ2MjO4gjf
翻转后得到:
fjg4OjM2ZTFiZzg0MzhlNDE3NTdkOjI5Y2dlYjZlNDhjYEdVRFRPfDtoYm1n
Base64解码后得到:
~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg
对每个字符的 ASCII 值减 1 得到:
}77925d0af7327d30646c918bfda5d37b_FTCSN{:galf
再进行翻转得到:
flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977}
总结
该题考察代码审计。
我是秋说,我们下次见。