攻防世界-web2

首先我们先来打开环境,进去。里面是一段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
*/
?> 

看来是用一段代码来将flag加密了。需要我们一步一步的往回推。。上面也说了,是逆向加密算法,解密miwen就是flag。好了,那这样我们就有方向。先来看一下代码吧

$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
miwen后面的那段字符串是加密后的。然后我们继续看
首先strrev是将字符串反转,那个就是将$str里的值反转赋给$_o,也是就是将flag反转了,赋值给了$_o
然后有一个for循环。strlen函数是统计字符串的长度。ord()函数其实就是将字符串转换成Ascii码,而chr()的话就是转成字符串嘛
总的来说,这整段for循环其实就是将反转后的flag的每个Ascii码值都加1然后再转回字符串,拼接上。
最后的
str_rot13(strrev(base64_encode($_)));
base64_encode()函数就是将$_的值利用base64加密
strrev(base64_encode())再将加密后的密文反转一下。

str_rot13是rot13加密算法。
这段代码的意思就是先将$_的值base64加密一下,然后反转加密后的字符串,最后再利用rot13加密一下。就得到了miwen的值。

那好我们来解密一下。首先我们将miwen利用rot13解密,得到
n1mYotDfPRFRVdEYjhDNlZjYld2Y5IjOkdTN3EDNlhzM0gzZiFTZ2MjO4gjf

再将这段字符串反转,再base64解密一下,得到:

~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg

然后要将上面的字符串的每个ascii码都减去1。那我们写一个小小的脚本:

string ="~88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg"
news=''
for i in string:
    if i==" ":
        news = news + i
    else:
        news = news + chr(ord(i)-1)
print(string)
print(news)
        

运行以上python脚本就会输出:

88:36e1bg8438e41757d:29cgeb6e48c`GUDTO|;hbmg
}77925d0af7327d30646c918bfda5d37b_FTCSN{:galf

下面这段字符串再反转一下就得到了flag:

flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977} 

这个题是本博主一点点做的,并没有看wp,虽说题并不是很难,但是还是有点小激动。毕竟自己没有看wp

其实这道题可以写一个脚本直接就可以拿到flag,但是本博主太菜,写不出来。QAQ

继续学习吧!!!

原文地址:https://www.cnblogs.com/awsole/p/13858340.html