0x00 背景
何为隐写术?
隐写术是一类可以隐藏自己写的一些东西的方法,是一门关于信息隐藏的技巧与科学。指的是采取一些不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容的方法。
可参考 一文让你完全弄懂Stegosaurus - 知乎
本文要介绍python中的隐写术。工具为Stegosaurus,
仅支持 Python3.6
及其以下版本。
具体要操作pyc文件。pyc
文件就是 Python
的字节码文件,是个二进制文件。
Stegosaurus
提供了一种向 Python
字节码文件嵌入或提取 Payload
的方法。但是为了保证嵌入之后的代码文件大小不会发生变化,因此 Stegosaurus
所支持嵌入的 Payload
字节长度十分有限。
0x01 实践
需要先找出 低于Python3.6版本
代码中的无效空间。
Python
的引用解释器 CPython
有两种类型的操作码:即无参数的和有参数的。在版本号低于 3.5
的 Python
版本中,根据操作码是否带参,字节码中的操作指令将需要占用 1
个字节或 3
个字节。在 Python3.6
中就不一样了, Python3.6
中所有的指令都占用 2
个字节,并会将无参数指令的第二个字节设置为 0
,这个字节在其运行过程中将会被解释器忽略。这也就意味着,对于字节码中每一个不带参数的操作指令, Stegosaurus
都可以安全地嵌入长度为 1
个字节的 Payload
代码。
用工具来实现:
查询test.pyc 中的无效空间:
python3 -m stegosaurus test.pyc -r
向test.pyc 插入payload:
python3 -m stegosaurus test.pyc -s --payload "id"
从test.pyc中反解出插入的payload:
python3 stegosaurus.py -x test.pyc
0x02 reference
GitHub - AngelKitty/stegosaurus: A steganography tool for embedding payloads within Python bytecode.