BUUCTF CrackRTF

BUUCTF CrackRTF 考点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匹配脚本得到输入的Destinationimport 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内容是xxxxxx123321DBApp进入sub_401019函数查看跟sha1差不多但是这个是MD5哈希。与SHA-1区别在于SHA-1是0x8004uMD5哈希是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异或结果是~!3a0所以第二次输入的密码是~!3a0F9运行程序分别输入123321和~!3a0回车文件夹会生成dbapp.rtf文件打开即可得到flagflag{N0_M0re_Free_Bugs}