下载题目压缩包解出来是一个vbs文件,这题就是考验vbs能力了,如果是学c语言的人会感觉有点吃力。
第一步千万!千万!千万!不要直接运行vbs(不管是不是这题还是其他vbs),这会有风险,先复制个副本在虚拟机(当然本题没那么危险啦)运行下,弹出框显示"this_is_key",(⊙0⊙)如果有那么简单就好了,这里要注意下,当运行后这个vbs,原文件会被改写(幸好运行的是副本)。用txt等打开最早的原文件,是只有一长行的代码。VB中的冒号(:)起分隔语句的作用,使得一行可以有几个语句。看着一长串比较麻烦,自己手动格式化下:

code="..."
key=9
code=rev
Execute code
Function rev()
	For i=1 To Len(code) Step key
		rev=rev+strReverse(Mid(code,i,key))
	Next
End Function

pcat在这里科普下VB语法:

0) 用两个双引号转义表示字符串内容中的一个双引号。
1) 看到rev=rev+这种操作函数名的行为不要慌,因为VB中是通过给函数名赋值来返回值的。
2) For 变量名=初值 To 终值(有包含) Step 步长 (每一个For要对应每一个Next)
3) Mid(str,M,N) 截取字符串中从第M位(包含)起N个长,记得起始位置是从第1开始。
4) StrReverse是字符串逆序
5) Execute是个函数,执行一个或多个语句,忽略语句的返回值。

有这些语法知识傍身,稍微理解下就是把code字符串每key个长度逆序,然后再执行这个code,而我们要解题的话只要把

Execute code:

替换为

Set objfso=CreateObject("scripting.filesystemobject"):Set objTextFile = objfSO.OpenTextFile ("c:\pcat.txt",2,True):objTextFile.Write(code):

然后运行后,就会在你c盘下生成pcat.txt文件,打开看也是一长串的vbs代码,我继续手动格式化下:

Dim num(5,5):
num(0,0) = 70:num(0,1) = 33:num(0,2) = 108:num(0,3)= 545:num(0,4) = 78:
num(1,0) = 121:num(1,1) = 87:num(1,2) = 11:num(1,3)= 465:num(1,4) = 575:
num(2,0) = 105:num(2,1) = 33:num(2,2) = 45:num(2,3)= 356:num(2,4) = 251:
num(3,0) = 116:num(3,1) = 104:num(3,2) = 333:num(3,3)= 356:num(3,4) = 457:
num(4,0) = 85:num(4,1) = 33:num(4,2) = 33:num(4,3)= 24:num(4,4) =  564:
For i = 0 To 4 Step 1:
	For j = 0 To 4 Step 1:
		If (j = 0 Or i + j =2) Then:
			this_is_key = this_is_key & Chr(num(i, j)):
		Else 
			If (j = 0 Or i = 2 + j) Then :this_is_key = this_is_key & Chr(num(i, j)):End If:
		end if:
	Next:
Next:
MsgBox "this_is_key":
Randomize:
key = Int(Rnd*8+2):
code=rev:
code=Replace(code,Chr(34),Chr(34)+Chr(34)):
Set aso=CreateObject("adodb.stream"):
with aso:
	.open:
	.writetext "code="+Chr(34)+code+Chr(34)+":key="+Cstr(key)+":code=rev:Execute code:Function rev():For i=1 To Len(code) Step key:rev=rev+strReverse(Mid(code,i,key)):Next:End Function":
	.savetofile wscript.scriptfullname,2:
end with:

这里看到MsgBox "this_is_key"后,你就可以理解最初为何弹出那样,而这句语句的下面就是在随机打乱原文件,所以只要把这句话上面的语句加上MsgBox this_is_key另存为一个vbs文件,运行下就得到flag了。
ps:这里有一个陷阱是"Else If",VB中的关键字是"ElseIf"(没有空格),所以你如果要格式化代码,你必须把Else后面的If到End If当成一行,否则你运行代码会报找不到Next。

C#代码:

int[,] num = new int[5, 5];
num[0,0] = 70;num[0,1] = 33;num[0,2] = 108;num[0,3]= 545;num[0,4] = 78;
num[1,0] = 121;num[1,1] = 87;num[1,2] = 11;num[1,3]= 465;num[1,4] = 575;
num[2,0] = 105;num[2,1] = 33;num[2,2] = 45;num[2,3]= 356;num[2,4] = 251;
num[3,0] = 116;num[3,1] = 104;num[3,2] = 333;num[3,3]= 356;num[3,4] = 457;
num[4,0] = 85;num[4,1] = 33;num[4,2] = 33;num[4,3]= 24;num[4,4] =  564;

string this_is_key = "";

for(int i = 0; i <= 4; i++){
	for(int j = 0; j <= 4; j++){
		if(j == 0 || i + j == 2){
			this_is_key = this_is_key + (char)num[i, j];
		}
		else{
			if(j == 0 || i == 2 + j){
				this_is_key = this_is_key + (char)num[i, j];
			}
		}
	}
}
Console.WriteLine(this_is_key);

Flag:

温馨提示: 此处内容需要评论本文后刷新才能查看,支付2元即可直接查看所有Flag。

小广告:关于获取西普实验吧所有Flag请点击这里查看索引

查看所有Flag文章需要输入密码,需要获取文章密码的童鞋请扫描下面微信或支付宝二维码捐助至少2元(老哥,捐多捐少是个缘分)之后发送支付凭证号联系我获取,Flag大全地址:Flag大全

新功能:捐款的小伙伴请联系我把自己的注册邮箱加入网站白名单,可以免回复看到本站所有Flag

PS:本站不是实验吧的官方站点,纯粹是个人博客,收取Flag费用仅是维持服务器费用,做站不易,且行窃珍惜!

微信二维码:
支付宝二维码: