2019年上海市大学生网络安全大赛两道misc WriteUp

2019年全国大学生网络安全邀请赛暨第五届上海市大学生网络安全大赛

做出了两道Misc==

签到 题干

2019年上海市大学生网络安全大赛两道misc WriteUp

解题过程

题干提示一直注册成功,如果注册失败也许会出现flag。
下载下来是包含010editor.exe的一堆文件。

2019年上海市大学生网络安全大赛两道misc WriteUp


打开010editor.exe,想到跟注册有关,于是进入Tools->Register

2019年上海市大学生网络安全大赛两道misc WriteUp


在弹出的license随便输入用户名和密码

2019年上海市大学生网络安全大赛两道misc WriteUp


果然,显示注册成功。

2019年上海市大学生网络安全大赛两道misc WriteUp


想把010editor.exe拖入ollydbg分析,一直不能成功打开,百度查了会儿问题,最后发现好像是因为ollydbg不能分析64位文件

2019年上海市大学生网络安全大赛两道misc WriteUp


把010editor.exe拖入x64dbg,搜索字符串“Password accepted”

2019年上海市大学生网络安全大赛两道misc WriteUp


向下滑动滚轮,在附近找到flag的字符串

2019年上海市大学生网络安全大赛两道misc WriteUp

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,如果全排列去做显然是不行的。我将图片放到最大分析发现,这些位置的字符只有两种样子,一种偏瘦(左侧有竖阴影),一种偏胖(右侧有竖阴影)

2019年上海市大学生网络安全大赛两道misc WriteUp


很明显,其中一种是I,另一种是l。
于是统计两种图片的位置,记录下来

2019年上海市大学生网络安全大赛两道misc WriteUp


然后李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)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzdxxg.html