Eu tenho uma pergunta estranha. Eu tenho um arquivo tar, archive.tar.gz
, preenchido com arquivos de texto simples. Esse arquivo é então criptografado com gpg em archive.tgz.gpg
. No total, archive.tgz.gpg
é < 100 KB.
Agora, eu quero fazer archive.tgz.gpg
parecer um binário linux, e fazer com que ele não seja ofuscado usando principalmente utilitários padrão unix. Estou ciente de que (muito provavelmente) não funcionará como um executável binário, e tudo bem. Mas em uma olhada superficial, deve aparecer aproximadamente como um executável binário corrompido.
O máximo que consegui foi tentar modificar o cabeçalho usando cat
e dd
para que file
não retornasse corretamente o tipo de arquivo, mas não cheguei muito longe em encontrar muitas informações sobre como fazer isso online.
Se alguém puder me ajudar a apontar na direção certa, eu agradeceria muito. Obrigado!
Você pode incorporar totalmente a carga útil em um executável de trabalho.
Com
unsuspicious.c
contendo qualquer programa:Com essa técnica, a carga útil terminará na seção .data do binário. Para recuperá-lo, extraia toda a seção de dados:
Alguns outros dados estão precedendo meus 104 bytes de carga útil. Eu costumava
nm unsuspicious
determinar a diferença exata entre__data_start
e_binary_message_txt_gpg_start
, no meu caso 16 bytes. Sabendo disso, posso recuperar a carga útil:Se esta é uma implementação válida para seu objetivo depende se você considera
nm
,objcopy
edd
"utilitários padrão". Claro, você sempre pode adicionar alguma lógica ao próprio programa para que ele apenas imprima a carga útil, se solicitado.qual é o ponto? Basta fazer um executável com o arquivo embutido.
lhe dará algo que é realmente um executável ELF. Ele não será executado (não há nenhum
_start
símbolo que possa ser executado).Se você quiser isso, escreva um programa C/C++/… com uma
main
função, por exemplo, main.cint main(){}
, então construa seu arquivo de objeto contendo dados usandold --relocatable --format=binary archive.tgz.gpg mixin.o
e finalmente construa junto com seu programa,gcc main.c mixin.o -o main
.Você pode obter os dados de volta de maneira bastante trivial e pode obter a seção de dados usando as ferramentas binutils padrão
readelf
ouobjcopy
. Ainda mais fácil, você pode fazer com que o programa extraia o conteúdo para um arquivo somente se condições específicas forem atendidas. (por exemplo, verifique se uma determinada string está emenviron
)Agora, nenhum especialista será enganado por isso - seu arquivo incorporado tem alta entropia empírica e ferramentas de análise binária como
radare2
detectarão isso, não importa o que você faça para ofuscar.O que você pode fazer é inflar artificialmente o tamanho do arquivo criptografado, por exemplo, mapeando cada byte do texto cifrado para um membro diferente de um conjunto de trechos de código de máquina típicos (não necessariamente de comprimento constante, mas sem prefixo) do mundo real programas C. Mas então, você teria que desmapear isso – e isso exigiria seu dicionário e se tornaria bastante chato fazer apenas com ferramentas padrão.