CTF【每日一题20160613】

谁是卧底
原题:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=49
武林中某知名杀手在一次任务中失败,然后逃窜到了人群中,当时那个社会并没有我们现在这么发达,满地都是文盲,而这些文盲甚至连一句完整的英文都说不出来,所以其实只要用心去发现,就会很容易发现这个稍微有些文化的杀手是谁哦~答案wctf{杀手的英文名}
人群→ http://pan.baidu.com/s/1bnq6nmR
密码: 988u

——————————–问题与答案的分界线———————————-
分析:

这个题的含义是要分析其中的完整单词,linux下有个工具叫做wc,这个命令用于统计文件中有多少字,多少行,多少字节。用法如下:
wc [-lwm]
-l:仅列出行
-w:仅列出字数
-m:多少字符
wc常用与统计一个目录中包含多少文件:ls  |  wc –l

在本题中,可以如下图所示运行:

这里写图片描述

0,1,5586640分别表示该文件由0行(其实就是1行),1个word,5586640个字符构成。这里的1个word表示的是两个空格间的词,其实这个文本中所有字符都连在一起,没有空格,所以这个word的长度就是5586640,对我们没有意义。
查阅了一个有趣的统计网站http://hearle.nahoo.net/Academic/Maths/Sentence.html
这个网站统计了英文单词和句子的平均长度,这个网页上给出了平均值:The mean of the values taken from the table can be used to draw a line of best fit on a scatter diagram. The mean values of X and Y are as follows:
X =  = 5.084    Y =  = 24.46
其中:
X = Mean word length throughout text
Y = Mean sentence length throughout text    
这个值可能不太准,但应该影响不大,我们姑且认为一个英文句子的长度约为25个字符。这将作为后续分析的基础知识。
要找到卧底,就是要找到一句相对完整的句子。我们的分析程序将从这个文件中每次取出25个字符,作为一个句子,然后用一个英文单词列表文件去匹配它,统计这25个字符中有几个单词,然后记录单词数最大的那个句子在文本中的位置,或者直接存到一个变量里,找出来以后再用人眼识别一下,估计答案就出来了。
为了获取单词列表,我发现一个网站,它维护了一个英文单词表,并将其按使用频率进行排列,这个排列太有用了。http://www.newgeneralservicelist.org/
根据这个网站提供的1.0版本的NGSL,我整理了2480个单词,这些单词是排名最靠前的2480个,既然过去没有多少有学问的人,那么他们会的单词应该都是些常用词,所以用这些词做字典就够了。
为解决此题,写了如下程序:
# -*- coding: utf-8 -*-   
import datetime
'''
本程序很丑,没有经过优化,仅为简单解答该题目
输出结果是一个列表,表中每行前的数字表示后面100个字符中可组成多少个英文单词
根据题意,卧底是最有可能说出完整句子的人,
这个程序就是通过计数来帮助人判断一个字符串是否为英文句子。

'''

def getwordnum(string,wordlistfile):
    count = 0

    w = open(wordlistfile,'r')#open the word list
    try:
        for aword in w:         
            word = aword.strip('\n').strip('\r').strip()
            if string.find(word) != -1:
                count += 1
    finally:
        w.close()
    return count

if __name__ == '__main__':
    #To record the algorithm start time'
    start = datetime.datetime.now()#time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) 
    maxnum = 0
    thewords = ''
    f = open('whoiswoldy.txt','r')#open the object of analysis

    try:
        done = 0
        while not done:
            a = f.read(100)#每次取100字符,原先设想每次取25字符(英文句子平均长度),但效率太低
            if a != '':         
                num = getwordnum(a,'wordslist.txt')
                if maxnum < num:
                    maxnum = num
                    print '----------------'
                    print maxnum,a
            else:
                done = 1
    finally:
        f.close( )
    #To record the algorithm end time'
    end = datetime.datetime.now()
    print 'The program costs '+ str((end-start).seconds)

在pypy(python的一个快速版本)下运行该程序,速度会快不少。得到的结果如下:

----------------
10 kkjfemiwirijkbukxgkzkrsmgkhnhubtbtdwxszikocbyclayrosdepwvxjemcftfurniturevjfl
trpxepdyhitpetqewcsajkv
----------------
13 asurykoccsmemamanpempirepchpzooehibxnabbhlucxcqhdodinwtgxdqomldxtkheurrzcdimb
cdacpyaaolrhktxvuyknone
----------------
17 yrsgvidwfodwxomxsndgyvlitwdoytztbohimdsxdgqykqadcupdwofpdwrohpsolverhtzhworry
qjsrelationglclbbyboard
----------------
18 xttlqnvkmdqxgwxxfyyodsqxfmetydelightkmanufacturebywgkwfjavdltupgaykrwkxxuaabi
kbvjgdrwpddonsrnojbsdmr
----------------
19 lfsarttheretdpqxcrmuztxbsdfvyzgyxwrtuowallxieioeewetajmwcaasjjislandjtdqobnbe
fzlettauqvrwrigltwtzkxq
----------------
23 pddoperformmsvwkychrxwypxuekgbdgaawrotwknscgwzxmcsomehowevjypmwyrfupusfivulfr
njjscatlsbithusuhlkqgrw
----------------
26 lqxsatisfactorysvfklobaklogmsqinclearvybqjaarecnvwhiteofnnqakgnujanotheryufum
wbgphjqslsgvpmgtqpduily
----------------
27 gojashlfpxlmglpqmostonolsbkgnjqaizcmoxdeterminebogqfgpatienceftablerfjmxswxxj
yyearzanywherewedkpyabm
----------------
28 hazbornndomhfchvlcwhatwillyouseeifyouthrowthebutteroutthewindowwzqmtwmyjutipv
qetrsshyosypzydeveloppo
----------------
30 yearthtsroperatermcjybabisqmhzoceijwifoffphwionpqxujcneverywheresdkdmxbnasbyd
yotzbdtofjnqoilfnnzxlme
从下向上看,发现命中28个单词的那100个字符中,有一句完整英文:
whatwillyouseeifyouthrowthebutteroutthewindow
这是个英文谜语,解答为butterfly

本题答案:wctf{butterfly}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值