先前网上的题解多多少少有些问题,或者是代码没法运行,就想重新写个blog阐述的更清楚一些~ (借鉴了些前人的blog~)
题目如下:
++++++++++++[>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++<<<<<<<-]>>>>+++.<-----.>---.<+++.>>>>+++.<<<<----.>>>++++++.<<<<<+++.--.>>>>>----.<<<++++.<<+++.>>>>+++.>---.>++.
百度到了题干为brainfuck语言的编码,然而并没有在线的解码器。。。几经搜索终于找到了一个用编好的解释器的exe文件。
链接如下http://download.csdn.net/detail/jcysndn/8010163。
使用方法如下:
1.将brainfuck代码放在一个txt文件里,将后缀名改为.b(文件名自取)。
2.将exe文件和要解码的文件放在一个文件夹里。
3.运行exe程序即可。
答案:wctf{Br31nF4ck}
附上解码器的源文件(C语言):
/*bf.c*/
#include <stdio.h>
#include <stdlib.h>
char s[30000]={0};
char code[100000];
int len = 0;
int stack[100];
int stack_len=0;
int main(int argc,char**argv)
{
char c;
int i,j,k,x=0;
int m,n;
FILE* f;
char* p=s+10000;
if(argc==2) {
f=fopen(argv[1],"r");
if(f==NULL) {
perror("fopen");
return 1;
}
while(fread(&code[len],1,1,f)==1) {
len++;
}
} else return 2;
/*optimization*/
/*We can prove that n is never greater than m.So we can use the same memory*/
for(m=0,n=0,c=0,j=0;m<len;m++) {
switch(code[m]) {
case '+':
switch (j) {
case 1:
code[n++]='>';
break;
case -1:
code[n++]='<';
break;
case 0:
break;
default:
code[n++]='p';
code[n++]=j;
break;
}
j=0;
c++;
break;
case '-':
switch (j) {
case 1:
code[n++]='>';
break;
case -1:
code[n++]='<';
break;
case 0:
break;
default:
code[n++]='p';
code[n++]=j;
break;
}
j=0;
c--;
break;
case '>':
switch (c) {
case ((char)1):
code[n++]='+';
break;
case ((char)(-1)):
code[n++]='-';
break;
case ((char)0):
break;
default:
code[n++]='a';
code[n++]=c;
break;
}
c=0;
j++;
if(j==0x7f) {
code[n++]='p';
code[n++]=0x7f;
j=0;
}
break;
case '<':
switch (c) {
case ((char)1):
code[n++]='+';
break;
case ((char)(-1)):
code[n++]='-';
break;
case ((char)0):
break;
default:
code[n++]='a';
code[n++]=c;
break;
}
c=0;
j--;
if(j==-128) {
code[n++]='p';
code[n++]=-128;
j=0;
}
break;
case '.':
case ',':
case '[':
switch (c) {
case ((char)1):
code[n++]='+';
break;
case ((char)(-1)):
code[n++]='-';
break;
case ((char)0):
break;
default:
code[n++]='a';
code[n++]=c;
break;
}
c=0;
switch (j) {
case 1:
code[n++]='>';
break;
case -1:
code[n++]='<';
break;
case 0:
break;
default:
code[n++]='p';
code[n++]=j;
break;
}
j=0;
code[n++]=code[m];
break;
case ']':
switch (c) {
case ((char)1):
code[n++]='+';
break;
case ((char)(-1)):
code[n++]='-';
break;
case ((char)0):
break;
default:
code[n++]='a';
code[n++]=c;
break;
}
c=0;
switch (j) {
case 1:
code[n++]='>';
break;
case -1:
code[n++]='<';
break;
case 0:
break;
default:
code[n++]='p';
code[n++]=j;
break;
}
j=0;
if(n-1>=0&&n-2>=0&&code[n-2]=='['&&(code[n-1]=='+'||code[n-2]=='-')) {
code[n-2]='0';
n--;
} else {
code[n++]=code[m];
}
break;
default:
break;
}
}
len=n;
setbuf(stdout,NULL);
#if 0
for(i=0;i<len;i++)
putchar(code[i]);
return 0;
#endif
i=0;
while(i<len) {
switch(code[i]) {
case '0':
*p=0;
break;
case 'a':
i++;
*p+=code[i];
break;
case 'p':
i++;
p+=code[i];
break;
case '+':
(*p)++;
break;
case '-':
(*p)--;
break;
case '>':
p++;
break;
case '<':
p--;
break;
case '.':
putchar((int)(*p));
//printf("put:%hd\n",*p);
break;
case ',':
*p=getchar();
break;
case '[':
if(*p) {
stack[stack_len++]=i;
} else {
for(k=i,j=0;k<len;k++) {
if(code[k]=='a'||code[k]=='p') {
k++;
continue;
}
code[k]=='['&&j++;
code[k]==']'&&j--;
if(j==0)break;
}
if(j==0)
i=k;
else {
fprintf(stderr,"%s:%d\n",__FILE__,__LINE__);
return 3;
}
}
break;
case ']':
i=stack[stack_len-- - 1]-1;
break;
default:
break;
}
i++;
//x++;
//printf("%d : i=%d\n",x,i);
}
return 0;
}
在VS中生成exe文件后仿照上面的方法就可以运行啦~