前言:我把梦撕了一夜
XCTF的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($_)));
}
highlight_file(__FILE__);
/*
逆向加密算法,解密$miwen就是flag
*/
?>
highlight_file(_FILE_)是对其本身的代码进行高亮颜色,猜想是这样去调用函数,执行了一遍,但是不知道为啥要用一个对文件进行语法高亮显示的函数来调用。看着看着,写着写着,才发现,这东西是用来给我们看的哈哈。还有颜色给我们看哈哈,原来不是用来执行的,只是告诉我们他是如何加密,作者用心了。我差点被自己笑翻。
回归正题,接着使用了strrev()这个函数来翻转变量。如:
<?php
echo strrev("I love Shanghai!");
?>
ord()是对$c转为ascii码,chr()再转换成字母。再进行拼接。
接着进行base64编码,再翻转,再使用str_rot13进行 ROT13 编码。
ROT13 编码是把每一个字母在字母表中向前移动 13 个字母。数字和非字母字符保持不变。
str_rot13(strrev(base64_encode($_)));
如
用个笨方法
先是解rot13加密
解出来的n1mYotDfPRFRVdEYjhDNlZjYld2Y5IjOkdTN3EDNlhzM0gzZiFTZ2MjO4gjf再进行翻转
翻转之后这一串进行一个base64的解密,得到这一串~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg
对这一串进行ascii转换再减一
得出
}77925d0af7327d30646c918bfda5d37b_FTCSN{:galf
最后进行一个翻转,得到flag
最后附上完整的php代码
<?php
$a = 'a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws';
$_o = base64_decode(strrev(str_rot13($a)));
//$_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 strrev($_);
再附上别人家的python3的脚本
import base64
# ROT13字符变换,要变回去再调用一次即可。
def rot13(s, OffSet=13):
def encodeCh(ch):
f = lambda x: chr((ord(ch) - x + OffSet) % 26 + x)
return f(97) if ch.islower() else (f(65) if ch.isupper() else ch)
return ''.join(encodeCh(c) for c in s)
def main():
miwen = 'a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws'
miwen = rot13(miwen)
miwen = miwen[::-1]
miwen = base64.b64decode(miwen)
miwen = str(miwen,'utf-8')
print(miwen)
mingwen = ""
for _0 in range(0, len(miwen)):
_c = ord(miwen[_0])
fuck = (_c)-1
mingwen+=(chr(fuck))
print(mingwen[::-1])
if __name__ == '__main__':
main()