首先我想说,这道题对于我这个小白来说简直是难出天际,还是看了好多大佬的 wp 才能勉强做出来,中间仍然有一些没理解的地方

首先照例拿到 exeinfope 中查看,是 32 位程序,拿到 IDA PRO 中查找主函数,主函数如下:

真的好长,我看了好久吧久才看懂它的大概思路

# 第一部分

看这一部分,我们可以知道,它这个密码是 6 位数,而且大于 100000

关键来了,这个六位数我们要把它和 @DBApp 拼接,然后放到 sub_40100A 这个函数中进行计算,计算得出的结果要等于 6E32D0943418C2C33385BC35A1470250DD8923A9

# 引申知识点
  • atoi 函数的作用是将字符串转化为整型
  • strcmpi 函数是将两个字符串进行对比,并且忽略大小写的影响,例如 Yes 和 YES 的输出结果仍为 1,但在这里的 strcmpi 函数前有一个!,输出结果应该是 0,按理来说不会运行下面的代码,这里有点没搞明白

我们点开 sub_40100A 函数:

看见了很多新的东西,我就是从这里开始崩溃的…

但是不能慌,我们可以上网查,但是上网查了之后也没怎么懂,看了大佬的 wp 之后才理解,这是一个哈希加密,然后一般的范围是小于 999999(这里我没太明白,我也没理解这个范围是怎么求的)

# 脚本 1

所以我们可以在这个范围里面进行爆破解密,脚本如下:

1
2
3
4
5
6
7
8
9
10
import hashlib
str1 = '@DBApp'
for i in range(100000, 999999):
psw = str(i)+str1
x = hashlib.sha1(psw.encode("utf8"))
y = x.hexdigest()
if "6e32d0943418c2c33385bc35a1470250dd8923a9" == y:
print(psw)
break

# 补充
  • 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
2
3
4
5
6
7
8
9
a = [0x05, 0x7D, 0x41, 0x15, 0x26, 0x01]
b = ''
c = '{\\rtf1'
for i in range(0, len(a)):
b += chr(ord(c[i]) ^ a[i])

print(b)


得到第二个密码为~!3a@0

最后运行程序,输入两次密码,会生成一个.rtf 文件在根目录

点开即得到 Flag {N0_M0re_Free_Bugs}

题目来源:BUUCTF 在线评测 (buuoj.cn)–CrackRTF