IDF实验室·初探乾坤1-3

1.简单编程-字符统计


这里这里 → http://ctf.idf.cn/game/pro/37


       打开连接之后是一大长串字符,题目的要求是在2s中统计出5种字符的个数,统计出来不复杂,复杂的就是时间限制。之前用过java建立html连接,首先放上相应的Java代码,其中有的头文件用不上。

package http;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;

public class XK {
	static HttpContext localContext = new BasicHttpContext();
	static BasicCookieStore localCookies = new BasicCookieStore();
	
	public static byte[] getData(String uri, List<NameValuePair> l) {
		try {
			DefaultHttpClient client = new DefaultHttpClient();
			client.setCookieStore(localCookies);
			HttpPost request = new HttpPost(uri);
			UrlEncodedFormEntity requestEntity = new UrlEncodedFormEntity(l);
			request.setEntity(requestEntity);
			localContext.setAttribute(ClientContext.COOKIE_STORE, localCookies);
			HttpResponse response = client.execute(request, localContext);
			long entitylen = response.getEntity().getContentLength();
			Header contenttype = response.getEntity().getContentType();
			String type = response.getEntity().getContentType().getName();
			InputStream in = response.getEntity().getContent();
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024];
			while (true) {
				int len = in.read(buffer);
				if (len == -1)
					break;
				out.write(buffer, 0, len);
			}

			byte[] result = out.toByteArray();
			return result;
		} catch (Exception e) {

		}
		return null;
	}
	public static void main(String[] args )
	{
		
		byte[] data = getData("http://ctf.idf.cn/game/pro/37/", new ArrayList<NameValuePair>());
		try {
			String ans = new String(data,"utf-8");
			System.out.println(ans);
		} catch (UnsupportedEncodingException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
}

       需要导入的jar包有commons-logging-1.0.4.jar,httpclient-4.2.1.jar , httpcore-4.2.1.jar
       获得wctf{timeout_prog}
       网上还有很多Python爬虫代码,相对java来说简化了不少,在这就不介绍了。

2.谁是卧底



武林中某知名杀手在一次任务中失败,然后逃窜到了人群中,当时那个社会并没有我们现在这么发达,满地都是文盲,而这些文盲甚至连一句完整的英文都说不出来,所以其实只要用心去发现,就会很容易发现这个稍微有些文化的杀手是谁哦~答案wctf{杀手的英文名}


人群→ http://pan.baidu.com/s/1bnq6nmR

密码: 988u


     下载网盘中的文件后发现是一个存有超长字符串(长度5586640)的文件,里面的字符串真的很乱,再读一下题干,懂了,应该是有一句完整的话藏在字符串中。在网上搜索常见单词做一个单词表命名为vec.txt,对单词表中的每一个单词,利用find()函数寻找他们所在的位置,并新建标记数组对应位置置为1,之后对标记的数组在进行一次便利,看每个位置的前三十和后三十这段长尾60的字符串中有多少个位置被置为1,即在附近有较多单词。排序,输出最大位置,读出附近文字。

#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

struct Node
{
    int s;
    int data;
};
int a[20000000]={0};
Node b[20000000];


bool cmp(Node x,Node y)
{
    return x.data>y.data;
}

int main()
{

    ifstream fin("vec.txt");
    ifstream f("whoiswoldy.txt");
    string s;
    f>>s;
    string v;
    while((fin>>v))
    {
        int tmp=s.find(v,0);
        while(tmp!=v.npos)
        {
            a[tmp]++;
            tmp=s.find(v,tmp+1);
        }
    }

    cout<<"s="<<s.size()<<endl;

    for(int i=0;i<20000000;i++)
    {
        b[i].s=i;
        b[i].data=0;
    }
    for(int i=30;i<s.size()-30;i++)
    {
        for(int j=i-30;j<i+30;++j)
        {
            if(a[j])
            {
                b[i].data++;
            }
        }
    }
    sort(b,b+20000000,cmp);
    for(int i=0;i<10;i++)
    {
        cout<<b[i].s<<" ";
    }
    cout<<endl;
    for(int i=b[0].s-30;i<b[0].s+30;i++)
    {
        cout<<s[i];
    }
    return 0;
}


       其中成句的话为what will you see if you throw the butter out the window 这是个谜语(好冷的谜语,,)答案是butterfly,提交wctf{butterfly},通过!

3.Fuck your brain


这是什么,你能理解它吗?


++++++++++++[>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++<<<<<<<-]>>>>+++.<-----.>---.<+++.>>>>+++.<<<<----.>>>++++++.<<<<<+++.--.>>>>>----.<<<++++.<<+++.>>>>+++.>---.>++.


       
题干是一种编程语言。之前玩过一个网页闯关的游戏,在某一关看到过这种编码,并且跟题目呼应,编码方式叫做brainfuck(不知道会不会被和谐掉)。这种编码方式特点就是用到的操作极少,总共只有八种字符,当然写出来的代码就不是很好读了。知乎上有一个回答专门讲的brainfuck编码,并号称5分钟就能学会这门语言 https://www.zhihu.com/question/20002558,我个人读完之后确实理解了,不过实际操作起来太复杂,所以写了一个c++代码充当这种语言的编译器(没有进行读操作的判断,毕竟这个题也不需要),在终端输入brainfuck字符串就可以得到相应输出。代码如下:
#include<iostream>
#include<stdio.h>
using namespace std;

int a[100]={0};

int main()
{
    string s;
    cin>>s;
    int tmp=0;
    int flag;
    for(int i=0;i<s.length();i++)
    {
        if(s[i]=='+')
        {
            a[tmp]++;
        }
        else if(s[i]=='-')
        {
            a[tmp]--;
        }
        else if(s[i]=='>')
        {
            tmp++;
        }
        else if(s[i]=='<')
        {
            tmp--;
        }
        else if(s[i]=='[')
        {
            flag=i;
        }
        else if(s[i]==']')
        {
            if(a[tmp]!=0)
            {
                i=flag;
            }
        }
        else if(s[i]=='.')
        {
            printf("%c",a[tmp]);
        }


    }
    return 0;
}

复制题干中的字符,去掉换行之后输入,得到结果如图
看来答案就是WCTF{Br31nF4ck},提交通过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值