ida打开,看main函数:
可以看到逻辑是输入两次密码,第一次密码验证后,再输入一次
第一次输入6位字符,存到pbData,然后pbData拼接上@DBApp再sub_40100A加密
加密结果和6E32D0943418C2C33385BC35A1470250DD8923A9比对
比对成功后,第二次同样输入6位,存到String,String拼接上pbData再sub_401019加密
加密结果和27019e688a4e62a649fd99cadaafdb4e比对,
比对成功后,再进一个if判断:String传入sub_40100F,才算结束
先看第一个加密函数sub_40100A:
啊,好多hash,第二个参数是0x8004u(一般第二个参数是加密的方式)
6E32D0943418C2C33385BC35A1470250DD8923A9又是40位,我就去常用的somd5试了一下,还真得到了结果:123321
好,第一部分输入时123321,再看第二个加密函数sub_401019:
也是hash,第二个参数是0x8003u,但这次加密的String有18位,网站没爆出来,我觉得我们自己也不用想了。
然后,然后我就去找大佬们的wp了
然后我就看到这个函数出不来密码也不要紧,去看那个if!
hao,我们看if里的那个sub_40100F:
大概逻辑就是,从AAA里提数据,和lpString(main传入的String)一起,传入函数sub_401005:
熟悉的异或操作
所以我们现在需要去知道AAA的前6位,和dbapp.rtf的前6位
dbapp.rtf的前6位好办,虽然没有给dbapp.rtf,但前6位肯定是在文件头部分,任意找一个.rtf文件即可获得,我就直接搜索.rtf文件头:{\rtf,都是前5位的,最后是在一位大佬wp里找到了6位(大佬自己建了一个rtf文件来看头)
http://leehung.cn/2019/11/02/crackrtf/
rtf前6位:{\rtf1
AAA的前6位,则需要用一个ResourceHacker的工具查看
写脚本写脚本:
rtft = '{\\rtf1'
aaa = [0x05,0x7D,0x41,0x15,0x26,0x01]
pass2 = ''
for i in range(6):
pass2 = pass2 + chr(ord(rtft[i])^aaa[i])
print(pass2)
得到第二部分密码:~!3a@0
flag{N0_M0re_Free_Bugs}