首先我想说,这道题对于我这个小白来说简直是难出天际,还是看了好多大佬的 wp 才能勉强做出来,中间仍然有一些没理解的地方
首先照例拿到 exeinfope 中查看,是 32 位程序,拿到 IDA PRO 中查找主函数,主函数如下:

真的好长,我看了好久吧久才看懂它的大概思路
# 第一部分

看这一部分,我们可以知道,它这个密码是 6 位数,而且大于 100000
关键来了,这个六位数我们要把它和 @DBApp 拼接,然后放到 sub_40100A 这个函数中进行计算,计算得出的结果要等于 6E32D0943418C2C33385BC35A1470250DD8923A9
# 引申知识点
- atoi 函数的作用是将字符串转化为整型
- strcmpi 函数是将两个字符串进行对比,并且忽略大小写的影响,例如 Yes 和 YES 的输出结果仍为 1,但在这里的 strcmpi 函数前有一个!,输出结果应该是 0,按理来说不会运行下面的代码,这里有点没搞明白
我们点开 sub_40100A 函数:

看见了很多新的东西,我就是从这里开始崩溃的…
但是不能慌,我们可以上网查,但是上网查了之后也没怎么懂,看了大佬的 wp 之后才理解,这是一个哈希加密,然后一般的范围是小于 999999(这里我没太明白,我也没理解这个范围是怎么求的)
# 脚本 1
所以我们可以在这个范围里面进行爆破解密,脚本如下:
1 | import hashlib |
# 补充
- encode 是编码,后面的括号内是其编码的格式,这里就是将得到的 psw 编码为 utf8 格式
- x.hexdigest () 是将 y 转换成 16 进制格式进而与 6e32d0943418c2c33385bc35a1470250dd8923a9 进行计算,如果去掉 hex 就是十进制
爆破后得到 123321@DBApp,密码就是前六位也就是 123321(说实话做到这我人已经懵了,光是我自己我基本做不出来,虽然脚本是自己写的,但思路都是参照大佬的 wp 来的)
# 第二部分
第一个密码终于解出来了,现在要解第二个密码

其实这个 sub_401019 函数和第一个差不多,但是我们没有范围,所以不能爆破,只能跳过了
但是不要灰心,“亲爱的” 出题人在后面又给了我们两个函数噢!
我们点开 sub_40100F 这个函数进去,会发现又有一大堆新的东西!!完全看不懂是什么

在百度查了一下 FindResourceA 这个函数,我看不太懂,我就直接移植大佬的解释吧

呃,其实还是不太理解哈哈哈哈
现在我们看到 sub_401005 这个函数

上面 FindResourceA 函数传递的值会传到这里,进行抑或运算,在这里我们需要用到一个叫做 Resourse Hacker 的软件来查看

框出来的数字就是我们要进行抑或运算的六位数字的一部分
# 脚本 2
因为最后会生成一个.rtf 文件,而.rtf 文件的标识符前六位是 {\rtf1,所以我们就把 0x05,0x7D,0x41,0x15,0x26,0x01 和 {\rtf1 进行抑或运算,写一个脚本进行计算
1 | a = [0x05, 0x7D, 0x41, 0x15, 0x26, 0x01] |
得到第二个密码为~!3a@0
最后运行程序,输入两次密码,会生成一个.rtf 文件在根目录
点开即得到 Flag {N0_M0re_Free_Bugs}
题目来源:BUUCTF 在线评测 (buuoj.cn)–CrackRTF