下载文件后发现无壳,用IDA打开
找到主函数,发现一共要求我们输入两次密码
先对第一次输入进行分析,首先要求我们输入的字符串长度为6位,然后通过atoi函数将字符串转换成整型数并保存到v7中,且要求该整型数需要大于100000
经过上述操作后将v7与字符串@DBApp连接,通过函数sub_40100A进行加密,然后再与6E32D0943418C2C33385BC35A1470250DD8923A9进行比较,若相同则继续向下
此时对我们来说最重要的就是搞清函数sub_40100A是如何加密的,进入该函数发现应该是应用了CryptAPI函数库,其中CryptCreateHash最为重要,0x8004u为标识值,经查询这是Hash函数中的SHA1
已知加密函数为SHA1,且输入有限制那么只需要对100000-999999后加@DBApp进行SHA1加密与密文进行比较暴力破解明文,得到明文123321@DBApp
接下来看第二个输入的字符串,限制输入字符串长度为6,并将第一部分得到的明文连接在后面,分析函数sub_401019,发现CryptCreateHash的标识码为0x8003u,为MD5,但是该部分对输入并没有任何限制,直接暴力破解无限制六位数时间过于漫长,于是我们继续向下分析
对sub_40100F进行分析,其中重要函数为FindResourceA,用于确定指定模块中具有指定类型和名称的资源的位置,SizeofResource函数用于计算长度,LoadResource函数用于加载资源,LockResource指向了AAA文件的资源
继续分析函数sub_401005,该函数将输入的密码与AAA中的资源进行了异或操作,返回后得到了dbapp.rtf文件
至此我们只需要将AAA中的资源与dbapp.rtf文件代码中的六位进行异或操作即可,这样就能得到输入的密码
将我们下载的文件用ResourceHacker打开,即可得到AAA文件中的字符
然后上网搜索一下RTF文件的代码,发现前六位都为"{\rtf1"
写一个脚本将他们异或即可得到输入的密码为"~!3a@0"
打开程序输入两次密码,文件夹中会生成一个文件,打开即可得到Flag{N0_M0re_Free_Bugs}