第六届山东省网安竞…
1.小明的密码
97年出生的小明用自己的生日作为自己网站的密码, 现在, 得到一串被篡改过一个字符的字符串, 你能解出小明的生日吗?
0175501585710a89h5a60dc9ed2f88d7
其实很简单的题,比赛时候就看出来思路,可惜python没写好,hashlib用的不行。没做出来。
思路:
测试97年所有的日期的hash即可,然后与之对比。
重点在hashlib库的使用如事前encode等问题。
还有if s[:10] in md5:这种比较方式应用。
#python 3.6.3
import hashlib
s = '0175501585710a89h5a60dc9ed2f88d7'
for i in range(1,32):
for j in range(1,13):
date = '1997{1}{0}'.format(i, j)
m = hashlib.md5()
m.update(date.encode("utf8"))
md5 = m.hexdigest()
print ("loading")
if s[:10] in md5:
print (md5)
print (date)
2.仿射加密
已知仿射加密变换为c=(11m+7) mod26, 试对密文dikxourxd解密。
和上一题一样,个人问题在于python编写能力不足。
或者说当时被卡题心态有些崩了,只想着用手算了。
算法思想不难,也就是暴力解出。把每个字母作为m试一次然后把c和密文对比即可,取其相对应字母,连起即明文。
#python2.7
a = 'dikxourxd'
a1=[]
for i in a:
a2 = ord(i)-97
a1.append(a2)
print a1
for i in a1:
for j in range(0,26):
c = (11*j+7)%26
if(c==i):
print chr(j+97)
3.人生苦短
这道题就开始真正的摸不着思路了。
看过WP才清楚原来提示中的pyhton和Linux是整合文件用这个的意思。
思路:
1.导出http包
2.发现几个flag文件
3.用cat或者Python整合文件
4.解包(此处考察了伪加密,但在kali下可直接解压)
要点:
Wireshark导出http包部分的使用,或者说wireshark的使用。(确实得好好看一下wireshark的相关详细姿势了,每次都是做到新题才知道一种新用法。)
cat命令或python来整合文件。
4.Web漏洞
黑客利用漏洞从Web系统中窃取了什么机密信息?
当时查flag字段,看出是注入,没看出是猜解。
思路:
打开查看是Apache日志, 查找flag关键词, 发现是通过延时盲注读取了flag表的内容。 写代码解决问题。
urldecode之后, 可发现对每个
字符猜解的最后一个数据包当中用!=做判断。 利用正则过滤出正确猜解的字符的ascii。 第一条为查询数据的条数, 后面为flag表的内容。
代码如下:
import urllib
import re
flag = ''
flag_list = []
with open('access.log', 'r') as file:
#print file.read()
line_lists = file.readlines()
#print len(line_lists)
flag_lines = []
for i in line_lists:
if 'flag' in i:
flag_lines.append(i)
#print len(flag_lines)
for i in flag_lines:
s = i.split(" ")[6]
s=urllib.unquote(s)
if '!=' in s :
print s
p = re.compile(r'!=[1-9]\d*')
flag = flag + chr(int(p.findall(s)[0].replace('!=','')))
print flag
没什么别的可说的,当时做不出来是对SQL注入理解不行。
这道题的题点应该就是Sqli机制和正则匹配了。
5.Gakki
这道题出的太脑洞了。没遇见过这类题就很难做出来。
题点是文件头数据块IHDR:
包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,且一个PNG数据流中只能有一个文件头数据块。
文件头数据由13字节组成,结构如下:
本题中 IHDR位原本是0000061E 0000031E
看详细信息里应当是1566×798,相应的16进制就应该是
0000061E 0000051E
修改后,图片显示flag。
真的想不到。
以后就能想到了。
6.神奇的图片
这个题当时竟然都没看一下。今天做了一下。
给了两个图片一个xor.png,一个flag.png,看到xor文件名知道是异或运算。
def xor(str1, str2):
return ''.join(chr(ord(x) ^ ord(y)) for x, y in zip(str1,str2))
for i in range(20):
#png_1 = open(sys.argv[1], "rb").read(i)
png_1 = open("xor.png", "rb").read(i)
png_2 = open("flag.png", "rb").read(i)
key = xor(png_1, png_2)
print key