PHP的代码审计-XCTF-Web2-详细解说

前言:我把梦撕了一夜

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()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值