文件隐写(一)
零宽度字符隐写
零宽度字符是一些不可见、不可打印的字符,在页面中用于调整字符的显示格式。零宽度字符本质上是unicode编码。
零宽度字符隐写:需要加密的内容转换为二进制,然后将二进制转换成一系列的零宽度字符,这样加密的内容就被隐藏了(普通文本编辑器不显示零宽度字符)。
常见零宽度字符
U+200B:零宽度空格
U+200C:零宽度非连接符
U+200D:零宽度非连接符
U+200E:从左到右书写标记
U+200F:从右到左书写标记
[UTCTF2020]zero
用Windows自带的文件编辑器打开
再用vim打开,实际上文件包含了许多零宽度字符
把文本复制到http://330k.github.io/misc_tools/unicode_steganography.html,点击“decode”,即可得到加密的信息。
EXIF信息隐写
EXIF描述图片的属性、结构、拍摄参数等信息
[WUSTCTF2020]find_me
查看.jpg文件属性,备注显示盲文
使用cyberchef将盲文(Braille)翻译成英文
base64隐写
base64隐写的原理
base64编码过程中,为了使字符串的二进制位数是6的倍数,添加了若干位的0,而这些0在解码过程中会被丢弃,不会影响解码的正确性。
把要隐藏的信息覆盖掉这些不影响解码过程的“0”,就实现了base64的隐写。
提取出隐写的内容(与base64解码的过程一样):对于一个base64编码,去掉等号,根据base64转换表把每个字符表示成6位二进制形式;得到的二进制数据每次取8位(一个字节大小),剩下小于8位的就是隐写的内容。
[ACTF新生赛2020]base64隐写
#!/usr/bin/env python3
base64_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" #base64编码表
with open("ComeOn!.txt", 'r') as f:
var_base64_steg = ''
line = f.readline()
while line:
line = line.split('\n')[0] #取每一行,去掉换行符
while line[-1] == '=': #去掉等号
line = line[:-1]
var_base64 = ''
for var in line:
var_bin = bin(base64_list.index(var))[2:] #每个字符对应编码表中的数字,转为二进制,去掉‘0x’前缀
if len(var_bin) != 6:
var_bin = '0' * (6 - len(var_bin)) + var_bin #如果长度不足6位,在前面补‘0’
var_base64 += var_bin #拼接这一行所有字符的二进制数
if len(var_base64) % 8 != 0: #如果这一行的二进制数不能被8整除,那么剩余的二进制数就是隐写的内容
var_base64_steg += var_base64[-(len(var_base64) % 8):]
line = f.readline()
print(var_base64_steg) ##隐写在base64中的二进制
message = ''
for i in range(0, len(var_base64_steg), 8):
if int(var_base64_steg[i:i+8], 2):
message += chr(int(var_base64_steg[i:i+8], 2))
print(message)
GIF隐写
把信息隐藏在一个GIF图片中的某一帧中。
使用Stegsolve->Frame Browser查看每一帧的画面
二维码取反色
二维码黑白颜色对调,需要对其进行反色处理。
windows自带画图工具
docx文档隐写
docx文档本质上是一个zip压缩文件,把后缀名改成.zip解压后在word文件夹中即可查看到隐藏的文件
doc文档隐写
隐藏文字:选中文字右键->字体
白色字体:字体颜色与背景色一致,需要选中文字修改成其他颜色查看隐藏文字