西邮Linux兴趣小组2014级免试挑战题
又到了小组纳新的季节^_^,时间过的真快! 想起去年这会儿自己做免试题的时候根本找不着北@_@ 有幸今年能够在这里和大家分享免试挑战题,也正如我们的纳新宣传语:"在这里,让每一个意想不到成为意料之中"。
免试题共有设五关,分别由小组13级成员:郭遗欢、李林翰、高朴、王博、王伟豪 五位同学负责出的,在此向他们付出的辛苦表示感谢!
计算机的世界是从0和1开始的,正如前两年的免试题一样,都是用一大串的01开头,虽然今年的免试题并不是这样,但几乎每一关都有01的身影~_~。免试题旨在发散同学们的思维,运用计算机方面的基础知识,挑战通关,超越自我 !!下面是前两年的免试题链接:
2012级免试题: 西邮Linux小组免试题揭秘
2013级免试题: 西邮Linux兴趣小组13级纳新免试题浅析
下面由博主来简单分析一下今年的免试题,由于能力有限,有啥不够严谨之处欢迎大家留言交流~
【 第一关】
首先是小组微信公众号(xiyoulinux)上推出了免试题的最新动态,给的是一个链接:orz.xiyoulinux.org。打开后发现是一个伪造的静态页面(下图),之所以说是伪造的,是因为小组官网是www.xiyoulinux.org,而且页面都一样,明显是个克隆品。
随便点了几下,发现上面的链接都失效了,查看一下网页源码,啥都没有提示。注意到推送消息上有明显的这么一句话:“小伙伴们这边瞧 <img src="一张图"/>”结合给的这个页面,可能是在图片里藏了啥吧,试试看咯~将图片下载下来,挺大的,大概有6M,用vim打开这个sign.png文件,往下看看,发现最后面藏了一堆\xXX的字符串:
是hex格式的字符串,貌似后面的都是\x34\x38\x39之类的,复制前面一部分出来,找个在线的编码解码工具(http://bianma.911cha.com/)一下看看,在文本格式里发现了些猫腻:
注意到开头的两个字母:“QR”。QR是什么玩意?百度搜一下看看:
发现是二维码,也就是说QR后面的应该是一个二维码。继续分析后面的一堆数字:4948...,容易发现在ASCII码中,ASCII码为48的对应字符是0,49对应的是1.而在二维码中只有黑和白,所以0和1应该对应这两种颜色。现在,根据上面的想法试试:
将sign.png图片末尾\xXX格式的字符串复制到hex.txt,用python写个简单的脚本处理下:
#!/usr/bin/env python
# coding=utf-8 import binascii # 将\xXX字符串转换为ASCII字符串
f = open('hex.txt')
str = (str(f.readline())).replace('\n','')
f.close() list = []
for i in str[12:].split('\\x'):
ascii = binascii.a2b_hex(i)
list.append(ascii)
str1 = ''.join(list) # 将ASCII字符串转换成0,1的字符
i = 0
bin = []
while i < len(str1): bin_num = "%c" % int(str1[i:i+2])
bin.append(bin_num)
i += 2
bin_str = ''.join(bin)
print 'len(bin_str)=%d' % len(bin_str)
print 'bin_str=%s' % bin_str
上面的脚本运行后结果如下:
长度是625,正好是25x25的方正,找一个简单的二维码看一下格式就知道上面的分析是对的了^_^,下面就开始转换成二维码了,将上面的bin_str保存成qr_bin.txt,用python写个脚本(由于之前是每个数字生成一个像素点,发现二维码太小,所以将每个数字生成4个像素点):
#!/usr/bin/env python
# coding=utf-8 import Image MAX = 25
pic = Image.new("RGB",(MAX*2, MAX*2))
f = open('qr_bin.txt')
str = str(f.readlines())
f.close() i = 2
for y in range (0,MAX):
for x in range (0,MAX):
if(str[i] == '1'):
pic.putpixel([2*x,2*y],(0, 0, 0))
pic.putpixel([2*x+1,2*y],(0, 0, 0))
pic.putpixel([2*x,2*y+1],(0, 0, 0))
pic.putpixel([2*x+1,2*y+1],(0, 0, 0))
else:
pic.putpixel([2*x,2*y],(255,255,255))
pic.putpixel([2*x+1,2*y],(255,255,255))
pic.putpixel([2*x,2*y+1],(255,255,255))
pic.putpixel([2*x+1,2*y+1],(255,255,255))
i = i+1
pic.show()
pic.save("qr_code.png")
扫描二维码得到的结果是“never_give_up.php?key=value”。明显是个链接,访问这个链接发现没反应。看看这个链接,应该是要求找到key、value啥的。可能还有信息没有找到,打开之前的图片发现在\xXX字符串的上面还有一段明显的base64编码的字符串:“a2V5P3ZhbHVlP0gzMTkuNDpJNTYxLzEyMw==”,找个在线的编码一下,得到“key?value?H319.4:I561/123”看到了key和value,后面的就应该有这些信息吧。关键是,这个“H319.4:I561/123”是啥?呵呵,这会儿,就得考考常识了~~去图书馆借过书的同学可能就有意识了,这就是个索书号!!在图书馆官网上查了下,是本《莎士比亚十四行诗》,一共有四本。
莫非在书里有标记啥的?有个key、value?这是个坑么@_@?仔细想想,书上的统一编号(ISBN号)不就是个键-值对么!!当然,能想到这个,也是智力思维啊。替换key和value,访问链接:http://orz.xiyoulinux.org/never_give_up.php?ISBN=978-7-5135-1730-0 成功跳到第二关的页面^_^
【 第二关】
网页迷宫,有点意思哈,点进去试试,这尼玛分支咋越点越多,每个链接下面还有个0或者1,还是黑体加粗的,看来上面图片上说的很重要啊!既然是迷宫,就是要找到终点的那个出口嘛,当然走的路径很多,那估计也只有一个才是正确的吧。如果用0或者1表示通路或者障碍的话,点几个链接后发现不对:存在对应多个链接的情况哎。迷宫的常用算法是深度优先,广度优先等等。这些算法就是求最短路径的。所以,尝试着跑跑吧~~用深度优先试试发现不对。改用广度优先后跑了一分多钟发现可以到达终点:888888.html,下面是python写的脚本:
#!/usr/bin/env python
# coding=utf-8
import re
import urllib
from collections import deque queue = deque()
visited = set() url = '101223.html'
re_href = re.compile('href="(\d+\.html)"') queue.append(url)
cnt = 1
while queue:
url = queue.popleft()
visited = visited | {url} print(str(cnt) + ' Running: ' + url),
cnt += 1
urlop = urllib.urlopen('http://lewin.aliapp.com/'+url) try:
data = urlop.read().decode('utf-8')
except:
continue for x in re_href.findall(data):
if (x not in visited) and (x not in queue):
queue.append(x)
但是,到达888888.html页面后,发现还需要提交key,联想到去年与这类似的题,就算手动点到的终点,没有key不是白费的么?是不是有种想剁手的感觉!!好吧,不是说页面上的数字很重要么,全部记录下来吧,稍微改一下上面的代码:
#!/usr/bin/env python
# coding=utf-8
import re
import urllib
from collections import deque queue = deque()
visited = set()
bin = [] url = '101223.html'
re_href = re.compile('href="(\d+\.html)"')
re_bin = re.compile('<h1>(\d)') queue.append(url)
cnt = 1
while queue:
url = queue.popleft()
visited = visited | {url} print(str(cnt) + ' Running: ' + url),
cnt += 1
urlop = urllib.urlopen('http://lewin.aliapp.com/'+url) try:
data = urlop.read().decode('utf-8')
except:
continue try:
bin_num = re_bin.search(data).group(1)
print bin_num
bin.append(bin_num)
except:
print '\nMaybe got the last!'
break for x in re_href.findall(data):
if (x not in visited) and (x not in queue):
queue.append(x)
str = ''.join(bin)
print "\nbin_str= %s" % str
跑出来是下面的结果,将没一个页面的数字加起来又是一个长长的01字符串:
莫非又要进行啥转换?先试试直接提交看看吧,把这个长字符串提交,发现居然直接挑到下一关^_^,看来没啥要处理的。
【 第三关】
第三关的页面上有两张一样的图片:
查看一下网页源码,也没发现啥的,看看URL(http://www.geekgao.org/new/guess.html)注意到guess,那是叫咋猜啥呢?先把这两张图片down下来看看吧。既然是两张一样的图片肯定有啥区别,用binwalk(ps:binwalk是一个强大的文件格式分析工具,见FreeBuf介绍)分析一下这两张图片:
呵呵,第一张图片结尾藏了个zip文件,还藏了个rar文件,解压zip压缩包:unzip new.png 生成了一个???.txt文件,在linux下中文乱码,放到windows下可以看到“新建文本文档.txt”,看了下大小,居然是0,那就啥也没有咯,再看看那个rar文件吧,解压:unrar x new.png 提示需要密码,看来需要找密码了。不是还有一张对比的图片么,但是发现没藏啥的。看到上面两图片的Zlib数据包(ps:zlib是一种数据压缩的格式,在图片中存储图片像素点的数据块),通过神器Stegsolve(ps:Stegsolve是图片通道查看器,图片隐写必备工具,下载)来分析一下张两张图片的IDAT数据块吧。对比IDAT块的CRC(数据块校验和),发现有两张图片中有明显的的两个数据块不一样:
那就是像素点有不同了,用PS试试?不太会唉,好吧,写个python脚本对比一下像素点吧:
#!/usr/bin/env python
# coding=utf-8 from PIL import Image
list = [] img1 = Image.open("new2.png")
img2 = Image.open("new.png") img1_array = img1.load()
img2_array = img2.load() count = 0
for j in range(527):
for i in range(399):
if (img1_array[i,j]) != (img2_array[i,j]):
print i, j, img1_array[i,j],img2_array[i,j]
list.append(str(i))
list.append(str(j))
count += 1 print 'count= %d' % count
print 'pwd = '+''.join(list)
分析的结果如下,居然有20个不同的像素点(之后用PS之类的在放大之后发现也能看见图片的小点点~_~):
将各点的坐标连接起来之后,就是上面的pwd了,好吧,把这个字符串当密码来解压那个含有rar文件的图片,发现解压成功。至此第三关算是解出来了~~
在下一篇的博客中将继续分享:西邮Linux兴趣小组2014级免试挑战题(续)
西邮Linux兴趣小组2014级免试挑战题的更多相关文章
- 西邮Linux兴趣小组2014级免试挑战题 (续)
在上一篇的博客中已经解到第四关了,现在继续挑战-- [ 第四关] 在上一关解压成功后,生成了一个file文件.用vim的二进制格式打开,转成十六进制,发现文件头格式如下: 是个以ELF字符开头的文件, ...
- 西邮linux兴趣小组2014纳新免试题(五)
[第五关] 题目 http://final5.sinaapp.com/ 关注西邮Linux微信平台,得到一个名为a的文件 分析 分析文件a 需要反汇编,拿IDA上,打开后发现key_function及 ...
- 西邮linux兴趣小组2014纳新免试题(一)
[第一关] 题目 0101001001100001011100100010000100011010000001110000000011001111100100000111001100000000000 ...
- 西邮linux兴趣小组2014纳新免试题(四)
[第四关] 题目 http://findakey.sinaapp.com/ Example: String1:FFFF8 5080D D0807 9CBFC E4A04 24BC6 6C840 49B ...
- 西邮linux兴趣小组2014纳新免试题(三)
[第三关] 题目 http://sortsth.sinaapp.com/ 分析 查看网页源码,得知题目让找出6种排序算法,每次刷新或提交序列都变化. 15种算法清单: CountingSort ...
- 西邮linux兴趣小组2014纳新免试题(二)
[第二关] 题目 http://round2.sinaapp.com/ 分析 打开后,戳进去发现一句名言,然后下一戳的url提示. 在网页源码中得到Page1024提示,于是写一个脚本 #!/bin/ ...
- 西邮Linux兴趣小组第一次技术分享会
2016年10月30日晚,西邮Linux兴趣小组技术分享会在西安邮电大学长安校区东区逸夫教学楼FF305室成功举办.200多名来自全校不同专业的15,16级同学参加了此次分享会. 分享会于20:00正 ...
- 西邮Linux兴趣小组2016免试题
4.28的宣讲会圆满结束(就在写这段话之前不久),对于西邮Linux兴趣小组这一次纳新,身为局外人表示:还是有历史,还是会玩,还是厉害哈. 华丽的分割线里面是自己之前的攻关战略,最后补充了宣讲会上学长 ...
- 2016西邮Linux兴趣小组大事记
2016年还有半个小时就结束了,前面把自己9月做的规划拿出来完善了下,觉得真的是不容易的一年,所有的事情只有自己经历过才会有不一样的感受,世上无难事,只怕有心人. 这是我九月份制定的计划: 下面是20 ...
随机推荐
- MS-SQL
变量 一个@为局部变量,两个@@为全局变量 @@error 最后一句SQL语句的错误编号 错误码 @@identity最后一次插入的标示值符 insert into biao(lie) output ...
- moco操作
1.启动 单个文件启动:将jar包跟启动的文件放在一个文件夹下 命令:java -jar moco-runner-<version>-standalone.jar http -p 12 ...
- C语言实现24点程序
一.简介 本程序的思想和算法来自于C语言教材后的实训项目,程序通过用户输入四个整数计算出能够通过加减乘除得到数字24的所有表达式,程序的设计有别于一般通过穷举实现的方式,效率得到提高.算法介绍如下: ...
- Hibernate中一级缓存和二级缓存
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...
- ios web input 内边阴影
ios网页中,默认input上部有阴影,去除方法: -webkit-appearance: none;
- java.lang.Error: Unresolved compilation problem: 解决方案
严重: Allocate exception for servlet WX_Interfacejava.lang.Error: Unresolved compilation problem: The ...
- 判断Javascript对象是否为空
判断普通javascript对象是否为空(含有可枚举的属性,自有的.继承的都可以),可使用jQuery 3.2.1版的isEmptyObject()方法: isEmptyObject: functio ...
- 【校招面试 之 剑指offer】第11题 旋转数组中的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如: 数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...
- 简述Markdown的使用方法
MarkdownPad Document Markdown的使用技巧 一.标题 一个”#“表示H1.“##”表示H2... 二.列表 第一点 第二点 注意1.2. -与文本之间要有一个空格 这一点 三 ...
- 利用redis完成自动补全搜索功能(三)
前面已经完成了分词和自动提示功能,最后把搜索结合在一起,来个完成的案例.当然最好还是用搜索分词解决,这个只是一个临时解决方案. 其实加上搜索很简单,要做的就是3件事 1. 分词的时候,把有用词的id存 ...