分类目录归档:享受过程

用 FontForge 改造文泉驿等宽字体

之前,在 Burp Suite 中一直使用 Consolas 字体。自从某次所需的 JRE 版本升级后,字体 fallback 出现问题,汉字都变成了豆腐块,Char Sets 设置也不能解决。于是便不得不寻找新的字体方案。

在网上搜索到了一款 DIY 字体叫做 “Microsoft Yahei Mono”,是 “雅黑的中文部分” 和 “Consolas 的英文部分” 拼起来的缝合怪,虽然可以解决上述问题,但是非高分屏下看起来还是不太舒服。但发现,在 cmd 里替换 simsun 倒是挺合适的,无论高分、低分屏。

然后想到了著名的开源字体——文泉驿微米黑。

该字体包含了所有常用简体中文、繁体中文所需要的汉字 (最新版本包含超过 20932 个汉字,完整覆盖 GB2312/Big5 以及 GBK 标准字符集) 。该字体同时还包含了日文、韩文和其他几十种语言符号。以外,该字体还包含了高质量的 Droid Sans 拉丁符号和 Droid Sans Mono 等宽字体。

——文泉驿微米黑

在 Burp Suite 里使用文泉驿等宽微米黑,觉得舒服了很多,字体比较方正。但是很快发现了一个痛点——数字 0 和大写字母 O 实在是太像了。

于是想着能不能改造一下,把 0 的肚子里用斜杠撑起来以示区分呢?很快找到了利器 FontForge 。

FontForge 里,可以看出 0 和 O 确实太像了,小号字体下更是难区分

双击 “0” 进入单个字体编辑,先新建一个矩形,再用拖动工具拖动矩形的四个顶点,原字体中的四个定位锚点正合适落脚,如图。

保存以后,生成新的 ttf 文件,就可以投入使用了。

还有一个发现是,大概是由于 JDK 字体绘制系统不同的原因,不同 JDK(如 openJDK 和 oracleJDK)打开同一个 jar 应用程序,所能用的已安装字体也不同,比如 oracleJDK 就无法显示文泉驿等一些开源字体。

2024.8.22 更新:在笔记本 1080p 屏幕更换为 2.5K 高分屏后,找到了更好的字体方案:中文部分使用文泉驿和英文符号部分使用 JuliaMono 的糅合版,兼顾了英文字符优美、英文等宽、中文宽度=2 英文宽度等特点。此外发现 Maple 字体霞鹜字体也是很不错的,前者已经在各种命令行界面中使用。

SQLmap 参数 eval 的使用

上个月底,7 月 24 日,恰逢台风烟花来袭,在家无事就和公司网安组大佬一起在 Cybrics2021 线上 CTF 赛打了个酱油。 Web 类有一道叫 announcement 的题目,题干很简单,只有输入邮箱这一个步骤。 burpsuite 抓包看了下,POST 了 “email” 和 “digest” 两个参数到后台。

借个图

那么这会不会是一道注入题呢。把 email 参数换为单引号,看了下 digest 长度有点像 md5,于是本地计算单引号的 md5 后填入 digest,果然返回了数据库报错信息——嗯,报错型注入没跑了。

其实后来网上的 writeup,有的用 python 脚本来做,有的边计算 md5 边手工注入。但是遇到注入题,大名鼎鼎的入狱拖库工具 SQLmap 怎能缺席。这道题最大的问题是 digest 参数必不可少,并且必须是和 email 参数的 md5 hash 相匹配。

想到处理 SQLi payload 自然首先想到 tamper 库。翻了翻 SQLmap 的自带 tamper 库,空格变换、双写 SQL 关键词之类,之前也尝试过改写一些 tamper,但和本题相距有点远。于是在 Google 一阵搜索后,非常意外地发现--eval 这个参数很好用——简而言之就是直接用 python 代码来处理注入 payload 。一番调试后,用*指定 payload 位置为 email 参数,--eval 来处理 digest,最终使用以下命令跑了几百条后拖出了含有 flag 的表。

sqlmap -u "http://announcement-cybrics2021.ctf.su/" --data "email=*" --eval="import hashlib;digest=hashlib.md5(email.encode('utf-8')).hexdigest()"

一开始对--eval 运算后生成的字符串在 POST 请求参数的位置有些不解,后来经实践发现--eval 产生的 digest 参数会自动附在 --data"email="的后面。

好的 CTF 赛题,理应让人对熟悉的工具有新的认知和进一步的思考。