2019年全国大学生网络安全邀请赛暨第五届上海市大学生网络安全大赛
做出了两道Misc==
签到
题干
解题过程
题干提示一直注册成功,如果注册失败也许会出现flag。
下载下来是包含010editor.exe的一堆文件。
打开010editor.exe,想到跟注册有关,于是进入Tools->Register
在弹出的license随便输入用户名和密码
果然,显示注册成功。
想把010editor.exe拖入ollydbg分析,一直不能成功打开,百度查了会儿问题,最后发现好像是因为ollydbg不能分析64位文件
把010editor.exe拖入x64dbg,搜索字符串“Password accepted”
向下滑动滚轮,在附近找到flag的字符串
Unlimited Base64 Works
解题过程
1.分离图片
下载下来是一个.avi视频,用potplayer打开观看,发现是每帧显示一个字符。
用脚本将视频逐帧分离(脚本由李sin提供)
import cv2
import os
#要提取视频的文件名,隐藏后缀
sourceFileName='ubw'
#在这里把后缀接上
video_path = os.path.join("", "", sourceFileName+'.avi')
times=0
#提取视频的频率,每帧提取一个
frameFrequency=1
#输出图片到当前目录vedio文件夹下
outPutDirName='vedio/'+sourceFileName+'/'
if not os.path.exists(outPutDirName):
#如果文件目录不存在则创建目录
os.makedirs(outPutDirName)
camera = cv2.VideoCapture(video_path)
while(True):
times+=1
res, image = camera.read()
if(not res):
print('not res , not image')
break
if(times%frameFrequency==0):
cv2.imwrite(outPutDirName + str(times)+'.jpg', image)
print(outPutDirName + str(times)+'.jpg')
print('图片提取结束')
camera.release()
2.人工识别,初得文本
然后很多人分工,一人负责几百张图片,人工将图片转为字符串。
在我做完我的部分时发现另一边已经得到所有的字符了...S老师使用百度云的人工智能以及自己审阅一遍后给我们提供了所有的字符文本。
在人工识别转化过程中,发现难以区分大写的I和小写的l,于是决定先统一记为I。
然后写一个脚本,识别出文本中所有I的位置(脚本再次由李sin提供)
但是对照这些位置的图片依次比对发现,并不能完全对应,有些位置的图片上的字符并非是I或l,于是我们怀疑S老师给的文本有问题,使用二分法对关键位置的图片比对修改,然后运行脚本再跑出一组位置,这样重复了七八次,终于使所有位置与含I或l的图片对应并得到了正确的文本。
3.火眼金睛,秒分Il
接下来就是将I和l区分了。共有68个I或l,如果全排列去做显然是不行的。我将图片放到最大分析发现,这些位置的字符只有两种样子,一种偏瘦(左侧有竖阴影),一种偏胖(右侧有竖阴影)
很明显,其中一种是I,另一种是l。
于是统计两种图片的位置,记录下来
然后李sin又写了个脚本,分别输出其中一组位置为I或为l,另一组位置反之的两种情况。
a='所有文本'
c=0
b=0
d=[86,156,206,242,248,447,519,548,886,888,895,896,900,920,946,1072,1137,1145,1174,1184,1370,1376,1426,1530,1535,1648,1719,1753,1772,1809,1827,1963]
f=[130,144,183,321,361,399,474,500,501,511,521,609,649,659,774,821,866,913,918,1026,1099,1107,1118,1359,1363,1435,1467,1490,1670,1787,1824,1850,1857,1901,2132,2135]
e=''
for i in a:
b+=1
if(b in f):#f中的I改为l
# if(b in d):#d中的l改为I
i='l'
e+=i
print(e)
将得到的两种文本在线base64解码为图片,发现都失败
如果在chrome浏览器做,会发现得到的图片是透明的,说明确实是PNG文件,但信息损坏。
4.人工再检,正确文本
我们不禁怀疑,一开始S老师给出的文本中有错误。虽然经过几小时的检错后,我们已经将I和l的位置都审查结束,但在其他位置仍有可能存在错误。于是我们小组3人分工,一人负责900张左右的图片,对整个文本进行系统的再次检查(眼要瞎了...)
果然,发现存在五六处大小写错误,于是我们终于得到了最终的正确文本(I和l都设为I)
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
将这个文本带入之前脚本的字符串变量a,再跑两次脚本,得到两组文本
然后在网站上在线分别将两组文本base64转图片(注意加上“data:image/png;base64,”的前缀),其中一个文本转为图片后得到flag
感想
拿了个三血嘿嘿//