Buuctf CrackRTF

Buuctf CrackRTF 

查壳发现无壳,直接反汇编

 

 

 

 

可以看出,程序要我们输入6个字符.atoi函数(字符串转换为整型数字)v7需要大于100000得到输入的必须是六个数字(如果包含其他字符atoi函数会筛选掉,v7就不够六位数,一定小于100000).

之后再将我们输入的数字后面加上@DBApp,v3是计算字符串长度即6+6=12.

再之后通过sub_40100A函数让string16E32D0943418C2C33385BC35A1470250DD8923A9相等.

点进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()是加密字符串.

blower函数转为小写是因为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加密,分析函数作用,判断文件头部文件间的异或.之前做的题过于简单,遇见这种需要特别特别认真的题直接吃瘪了.还是需要多多学习.

posted @ 2022-12-26 16:09  M4r1s4  阅读(56)  评论(0编辑  收藏  举报