ida打开 F5

Kqitud.png

程序分为两部分输入,第一次输入后,将输入的字符串通过atoi()转换成整型,之后strcat()函数与@DBApp连接代入sub_40100A函数,跟进此函数

KqFpxe.png

推测此函数为hash加密函数,通过对CryCreateHash函数的了解,查询其中一参数ALG_ID 0x8004,得到此函数为sha1算法

KqFmRS.png

可利用python的hashlib对第一段输入进行爆破求解,结果为 123321

1
2
3
4
5
6
7
import hashlib
flag2 = '@DBApp'
for i in range(100000,999999):
h2 = hashlib.sha1(str(i)+flag2)
flags = h2.hexdigest()
if("6E32D0943418C2C33385BC35A1470250DD8923A9".lower() == flags):
print(str(i))

将结果输入程序,通过验证,进入第二次输入

将输入与之前12位字符连接,代入sub_401019,经查询此函数为MD5算法,由于没有足够的信息,对其爆破难度大,放弃此方法。发现下文还有一判断函数sub_40100F,跟进

KqFXLj.png

API函数FindResourceA查找文件中包含名为AAA的文件,通过sub_401005把AAA的文件中取出字符和输入的字符串进行异或得到一个.rtf文件,通过ResourceHacker这个软件查看包含文件AAA

KqkB6g.png

因为需要得到的只有前6/18位字符,所以可通过rtf文件头的格式对前6位字符进行还原

随便创建一个rtf文件,用winhex打开,即可得到文件头前6位“{\\rtf1”,注意 \ 还需要一个 \ 进行转义

KqAMEn.png

1
2
3
4
5
6
s = [0x05,0x7D,0x41,0x15,0x26,0x01] 
a = '{\\rtf1'
flag = ''
for i in range(len(a)):
flag += chr(ord(a[i])^s[i])
print(flag)

得到前6位字符为~!3a@0,输入程序,程序运行结束即可在当前目录下生成dbapp.rtf文件,打开得到flag