题目链接:https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=5326&page=2
打开场景,看到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
*/
?>
那就写脚本呗
先用php写得出来最后三次加密得到的结果:
c='~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg'
然后再用python写下脚本
def decode(c):
m=''
for i in c:
a=chr(ord(i)-1)
m+=a
print(m[::-1])
c='~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg'
decode(c)
得到flag
顺便解释一下php代码中的几个函数
strrev — 反转字符串
substr — 返回字符串的子串
substr ( string $string , int $start [, int $length ] ) : string
返回字符串 string 由 start 和 length 参数指定的子字符串。
string
输入字符串。必须至少有一个字符。
start
如果 start 是非负数,返回的字符串将从 string 的 start 位置开始,从 0 开始计算。例如,在字符串 “abcdef” 中,在位置 0 的字符是 “a”,位置 2 的字符串是 “c” 等等。
如果 start 是负数,返回的字符串将从 string 结尾处向前数第 start 个字符开始。
如果 string 的长度小于 start,将返回 FALSE。
length
如果提供了正数的 length,返回的字符串将从 start 处开始最多包括 length 个字符(取决于 string 的长度)。
如果提供了负数的 length,那么 string 末尾处的 length 个字符将会被省略(若 start 是负数则从字符串尾部算起)。如果 start 不在这段文本中,那么将返回 FALSE。
如果提供了值为 0,FALSE 或 NULL 的 length,那么将返回一个空字符串。
如果没有提供 length,返回的子字符串将从 start 位置开始直到字符串结尾。