复现流程:
- 打开word,出现这个,复制一下,粘贴出来是
! "#$%flag is not here~~
,所以说明这个字体肯定被修改过了。
- 改后缀名为zip,解压压缩包,打开
/word/fontTable.xml
可以得到font-name为flag Mono
,fontKey为{1F513ACE-F8AD-4F84-9264-C7B38E1D8CB7}
- 根据我们得到的fontKey,我们将我们的
word/fonts/font2.odttf
重命名为1F513ACE-F8AD-4F84-9264-C7B38E1D8CB7.odttf
打开odttf转换ttf网站:https://somanchiu.github.io/odttf2ttf/js/demo,上传改过名的文件后就会自动下载ttf字体文件了。
这一步也可以使用python脚本:
import os
odttf_name = "./1F513ACE-F8AD-4F84-9264-C7B38E1D8CB7.odttf"
odttf_path = os.path.abspath(odttf_name)
with open(odttf_path, "rb") as f:
data = f.read()
# 获取文件名
file_name = os.path.splitext(odttf_path)[0].split("\\")[-1].replace("-", "")
# 获取key
key = []
for i in range(len(file_name), 0, -2):
key.append(int(file_name[i-2:i], 16))
with open("./font2.ttf", "wb") as f:
for i in range(32):
f.write(bytes([data[i] ^ key[i % len(key)]]))
f.write(data[32:])
- 使用在线网站FontDrop,拖到上传框中,得到flag。
NSSCTF{How_ug1Y_f0Nt}
题目补充:
关于odttf转ttf脚本原理:
首先将1F513ACE-F8AD-4F84-9264-C7B38E1D8CB7.odttf
,得到文件名1F513ACE-F8AD-4F84-9264-C7B38E1D8CB7
再将文件名去掉-
,得到1F513ACEF8AD4F849264C7B38E1D8CB7
再将1字节为一组进行反序,得到key是:B78C1D8EB3C76492844FADF8CE3A511F
最后再对odttf文件的前32字节进行异或,密钥就是16字节的B78C1D8EB3C76492844FADF8CE3A511F