什么是零宽度字符
零宽度字符是一些不可见的,不可打印的字符。它们存在于页面中主要用于调整字符的显示格式,下面就是一些常见的零宽度字符及它们的unicode码和原本用途:
- 零宽度空格符 (zero-width space)
U+200B
: 用于较长单词的换行分隔 - 零宽度非断空格符 (zero width no-break space)
U+FEFF
: 用于阻止特定位置的换行分隔 - 零宽度连字符 (zero-width joiner)
U+200D
: 用于阿拉伯文与印度语系等文字中,使不会发生连字的字符间产生连字效果 - 零宽度断字符 (zero-width non-joiner)
U+200C
: 用于阿拉伯文,德文,印度语系等文字中,阻止会发生连字的字符间的连字效果 - 左至右符 (left-to-right mark)
U+200E
: 用于在混合文字方向的多种语言文本中(例:混合左至右书写的英语与右至左书写的希伯来语),规定排版文字书写方向为左至右 - 右至左符 (right-to-left mark)
U+200F
: 用于在混合文字方向的多种语言文本中,规定排版文字书写方向为右至左
为什么可以用于隐写
零宽度字符在通常情况下,在一般的文本编辑器中是不可见的,比如:Hello,misc!
在这句话中我就用零宽度字符隐藏了信息,用CyberChef查看一下即可发现其中的奥秘
当然,将文本储存为txt格式,用vim查看也可以直接看到其中隐藏的零宽度字符
如何达到隐写的目的
关于这一点,我查找了很多的资料,其实每一种基于零宽度字符的隐写都可以有自己的隐写方式及加密方式,所以可能用这一个工具(或脚本)加密过的字符串在另一个解密网站就无法成功解密……
在此我先贴上几篇文章,供大家参考:
- 转化为二进制的加密:https://zhuanlan.zhihu.com/p/87919817
- 转化为Morse编码的加密:https://zhuanlan.zhihu.com/p/75992161
加密方式虽多种多样,但万变不离其宗。使用零宽度字符隐写,关键是将想要隐藏的内容用零宽度字符来表示,通过使用不同的零宽度字符,以及不同字符间的排列组合方式来达到隐写的目的
注:加密和解密是一个可逆的过程,但是一定要用相同的方式(相同的工具/网址)进行加解密
相关工具
在线解密[1]:http://330k.github.io/misc_tools/unicode_steganography.html
在线解密[2]:https://offdev.net/demos/zwsp-steg-js
GitHub上相关的项目(这两个项目在上面的文章中都有提到):
零宽度字符的其他用法
- 隐形水印
- 逃脱敏感词匹配
- 传递隐秘信息
相关文章:
例题:[UTCTF2020] zero
附件链接:https://pan.baidu.com/s/1Ivadp2r9cbKjIZM2vSFDQw
提取码:7vmf
下载附件得到一个txt文件,里面是一长段英文,乍一看没有什么特别的地方,但是将这个文件用vim查看,就会发现其中隐藏了大量的信息
很显然是零宽度字符隐写,在线网站弄一下,在上图中可以看到共有五种零宽度字符,尝试一下将U+200B
这一项去掉,选择其他四种字符进行解密,就可以得到flag(但是我还不是很清楚为什么要将U+200B
去掉)
得到flag:flag{whyNOT@sc11_4927aajbqk14}
info 评论功能已经关闭了呐!