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 
*/ 
?> 

看其代码加密逻辑如下:

1、反转字符串

2、逐位提取各位上的字符转换为ascii后-1

3、进行base64编码

4、反转字符串

5、rot13加密

6、输出密文

根据以上逻辑,用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()

运行得到flag:

发布了109 篇原创文章 · 获赞 34 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/shuaicenglou3032/article/details/103681868