我有一个奇怪的问题。我有一个 tar 文件,archive.tar.gz
其中充满了纯文本文件。然后该存档被 gpg 加密为archive.tgz.gpg
.总共archive.tgz.gpg
< 100KB。
现在,我想让它看起来archive.tgz.gpg
像一个 Linux 二进制文件,并使用大多数 UNIX 标准实用程序对其进行非混淆。我知道(很可能)不会工作作为二进制可执行文件,没关系。但粗略一看,它应该大致显示为损坏的二进制可执行文件。
我得到的最远的是尝试使用修改标头cat
,dd
这样file
就不能正确返回文件类型,但我还没有找到有关在线执行此操作的更多信息。
如果有人能够帮助我指明正确的方向,我将不胜感激。谢谢!
答案1
您可以完全将有效负载嵌入到工作可执行文件中。
echo "I am your encrypted message." > message.txt
gpg2 --symmetric message.txt
ld -r -b binary -o message.o message.txt.gpg
gcc -o unsuspicious unsuspicious.c message.o
包含unsuspicious.c
任何程序:
#include <stdio.h>
int main(int argc, char** argv) {
printf("Hi. I am a totally unsuspicious executable.\n");
}
通过这种技术,有效负载将最终出现在二进制文件的 .data 部分中。要检索它,请提取整个数据部分:
objcopy --dump-section .data=data.bin unsuspicious
一些其他数据位于我的 104 字节有效负载之前。我曾经确定和nm unsuspicious
之间的确切差异,在我的例子中为 16 个字节。知道了这一点,我可以检索有效负载:__data_start
_binary_message_txt_gpg_start
dd if=data.bin skip=16 bs=1 count=104 of=message.txt.gpg
这是否是您目标的有效实现取决于您是否考虑nm
和objcopy
“dd
标准实用程序”。当然,您始终可以向程序本身添加一些逻辑,这样如果要求得好,它只会打印有效负载。
答案2
重点是什么?只需制作一个嵌入文件的可执行文件即可。
ld --format=binary archive.tgz.gpg executable_file
会给你一些实际上是 ELF 可执行文件的东西。它不会运行(没有_start
可以执行的符号)。
如果您想要这样,请编写一个带有main
函数的 C/C++/... 程序,例如 main.c int main(){}
,然后使用 构建包含数据的目标文件ld --relocatable --format=binary archive.tgz.gpg mixin.o
,最后与您的程序一起构建gcc main.c mixin.o -o main
。
您可以相当简单地获取数据,并且可以使用相当标准的 binutils 工具readelf
或objcopy
.更简单的是,您可以让程序仅在满足特定条件时将内容提取到文件中。 (例如检查某个字符串是否在 中environ
)
现在,没有专家会被这一点愚弄——您的嵌入式存档具有高经验熵,以及诸如此类的二进制分析工具radare2
都会检测到这一点,无论您如何进行混淆。
您可以做的是人为地增加加密存档的大小,例如将密文的每个字节映射到现实世界中一组典型机器代码摘录(不一定是恒定长度,但无前缀)的不同成员C 程序。但是,您必须取消映射 - 这将需要您的字典,并且仅使用标准工具会变得相当烦人。