考点:SHA-1哈希算法,md5哈希算法,rtf文件有特征:开头6个字符是{\rtf1
第一次输入Destination:限定为100000-999999之间的字符串,Destination与"@DBApp"拼接,得到的拼接字符串进行SHA-1哈希算法,最后不论大小写与"6E32D0943418C2C33385BC35A1470250DD8923A9"匹配
第二次输入Str:与变化后的Destination拼接,但是没有给定范围,这次的输入是所有可打印字符而非纯数字,拼接后md5哈希算法,最后不论大小写与"27019e688a4e62a649fd99cadaafdb4e"匹配
最后进行了一个sub_40100F函数是查找类型为"AAA"的资源并获取资源的操作,内包含的sub_401005函数就是以Str为密钥异或解密加密过了的资源,创造rtf文件
我们要通过得出1 2次输入内容,让exe文件运行并输入,得到rtf文件,打开即得flag
进入sub_40100A函数发现是sha1算法,并将结果转化为大写十六进制字符,与"6E32D0943418C2C33385BC35A1470250DD8923A9"匹配
脚本得到输入的Destination
import hashlib def get_sha1(data): # 定义get_sha1函数,计算输入字符串的SHA-1并返回小写十六进制 return hashlib.sha1(data.encode('utf-8')).hexdigest() s = "6E32D0943418C2C33385BC35A1470250DD8923A9".lower() s1 = '@DBApp' for i in range(100001, 1000000): k = str(i) + s1 sha1 = get_sha1(k) if s == sha1: print(f"找到匹配: {k}") break else: print("未在范围内找到匹配项")第一次输入的密码为123321
第二次输入也是6位,但是没给范围,拼接后Str内容是xxxxxx123321@DBApp
进入sub_401019函数查看,跟sha1差不多,但是这个是MD5哈希。
与SHA-1区别在于SHA-1是0x8004u,MD5哈希是0x8003u。
由于没有给定范围,直接爆破难度太大,先往下看
进入sub_40100F,查找类型为“AAA”的资源并获取
dbapp.rtf发现创造了一个rtf文件
进入sub_401005,异或操作
所以sub_40100F是查找并获取类型为“AAA”的资源,用密钥lpString(即Str)异或解密资源内容,创造出rtf文件。
异或:将lpString(即Str)每一位与“AAA”资源进行异或,异或结果为rtf文件。由于我们需要求的只要Str前六6位,所以一共异或6位。
那么Str可通过资源前六位与rtf前六位异或得到
rtf文件有特征:开头6个字符是{\rtf1
安装Resource HackerResource Hacker,查看AAA有关文件的前六位是05 7D 41 15 26 01
异或结果是~!3a@0,所以第二次输入的密码是~!3a@0
F9运行程序,分别输入123321和~!3a@0
回车文件夹会生成dbapp.rtf文件,打开即可得到flag
flag{N0_M0re_Free_Bugs}