题目来源:攻防世界 (xctf.org.cn)
本题为对题目给出miwen进行解密需要了解的函数有:
strrev:反转字符串
substr(string string, int a, int b);截取字符串,a为开始位置,b为长度
ord:用于返回一个字符的ASCII值
chr:与ord()函数相反,用于返回指定的字符base64_encode,str_rot13:两种编码方式
题目源码:
<?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
*/
?>
要得到本题的flag,需要编写解题脚本
1.源码中最后一步为:
str_rot13(strrev(base64_encode($_)))
所以先构造以下语句
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
$miwen=base64_decode(strrev(str_rot13($miwen)));
进行第一步
2.接着分析源码中for循环中的内容
大概意思是循环的将反转后的flag字符串截取,并让它变为ascii码表的下一位的字符
所以构造循环截取miwen,并把它变为ascii码表上一位字符,最后在翻转字符串,即可得到flag
for ($a=0;$a<strlen($miwen);$a++){
$m1=substr($miwen,$a,1);
$m2=ord($m1)-1;
$m3=chr($m2);
$jiemi=$jiemi.$m3;
}
$jiemi=strrev($jiemi);
echo $jiemi;