BUU-CrackRTF

这道题太离谱了,很多没有见过的API,看不懂。

捕获

先查壳,发现是无壳的32位,丢进IDA,找到主函数

tempsnip

先输入了一段6个字符的字符串,再连上“@DBApp”,再进行加密,看一下加密函数

3

CryptCreateHash哈希加密,有了解过哈希的是可以知道,哈希是很多算法放在一起,然后随机抽一个算法来加密,这个0x8004u是什么看不懂,去查了一下winAPI文档才知道这个代表SHA1加密。

加密后与6E32D0943418C2C33385BC35A1470250DD8923A9对比,正确的话再进行。从前面的v4<100000发现有范围限制,到1000000就可以了

1
2
3
4
5
6
7
8
9
10
import hashlib
s = '6E32D0943418C2C33385BC35A1470250DD8923A9'.lower()
for i in range(100000,1000000):
a = str(i)+'@DBApp'
m = hashlib.sha1()
m.update(a.encode('utf-8'))
sha1 = m.hexdigest()
if sha1 == s:
print(i)
break

4

解出是123321

接下来输入第二串密码

也是先连接上第一个的密码在进行加密,但加密方式有点不太一样

5

换成了32位的MD5加密,后面却什么信息也都没有给,没有范围怎么爆破,这怎么搞。看了WP后发现是在下面一个函数里面加密

6

这里用了FindResourceA( )函数,详细可以看https://blog.csdn.net/singleyellow/article/details/80308789

要用到Resource Hacker打开会有一个AAA的,从里面取出数据来

7

下面还有一个函数

8

将之前的输入的与AAA里面的异或,因为要生成一个.rtf的文件,那肯定缺少不了文件头。 直接搜索.rtf的文件头~

最后把文件头的前六位与AAA里面的六位做逆向异或,得到输入的密码

1
2
3
4
5
6
7
8
9
s = "{\rtf1"

a = [0x05,0x7D,0x41,0x15,0x26,0x01]

flag = ""
for i in range(0,len(s)):
x = ord(s[i]) ^ a[i]
flag += chr(x)
print(flag)

得到第二次密码:~!3a@0

9

得到flag