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;
}

#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},提交通过