本帖最后由 zzhwaxy 于 2020-5-15 10:43 编辑
娱乐向CM
闲着无聊,写了一个CM。
是用VC++6.0编译的win32控制台程序。
题目本身并没有难度
感兴趣的可以来挑战一下。
如果做出来了可以分享一下你的答案。
GOOD LUCK!
分割线
下面介绍一下我的设计思路和开放源代码
平时做逆向题目的时候,总会碰到各种循环,所以我就利用跳转难以读懂的特性,稍微动了点手脚。
程序的流程
以输入的字符串长度作为switch分支语句的入口点。
难点在于字符串长度不知道,难以预测一开始走的是哪一个。
对每一位输入做判断,每一个判断有两个跳转。
这里使用了 count 来验证最后的跳转。
考虑不周,存在多解的情况。
源代码
#include<stdio.h>
#include<string.h>
int main()
{
int len;
int i=0,count=0;
char name[20];
printf("Please input key:\n");
scanf("%s",name);
len=strlen(name);
if(len<0 || len > 10 )
{
goto end;
}
switch(len){
case 0:
Label0:
if(name[i]=='z')
{
i++;
count-=1;
goto Label1;
}else if(name[i]=='q')
{
i++;
count+=1;
goto Label2;
}
case 1:
Label2:
if(name[i]=='w')
{
i++;
count+=2;
goto Label3;
}else if(name[i]=='r')
{
i++;
count+=1;
goto Label4;
}
case 2:
Label4:
if(name[i]=='x')
{
i++;
count+=1;
goto Label5;
}else if(name[i]=='e')
{
i++;
count+=4;
goto Label6;
}
case 3:
Label6:
if(name[i]=='!')
{
i++;
count+=1;
goto Label7;
}else if(name[i]=='+')
{
i++;
count+=1;
goto Label0;
}
case 4:
Label8:
if(count==9)
{
printf("Success!");
getchar();
getchar();
return 0;
}
else
{
getchar();
getchar();
printf("Failed");
break;
}
case 5:
Label7:
if(name[i]=='<')
{
i++;
count-=1;
goto Label8;
}else if(name[i]=='+')
{
i++;
count+=1;
goto Label2;
}
case 6:
Label5:
if(name[i]=='y')
{
i++;
count+=1;
goto Label6;
}else if(name[i]=='p')
{
i++;
count+=1;
goto Label7;
}
case 7:
Label3:
if(name[i]=='a')
{
i++;
count+=3;
goto Label4;
}else if(name[i]=='x')
{
i++;
count+=2;
goto Label5;
}
case 8:
Label1:
if(name[i]=='h')
{
i++;
count+=2;
goto Label2;
}else if(name[i]=='r')
{
i++;
count+=1;
goto Label3;
}
case 9:
if(name[i]=='z')
{
i++;
count+=1;
goto Label0;
}
else if(name[i]=='/')
{
i++;
goto Label1;
count-=1;
}
break;
}
end:
printf("Failed");
getchar();
getchar();
return 0;
}
|