[BUUCTF]CrackRTF
本文最后更新于 387 天前,其中的信息可能已经过时,如有错误可以直接在文章下留言

最近做题做到这题,发现不是很难,逻辑很简单,但是对我来说看别人得 Writeup 学到了非常多。

得到可执行文件.exe,直接用 IDA 打开,得到如下图,代码已经进行了部分重命名.

其中关键得三个函数已经标出来了,首先是要求我们输入一个长度为 6 的字符,然后有一个 atoi 的函数,对第一次的输入进行操作。这个函数是 C 语言中的一个标准库函数,作用是将一个表示数字的字符串转换为对应的整型数值,也就是说我们一开始应该是输入一个长度为 6 的数字字符串。

再看下面的 if 判断语句,如果经过 atoi 函数处理之后变成数字小于 100000,则会结束进程,所以输入的数字必须大于 100000。

之后 strcat 函数是一个 C 语言中的字符串拼接函数,用于将一个字符串追加到另一个字符串的末尾。所以是输入的 6 个数字后面拼接 @DBApp,之后进行 sub_40100A 函数的处理,我们进入这个函数看一看。如图

然后是一堆看不懂的代码,调用了一堆估计是 Windows API 函数,看了别人的 Writeup,最关键的函数已经框出来了,我们查阅微软的文档,看一下这个函数的具体用法。

重点关注第二个传入的参数 Algid,这里说用于标识要使用的哈希算法,问了 AI,Algid 的全称是 Algorithm identifiers,即算法标识符,开发人员和系统管理员就可以用它来指定在不同的上下文中使用哪些密码学算法,该函数传入了 0x8004u, 我们点 ALG_ID, 进去看微软的文档,找到了

是 SHA 的哈希算法,也是 SHA1。所以我们猜测这个 sub_40100A 函数就是对第一次输入后再拼接的数据进行了 SHA 哈希加密。加密后与一段长字符串进行比较。这里自然而然就想到了爆破,但是我很少写爆破脚本,不知道该怎么爆破,看看别人的脚本。

import hashlib
string='@DBApp'
for i in range(100000,999999):
#输入大于100000的六位数字
flag=str(i)+string
x = hashlib.sha1(flag.encode("utf8"))
#使用utf-8编码将字符串转换为字节
y = x.hexdigest()
#获取十六进制的散列值
if "6e32d0943418c2c33385bc35a1470250dd8923a9" == y:
print(flag)
break
#输出结果为123321@DBApp

那么第一步我们就搞定了,进入第二部分密码的分析。

第二部分密码的长度也为 6,但没有数字方面的要求。然后会将 123321@DBApp 拼接在第二次输入的后面,然后被 sub_401019 函数处理,点进去看看。

和上面那个 SHA1 加密函数相似,但是这里的算法标识符变成了 0x8003u,再查阅微软的文档

是 MD5 哈希算法,而且比较的字符串的长度也为 32,符合 MD5 哈希算法的特征。第一想法当然是直接拿去进行解密,但是解密不了。我们再看下面那一个 sub_40100F 的函数,点进去如图

又是一堆看不懂的 Windows API 函数,去微软给的文档再去学习一下,这些代码的含义就是从 AAA 文件中查找字符,如果函数成功,则返回值是指定资源的信息块的句柄。如果函数失败,则返回值为 NULL。若要获取资源的句柄,请将此句柄传递给 LoadResource 函数。,而 SizeofResource 应该是计算大小的。

LockResource 接收要访问的资源的句柄,如果加载的资源可用,则返回值是指向资源第一个字节的指针;否则为 NULL。然后函数 sub_401005 接收了主函数里面的拼接完后的总密码,AAA 文件第一个字节的指针,和该指针的大小。然后生成 dbapp.rtf,我们再点进去看看这个 sub_401005 函数。

也就是说文件 AAA 的每一位和总密码的每一位进行循环异或,我们要得到的是总密码的前 6 位,也就是说总密码的前 6 位和文件 AAA 的前 6 位进行异或之后会得到生成的 RTF 文件的前六位,看这道题的题目,再联想到 Misc 方向,经常有关于文件头的题目,我们就去找一下 RTF 的文件头是什么,先了解一下什么是 RTF 文件。

RTF,全称为 Rich Text Format,即富文本格式,是一种由微软公司开发的跨平台文档格式。它支持在不同的设备和操作系统之间传输和查看,同时能够保留文本的格式和嵌入的图形内容。

在网上找半天找不到一个 RTF 文件,只能自己用 Word 文档转成一个 RTF,打开看到文件头

所以文件头前六个就是 {\rtf1。但是还有个疑问,AAA 文件在哪里呢?这里也是学到了一个新工具 Resource Hacker,直接把该可执行程序拖进去,如图

然后编写脚本,解出最后的 6 位答案

rtf = '{\\rtf1'
#注意这里的反斜杠要进行转义
A = [0x05, 0x7D, 0x41, 0x15, 0x26, 0x01]
password = ''
for i in range(len(rtf)):
x = ord(rtf[i]) ^ A[i]
password += chr(x)
print(password)
#输出~!3a@0

然后再打开可执行程序,输入两个密码,会在它所在的文件夹生成一个 dbapp.rtf 文件,就是在代码中的 CreateFileA () 函数的实现,如图

我操,真的有点神奇,所以 flag 就是 Flag {N0_M0re_Free_Bugs}

BUUCTF 要把 Flag 改为 flag。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇