Buuctf CrackRTF
Buuctf CrackRTF
查壳发现无壳,直接反汇编
可以看出,程序要我们输入6个字符.由atoi函数(字符串转换为整型数字)和v7需要大于100000得到输入的必须是六个数字(如果包含其他字符atoi函数会筛选掉,v7就不够六位数,一定小于100000).
之后再将我们输入的数字后面加上@DBApp,v3是计算字符串长度即6+6=12.
再之后通过sub_40100A函数让string1和6E32D0943418C2C33385BC35A1470250DD8923A9相等.
点进sub_40100A函数看看怎么回事
第一次见这种函数,拿去百度.查了资料发现这是哈希算法中的SHA1.
根据算法标识符得出的.
明白原理就可以爆破出前六个数字了.
import hashlib
a = "@DBApp"
b = "6E32D0943418C2C33385BC35A1470250DD8923A9".lower()
for i in range(100000,999999):
c = str(i) + a
d = hashlib.sha1(c.encode('utf-8')).hexdigest()
if d == b:
print(i)
break
Hashlib库是自带的.hashlib.sha1()是创建sha1对象.hexdigest()是加密字符串.
将b用lower函数转为小写是因为hashlib加密后是小写.
这样就得到了第一串密码:123321
看回主函数,接下来又让我们输入六个字符.不过这次没有限制了,爆破是不可能了.
接下来把输入的字符接在得到的密码前面,得到新密码str
用sub_401019函数进行加密.让27019e688a4e62a649fd99cadaafdb4e和加密后的string1相等.
点进函数.
发现是md5加密
这里其实可以直接把27019e688a4e62a649fd99cadaafdb4e拿去用md5解密
这样就直接全解出来了(笑)
不过这里还有个解法.不管md5加密函数.
后面有个sub_40100F函数,点进去看看
sub_401005函数
同样第一次见这种函数,一个个百度.
定位AAA文件,再将文件的句柄赋给lpBuffer,句柄长度赋给nNumberOfBytesToWrite
随后将句柄的值与str异或.这里只有前6位是未知的,只需要异或出前六位就行了.
最后生成dbapp.rtf文件.由于句柄相当于定位的文件的地址,它的前几位的值就是AAA文件的前几位数据.随便创建个rtf文件,再打开看看头部数据.
是{\rtf1
而AAA数据的查看就需要resource hacker
接下来把AAA的前六位与{\rtf1异或就行了.
a = [0x05, 0x7D, 0x41, 0x15, 0x26, 0x01]
b = "{\\rtf1"
flag = ""
for i in range(0, len(b)):
c = ord(b[i]) ^ a[i]
flag += chr(c)
print(flag)
得到密码~!3a@0
运行程序
之后会在程序文件夹那里生成dbapp.rtf文件
打开就是flag了
总结:对我这个新手来说好难.这道题考验的是耐心与知识储备.判断sha1,md5加密,分析函数作用,判断文件头部文件间的异或.之前做的题过于简单,遇见这种需要特别特别认真的题直接吃瘪了.还是需要多多学习.