IDF实验室之初探乾坤Fuck you brain

先前网上的题解多多少少有些问题,或者是代码没法运行,就想重新写个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文件后仿照上面的方法就可以运行啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值