CTF【每日一题20160613】

来源:互联网 发布:淘宝客订单怎么看 编辑:程序博客网 时间:2024/05/24 15:37

谁是卧底
原题: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 textY = 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 countif __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 kkjfemiwirijkbukxgkzkrsmgkhnhubtbtdwxszikocbyclayrosdepwvxjemcftfurniturevjfltrpxepdyhitpetqewcsajkv----------------13 asurykoccsmemamanpempirepchpzooehibxnabbhlucxcqhdodinwtgxdqomldxtkheurrzcdimbcdacpyaaolrhktxvuyknone----------------17 yrsgvidwfodwxomxsndgyvlitwdoytztbohimdsxdgqykqadcupdwofpdwrohpsolverhtzhworryqjsrelationglclbbyboard----------------18 xttlqnvkmdqxgwxxfyyodsqxfmetydelightkmanufacturebywgkwfjavdltupgaykrwkxxuaabikbvjgdrwpddonsrnojbsdmr----------------19 lfsarttheretdpqxcrmuztxbsdfvyzgyxwrtuowallxieioeewetajmwcaasjjislandjtdqobnbefzlettauqvrwrigltwtzkxq----------------23 pddoperformmsvwkychrxwypxuekgbdgaawrotwknscgwzxmcsomehowevjypmwyrfupusfivulfrnjjscatlsbithusuhlkqgrw----------------26 lqxsatisfactorysvfklobaklogmsqinclearvybqjaarecnvwhiteofnnqakgnujanotheryufumwbgphjqslsgvpmgtqpduily----------------27 gojashlfpxlmglpqmostonolsbkgnjqaizcmoxdeterminebogqfgpatienceftablerfjmxswxxjyyearzanywherewedkpyabm----------------28 hazbornndomhfchvlcwhatwillyouseeifyouthrowthebutteroutthewindowwzqmtwmyjutipvqetrsshyosypzydeveloppo----------------30 yearthtsroperatermcjybabisqmhzoceijwifoffphwionpqxujcneverywheresdkdmxbnasbydyotzbdtofjnqoilfnnzxlme
从下向上看,发现命中28个单词的那100个字符中,有一句完整英文:whatwillyouseeifyouthrowthebutteroutthewindow这是个英文谜语,解答为butterfly本题答案:wctf{butterfly}
0 0