使 GPG 加密文件看起来像二进制可执行文件

使 GPG 加密文件看起来像二进制可执行文件

我有一个奇怪的问题。我有一个 tar 文件,archive.tar.gz其中充满了纯文本文件。然后该存档被 gpg 加密为archive.tgz.gpg.总共archive.tgz.gpg< 100KB。

现在,我想让它看起来archive.tgz.gpg像一个 Linux 二进制文件,并使用大多数 UNIX 标准实用程序对其进行非混淆。我知道(很可能)不会工作作为二进制可执行文件,没关系。但粗略一看,它应该大致显示为损坏的二进制可执行文件。

我得到的最远的是尝试使用修改标头catdd这样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

这是否是您目标的有效实现取决于您是否考虑nmobjcopydd标准实用程序”。当然,您始终可以向程序本身添加一些逻辑,这样如果要求得好,它只会打印有效负载。

答案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 工具readelfobjcopy.更简单的是,您可以让程序仅在满足特定条件时将内容提取到文件中。 (例如检查某个字符串是否在 中environ

现在,没有专家会被这一点愚弄——您的嵌入式存档具有高经验熵,以及诸如此类的二进制分析工具radare2都会检测到这一点,无论您如何进行混淆。

您可以做的是人为地增加加密存档的大小,例如将密文的每个字节映射到现实世界中一组典型机器代码摘录(不一定是恒定长度,但无前缀)的不同成员C 程序。但是,您必须取消映射 - 这将需要您的字典,并且仅使用标准工具会变得相当烦人。

相关内容