西邮Linux小组免试题——继续挑战

上一篇博客(http://www.cnblogs.com/ma6174/archive/2013/05/04/3058889.html)发表后,西邮Linux小组发微信并且在博客上提示挑战还没有结束,这个提示:“对不起,你目前还没有通过任何一次面试.”和这次挑战没关系。看来是我理解错了,小组那边也疏忽了这个问题。还要继续挑战。

晚上看到@goodname大神的回复,说是图片可以解压,尝试了一下,7z e new.jpg,奇迹出现了,提示输入密码,上文提到,我们已经获得密码了,输入密码:LinusTorvalds1969,得到了一个文件:new.txt!内容是StayHungryStayFoolish,看来这就是进入下一关的密码了!!太神奇了,一张图片,竟然可以隐藏这么多的信息!真心佩服西邮Linux小组!

果断在微信上输入密码:StayHungryStayFoolish,顺利进入下一关。

第四关

输入上面的密码之后,微信返回一张图片

/images/xiyou04.jpeg

分析

这个题看着像是找规律的,给你几个坐标点的值,让你算(-5,-5)那个点的值。什么规律呢?我个人比较懒,规律都懒得找,让谷歌帮我找找吧,将上面的数字谷歌一下,点开第一个结果,就来到了这个网站:http://answers.yahoo.com/question/index?qid=20100308160117AAPQ1pp,这个网站上有人提问:

1 1 1 3 5 9 17 31 57 WHAT IS THE RULE FOR THE PATTERN?
I AM TRYING TO FIND THE RULE FOR THE PATTERN.

再回去审视一下那张图片,看到规律了吧?!简单描述一下就是从(0,0)坐标开始,先向左,再向上,然后向右,向下,就是沿着数字增大的方向,正好是一个顺时针的螺旋线!再来看看数字有什么规律?万能的谷歌其实刚才已经告诉我们答案了,在打开的那个雅虎问答网站上,有人回答:3 previous digits equal the next one. 1+1+1=3 1+1+3=5 1+3+5=9 etc.。懂了吧?就是说从第四个数开始每个数就是前三个数的和。感觉和斐波那契额数列差不多。写个递推或者递归程序很轻松就能解决。还有个问题比较关键,坐标(5,5)那个点是第几个数?如果想不出来的话就在纸上画画,比如楼主这么笨的人就是在纸上画出来的。后来想明白了,不画也可以的,因为按照图片的环绕方法,只要绕到(5,5)那个点,那么坐标绝对值小于5的点肯定是被绕到的,也就是说要算一个数,那么我们只需要算以(|5|,|5|)为边界的正方形里面有多少点就是了。很明显,每行11个,总共11行,11×11=121,也就是算第121个数的值!python解决这种问题小菜一叠:

a = [1,1,1]
for i in range(3,121):
    a.append(a[i-1]+a[i-2]+a[i-3])
    print i,a[i]

这里使用了递推算法,因为递归层数太深,效率太低。通过这个程序算出,第121个数是:24948097296824045968731381433737,真没想到竟然这么大!幸亏我用python这门语言,天生支持大整数,不然用C等程序再去处理大整数就费劲了!人生苦短,大家抓紧时间去学学python吧!

将这一长串数字输入到微信,然后顺利进入最后一关!

第五关

输入上面的数字之后,微信返回下面的信息:

[5/5]
IP:222.24.19.63
username:last
passwd:good_job

看这意思,应该是最后一关了,给你用户名和密码,让你去登陆,但问题来了,在浏览器上输入上面的IP,根本打不开,本机ping了一下,不通,然后又在站长工具上ping了一下,全部超时。然后又扫了一下那个IP的端口,什么都没扫出来。然后查了一下这个IP的归属地,结果:

查询的 IP222.24.19.63 来自:陕西省西安市 邮电学院

GeoIP: Xian, China

China Education and Research Network

看来这是个教育网。我们学校的网站对外只开放80端口,也就是说外网只能访问服务器的80端口,内网没用限制,难道西邮也这样?这仅仅是一种猜测。或许题目设计者故意这么设计的,可能还需要一些特殊的方法才能访问到这台服务器。比如借助其他机器访问。

首先先扫扫222.24.19.0/24这个网段吧: 这是2013年5月5日0点55分的扫描结果

$ nmap -sP 222.24.19.0/24  

Starting Nmap 5.21 ( http://nmap.org ) at 2013-05-05 00:54 CST
Nmap scan report for 222.24.19.3
Host is up (0.073s latency).
Nmap scan report for 222.24.19.4
Host is up (0.088s latency).
...此处省略若干行...
Nmap scan report for 222.24.19.201
Host is up (0.072s latency).
Nmap scan report for 222.24.19.202
Host is up (0.087s latency).
Nmap done: 256 IP addresses (66 hosts up) scanned in 4.89 seconds
$

扫了一下,收获不小啊,这个网段内竟然有66台机器是开着的!半夜一点还开机,除了程序猿的电脑就是服务器了(小码哥语录)!哈哈!66台,看来这应该是一个服务器的地址段,随便找几个看看。

打开最后那个222.24.19.202一看,我差点笑出来!为什么呢?先看张截图,题目明天再做,下面这个更有趣。

/images/xiyouzhengfang.png

正方教务系统!!这个还没啥可笑的,大家仔细看我圈出来的那块验证码,这里需要我们输入红色的文字,除了谷歌的验证码,没见过比这还变态的!知道这变态验证码的来历吗?听小码哥慢慢道来~

记得去年冬天,我们Linux小组在一起讨论技术,聊到了教务管理系统。原来正方教务系统是没用验证码的,但是查询不太方便,关键是我们学校在校外几乎不能访问教务系统,寒暑假想查成绩那叫一个难啊!于是乎,我们Linux小组以拯救全人类的身份站出来了,一定要打通对外通道,要让校外的学生方便查成绩!由于我们的特殊网络环境,对外只能开放80端口,要帮助外界访问校内网站的话,不外乎有以下几种方式:

  1. 使用代理:原理很简单,就是我在外网不能访问正方系统,但是代理服务器能访问,我还能访问代理服务器,那么我们只要像代理服务器发送请求,然后代理服务器向正方系统发送请求,然后正方系统返回给代理服务器,然后代理服务器再返回给我们就OK了。代理可以使用ssh或者squid

  2. 使用VPN:通过连接学校的VPN服务器,我们就和学校的VPN服务器建立了一个虚拟专用网络(Virtual Private Network),也就是说我们的网络就和服务器在一个网段,也就是校内网啦,校内网访问正方肯定是没问题的,于是乎就能正常查成绩了。

  3. 做一个新的网站,网站的功能就是获取用户的正方系统用户名和密码(好孩子从来不保存人家的密码),根据用户的需求,我们去正方系统模拟登陆,然后查询信息,再将有用的信息返回给用户。当然,这个新的网站必须是能快速访问到正方系统的。

分析了一下,使用代理和VPN都比较麻烦,对新手来说往往不知道怎么设置,但是网站就简单了,只要知道域名,打开浏览器就访问访问,简单,方便,还好扩充新功能。

于是,我联合@zhwei一起搞了个http://gotit.asia/正方教务系统查询网站。当初做这个网站的时候,功能很单一,就是同学输入自己的学号密码,选择查成绩或者查课表,然后我们就查出来了。那是相当方便啊!寒假放假前和寒假里,我们的网站迎来了访问小高峰,每天的访问量最少也要几千吧。(PS:北京时间:半夜两点整)

假期里,我们又增加了计算学分基点功能。但是好景不长,有一天zhwei突然给我打电话说网站出问题了,没法查询了,跑教务处网站一看,原来是教务处网站增加验证码了!估计是管理员发现教务处的异常,也就是大量访问来自同一个IP(仅仅是猜测),然后增加了这样的验证码:

/images/yanzhengma_small.gif

上面的图像太小,放大一下看看

/images/yanzhengma.png

分析一下,我们可以看到这个验证码还是比较变态的,数字验证码,每个数字颜色不同,单个数字组成的像素点颜色也不同,还有大量干扰点,字体还这么小。

商量了一下,然后就开始和zhwei同学搞这个验证码,之间学了python图像处理相关知识,还有高级点的python模拟提交(就是有验证码),还有就是用firefox的firebug插件分析网络请求等知识。

经过一段时间的研究分析和测试,我们是这样的:首先是将验证码图像灰度图像,也就是黑白的,然后再降噪,删除干扰点,处理之后,大约能达到这样的效果:

/images/changed_yanzhengma.png

上面的图片处理的就算是比较好了。然后再用ocr字符识别程序自动识别验证码。经过测试,识别正确率能达到百分之八九十,这就很好了,如果识别不成功,重新抓一张图片去识别,多抓几张,识别成功率就高了!哈哈。

至此,我们的查成绩网站就比教务处的网站有优势了:校外能登陆,不用输入验证码,查成绩课表考试时间等方便,还能自定计算学分基点,那叫一个好用啊!哈哈!访问量更是提高啊,最高一天5万PV!8000多独立访客!放一张网站的百度统计图炫耀一下:

/images/gotit_pv.png

后来我们又增加了四六级查询功能。但是好景不长,终于有一天,又接到了@zhwei的电话,说,网站有不能用了,快去看看正方系统吧!打开一看,就像前面看到那张西邮的正方系统截图一样,验证码成中文了,但是,我们学校的验证码比西邮的还变态,因为西邮的大部分汉字我们还是认识的,我们学校的字好多都是生僻字,都不认识!大学白上了!汗~

还要想法解决中文验证码问题啊!打算用原来那种方式,简单处理后交给OCR去识别,但是OCR在识别中文的时候就不是那么给力了,识别率低得惨不忍睹!这么多汉字,我们不可能去手工建字模识别,干脆直接让用户去识别吧!

由于网站只让输入红色的汉字,那我们就过滤一下呗,把不是红色的汉字过滤掉,让用户方便识别和输入。

但是新的难题又来了,因为验证码刷新之后每次都会变,那么如何将正方系统的验证码放到我们的网站上还能保证验证码不过期呢?经过一番研究之后,发现下面的方法可行:

用户访问我们的gotit查成绩网站,我们在后台首先访问一次正方网站,记录cookies和viewstate等信息,然后用这个cookies去请求验证码,抓取下来之后,将图片显示给用户,当然包含这个验证码和viewstate。我们将这些验证码和viewstate等信息保存下来,其实是把那个函数保存下来,这就是python里面的闭包。因为用户的请求是无连接的,我们如何区分用户输入的验证码是哪个验证码呢?把viewstate一块传递到前台,用户在输入用户名,密码还有验证码,点击提交的时候,viewstate一块传递到后台,然后我们后台就能根据viewstate来定位到原来的访问函数来继续访问!这样检索到成绩等信息后再返回。终于搞定了! 记得当时模拟这个过程的时候没有注意编码,正方是gb2312的,我在linux下写python一直用utf-8,怎么交都不行。后来还是@zhwei发现了这个问题才让我们实现登陆功能。

(PS:北京时间:半夜三点整)

啰啰嗦嗦一大堆,简单概括一下,就是:

正方没验证码          -> gotit网站能正常查成绩 -> 
正方升级增加数字验证码 -> 我们的网站自动识别验证码登陆 ->
正方升级增加中文验证码 -> 我们处理中文验证码让用户输入然后登陆查成绩 ->

明天,不,今天我们学校还要举行第四届ACM校赛,我还要看场子去呢!二三百号人呢!今天就少扯点,第五关忙完了再搞。

posted on 2013-05-05 05:09  ma6174  阅读(4207)  评论(14编辑  收藏

导航