Resposta Quiz Forense: Assinatura de arquivos

No último post da categoria Quiz foi proposto o seguinte questionamento:

Qual tipo de arquivo possui a seguinte assinatura: ÿØÿà?

1 – PDF
2 – PNG
3 – JPEG
4 – GIF

Antes de responder ao Quiz, cabe aqui algumas explicações. O que é uma assinatura no contexto apresentado? Ou seja, o que é uma assinatura de arquivo? Ela nada mais é que os primeiros bytes do arquivo referentes à identificação única do tipo do arquivo.

Perceba que este ‘tipo’ pode, muitas vezes, ter relação com a extensão do arquivo (o que é indiferente ou irrelevante no universo *nix – console mode), entretanto, podem existir situações em que diferentes assinaturas correspondem à mesma extensão de arquivo. Na literatura, esta assinatura é chamada de magic number. Lembra do comando file do Linux? O funcionamento dele é extremamente simples, veja:

$ file dump.pcap
dump.pcap: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 96)

A saída contém o tipo do arquivo consultado. O que acontece nos bastidores é simples: compara-se uma base de assinaturas (localizadas no arquivo magic) com os primeiros bytes (ou n bytes após um offset) do arquivo passado como parâmetro.

Definições expostas, vamos à resposta.

Veja que a string ‘ÿØÿà’ contém caracteres estranhos. Isso ocorre, por exemplo, ao se abrir arquivos executáveis (binários) em um editor de texto comum. Independente da codificação ativada em um editor de textos, a visualização do conteúdo de arquivos desse tipo torna-se ilegível.

Leitores acostumados com manipulação de imagens ou mesmo aqueles que já abriram arquivos deste tipo no Notepad, rapidamente saberiam a resposta do Quiz: JPEG.

Agora imagine como o comando ‘file’ poderia manter essa assinatura em sua base de dados. Deve-se pensar em um formato padrão para manipulação de dados, neste caso utiliza-se com muita frequencia o sistema hexadecimal. Veja este exemplo:

$ file bells.jpg
bells.jpg: JPEG image data, JFIF standard 1.01
$ grep 'JFIF standard' /usr/share/file/magic| grep -v ^#
>6      string          JFIF            \b, JFIF standard
$ grep 'JPEG image data' /usr/share/file/magic| grep -v ^#
0       beshort         0xffd8          JPEG image data

Perceba que o arquivo ‘bells.jpg’ é um arquivo de imagem. Neste caso, identificado como uma imagem JPEG, JFIF (padrão). No manual do comando ‘file’, consta que a 1ª coluna utilizada no arquivo-base de assinaturas (magic) identifica o deslocamento (offset) utilizado na comparação.

Já a 2ª coluna diz respeito ao tipo de dado (beshort = big-endian short). Assim, percebe-se que o valor – em hexadecimal – indicado na 3ª coluna, 0xffd8, é buscado – exatamente – nos primeiros 2 bytes do arquivo examinado pelo comando ‘file’. Na verdade, esta imagem faz 2 ‘matches’ na base de assinaturas, pois a string JFIF (esta visível até em um editor comum) também é encontrada após o offset 6 (>6), a partir do começo do arquivo.

Notou que ‘ÿØ’ = FFD8 (em hexa)? Mais fácil que utilizar o comando ‘file’ é pesquisar na rede. Existem vários sites que mantêm base de dados de tipos de arquivos. O link abaixo é um bom começo! :)

Busca por “file signatures” no Google

Até o próximo Quiz!

One thought on “Resposta Quiz Forense: Assinatura de arquivos

Comments are closed.