5 个版本
0.2.1 | 2023年8月4日 |
---|---|
0.2.0 | 2022年1月18日 |
0.1.2 | 2020年10月5日 |
0.1.1 | 2020年8月15日 |
796 在 编码 中排名
每月 63 次下载
47KB
845 行
steg86
steg86 是一个针对 x86 和 AMD64 二进制的无格式 隐写术 工具。您可以使用它将信息隐藏在编译程序中,无论可执行文件格式如何(PE、ELF、Mach-O、raw 等)。它对修改的文件没有性能或大小的影響(添加消息不会增加二进制文件大小或降低执行速度)。
有关 steg86 的工作原理的更多详细信息,请参阅 操作理论 部分。
安装
steg86
可以通过 cargo
安装
$ cargo install steg86
或者,您可以使用此仓库中的 cargo build
构建
$ cargo build
使用方法
请参阅 steg86 --help
获取完整的标志和子命令列表。
性能分析
为了对二进制文件进行隐写适应性分析
$ steg86 profile /bin/bash
Summary for /bin/bash:
175828 total instructions
27957 potential semantic pairs
19 potential commutative instructions
27944 bits of information capacity (3493 bytes, approx. 3KB)
嵌入
将消息嵌入到二进制文件中
$ steg86 embed /bin/bash ./bash.steg <<< "here is my secret message"
默认情况下,steg86 embed
将其输出写入 $input.steg
。例如,/lib64/ld-linux-x86-64.so.2
将变为 /lib64/ld-linux-x86-64.so.2.steg
。
如果消息无法嵌入(例如,如果它太大),steg86 embed
将以非零状态退出。
提取
从二进制文件中提取消息
$ steg86 extract bash.steg > my_message
$ cat message
here is my secret message
如果无法提取消息(例如,找不到),steg86 extract
将以非零状态退出。
操作理论
steg86 利用 x86 的一种编码特性:ModR/M 字节的 R/M 字段
7 6 5 4 3 2 1 0
-------------------------
| MOD | REG | R/M |
-------------------------
ModR/M 字节通常用于支持同一指令的寄存器到内存和内存到寄存器变体。例如,MOV
指令有以下变体(许多其他变体之一)
操作码 | 助记符 |
---|---|
89 /r |
MOVr/m32,r32 |
8B/r |
MOVr32,r/m32 |
由于 ModR/M 字段可以编码内存寻址操作或裸寄存器,因此支持寄存器到内存和内存到寄存器操作的指令也支持多种寄存器到寄存器操作的编码。
例如,mov eax, ebx
可以编码为 以下两种方式之一:89 d8
或 8b c3
,且没有任何语义上的改变。这为我们每条重复指令的语义提供了1位信息。给定足够多的具有多种编码的寄存器到寄存器指令,我们可以用这些位来隐藏整个消息。
此外,由于这些语义相同的编码通常大小相同,我们可以修改 现有的 二进制文件,而无需修复重定位或RIP相关寻址。
steg86 通过原始的 二进制翻译 实现这些目标。它使用 iced-x86 进行编码和解码,使用 goblin 进行二进制格式处理。
先前的工作
steg86 的灵感来自 @inventednight,他们将此描述为对类似想法(也是他们的)的RISC-V二进制文件的一种改编。
上述技术已在2004年的Hydan: Hiding Information in Program Binaries(隐藏程序二进制中的信息)一文中进行了详细讨论。
steg86 对Hydan技术的独立发现,完全独立编写;论文中讨论的改进可能比steg86中实现的更优,也可能不是。
未来的改进
-
steg86 目前将嵌入的消息限制为16KB。这是一个纯粹的人工限制,可以通过一些小的格式更改来解决。
-
x86(和AMD64)都具有多字节NOP,用于对齐。可以通过几种方式在这些NOP中隐藏额外的信息
- 用于对齐的多字节NOP
OF 1F /0
可以长达9字节,其中最多5字节是空闲的(SIB + 4字节位移)。 - 还有更长(11、15字节)的NOP可能也适用。
- 用于对齐的多字节NOP
-
超出寄存器到寄存器的双倍,像Hydan那样重写
add/sub
。
依赖项
~20MB
~400K SLoC