Ir para conteúdo

Posts Recomendados

Bom dia galera! Um tempo atrás fiz o curso Reversing From Scratch[1] (proporcionado pela própria Mente Binária) e fui apresentado ao Formato PE. Eu não fazia a mínima ideia do quanto esse bagulho era importante e grande (se bobear ainda não sei).

 

De cara comecei a estudar e descobri que me faltava muita coisa da base, a partir dai reforcei ela e tento sempre reforçar até hoje, afinal, ela não é básica :). Essa semana, estudando sobre endereço virtual cai no formato PE e pensei “vou retomar meus estudos, manter em paralelo com a base” pois PRECISO estudar isso para entender outras coisas.

 

Ambiente:

 

  • Todas as definições feitas serão seguidas de um exemplo prático

  • O ambiente usado é um Windows XP 32 bits

  • Usarei o dumper hex “010 Editor”[2], mas fique à vontade quanto ao uso de qualquer editor. No meu caso estou usando na versão 8.0

  • Todo exemplo de código será feito em C (linguagem compilada) e usarei o gcc como compilador na versão 4.9.2. Vou assumir que você possui um entendimento básico de structs, ponteiros etc (caso não tenha manda bala que a gente ti responde)

 

Algumas considerações:

 

  • O reforço da base é essencial para melhor entendimento de todo material(dicas/correções/sugestões serão sempre bem-vindas).

  • Todas as estruturas apresentadas são da própria Microsoft[3] (vai por mim elas ajudam muito)

  • A documentação oficial do pecoff também está aberta aos curiosos[4]

  • Pra ser sincero minhas 2 inspirações pra esse tipo de estudo foi o trabalho excelente do software livre PEV e do treinamento do nosso querido Fernando Mercês[5] e uma senhora que eu sinto em não conhecer, mas pelo que li dos seus artigos parece ser uma pessoa excelente com uma capacidade enorme, ela é conhecida como Vovó Vick[6]. Deixo como referência o material de ambos, obrigado pessoal ^_^

  • Queria deixar claro que eu sou apenas um estudante, qualquer gafe por favor me corrijam :P

 

Qual a necessidade de aprender isso?

Bom, necessidade mesmo não tem, isso vai muito do seu objetivo e/ou curiosidade. Algumas vantagens que vejo no entendimento de como os executáveis rodam em seu sistema são:

 

  • Reforçar e/ou aprender melhor sobre conceitos fundamentais da computação como: sistema de numeração, memória virtual, alinhamento de memória etc
  • Enfrentar um novo desafio
  • É um conceito importante para a Engenharia Reversa

Acho que o mais legal aqui é quanta coisa você pode tirar de uma. Acho muito difícil qualquer um que não lide com o assunto faz tempo consiga ler toda a documentação do PE como um romance. Exige sair daqui e ler vários outros tópicos para só depois voltar e ter um entendimento mais claro. Se isso tudo soa interessante para você, bora estudar juntos :D

 

Algumas definições adotadas:

 

  • Byte = 8 bits

  • WORD = 2 bytes

  • DWORD = 4 bytes

  • QWORD = 8 bytes

 

Sem mais delongas, estou abrindo aqui um resumão de tudo que estudo/estudarei sobre o Formato PE. Vou tentar fazer da forma mais enxuta possível. Lembrem-se que qualquer feedback é bem-vindo. Vou postar de acordo com meus estudos e aplicabilidade dos mesmos.

 

O que é o Formato PE?

 

Já se perguntou por que diabos quando você clica em algo a mágica acontece? Como aquilo faz algo com “apenas” dois clicks? Bom, isso tudo acontece porque o Windows possui um padrão, um formato para guardar “cada coisa no seu lugar” de modo que o sistema possa achar quando necessário, já pensou em quanta coisa diferente executamos? O coitado do software precisa entender tudo o mais rápido possível se não o hardware leva um chute.

 

O que são essas coisas? Dados!! Ta, o que são dados? Bytes (hehe), alguns conhecem como fileira (ou tripa) de bytes. Temos que reforçar que tudo acaba em zeros e uns, não importa o programa ou a linguagem e este formato que estamos tratando fala especificamente dos executáveis Windows.

 

Vamos vê-los de cima para baixo. O formato do PE segue da seguinte forma:

 

 

Cabeçalho MZ do DOS

Fragmento (stub) do DOS

Cabeçalho do Arquivo

Cabeçalho Opcional


Diretório de Dados

Cabeçalhos das Seções

Seção 1

Seção 2

...

Seção n

Bom, mãos à obra!!

 

Primeiramente vamos criar um programinha simples em C e salvar como teste.c. Para compilar, como estou em um Windows e usando a IDE Dev-C++ o processo de compilação e execução foi simplesmente clicar em Build and Run. O CodeBlocks, por exemplo, funciona da mesma forma.

 

#include <stdio.h>

int main(void){

printf(“Mente Binaria eh foda! =)\n”);

return 0;

}

 

 

Temos como resultado da compilação e linkedição um arquivo .o e um .exe, arquivo objeto e executável, respectivamente.

 

Este simples programa “não faz nada” além de imprimir uma frase na tela, mas que tal vermos os bytes do binário? Arraste o .exe para o Editor Hexa de sua preferência (perdão o termo “arrastarpara os adoradores de linha de comando :ph34r:). Logo de cara vemos todos os bytes dessa coisa linda:

 

MZ-Signature:

 

image.png.b64e2f1a5b3fe8da0bf70d3f7fee2d51.png

 

Estão vendo esta WORD(2 bytes) logo de cara ? 4D 5A? Eles possuem a representação em ASCII “MZ” e este é chamado DOS-Signature que fica dentro da IMAGE_DOS_HEADER. Se pra você esses números na tela não fazem sentido algum recomendo dar uma lida sobre o hexdump.

 

Agora deem uma olhada no offset 0018h:

 

image.png.a07f19a38b20933cbec59b11db102949.png

 

Temos uma DWORD com o valor 0x40000000. Aqui temos que fazer a seguinte consideração: na arquitetura Intel os bytes são endereçados de forma inversa, mais conhecido como Little Endian. Invertendo estes bytes temos o valor 0x00000040, este é o deslocamento para DOS-Stub.

 

e_lfanew

 Na localização 0x3c, o stub possui o deslocamento do arquivo para a assinatura PE. Esta informação permite que o Windows execute corretamente o arquivo de imagem, mesmo que tenha um stub do MS-DOS. Este deslocamento de arquivo é colocado na localização 0x3c durante a ligação.

 

image.png.ed753057b56d8586ced0d10a6e54dd61.png

 

Invertendo os bytes temos o valor 0x00000080, e adivinha o que acontece se andarmos até lá?

 

DOS-Stub:

 

image.png.d826ec8feed41339eadd1eb157f63aed.png

 

Estamos agora na estrutura IMAGE_DOS_STUB. Aqui encontramos nosso um fragmento (stub) executável MS-DOS. O stub MS-DOS é um aplicativo válido que é executado em MS-DOS. É colocado na frente da imagem EXE. O linker coloca um stub padrão aqui, que imprime a mensagem "Este programa não pode ser executado no modo DOS" quando a imagem é executada no MS-DOS.

 

Signature

 

Seguindo o nosso ponteiro e_lfanew chegamos aqui:

image.png.7ed9246fe83d4b7641793d1ac689c87c.png

 

Caímos na estrutura IMAGE_NT_HEADERS e na DWORD Signature:

 

typedef struct _IMAGE_NT_HEADERS {
  DWORD                                    		    Signature;
  IMAGE_FILE_HEADER	     		    FileHeader; 
  IMAGE_OPTIONAL_HEADER  	OptionalHeader; 
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

 

 Nossa assinatura PE é exatamente isso, a representação em ASCII das letras P e E seguidos de dois bytes nulos, ‘\0’ e‘\0’

 

As coisas parecem meio soltas, meio sem sentido, mas vamos melhorando isso aos poucos, certo?!

 

A partir de agora as coisas começam a ficar mais interessantes, vamos encontrar estruturas dentro de estruturas, campos com máscaras de bits, tabelas e ponteiros pra dar e vender e por ai vai. Ainda há MUITA coisa dentro desse binário e pretendo passar para cá sempre que puder. De começo foram apenas algumas definições simples e introdução, mas pra quem não conhecia sobre o assunto se bobear ajudou em algo(espero).

 

As referências aqui apresentadas possuem um material incrível de tudo que veremos, vale conferir. Fico por aqui e qualquer dúvida, sugestão etc etc estarei por aqui, obrigado :)

[1] https://www.mentebinaria.com.br/topic/38-engenharia-reversa-i/
[2] https://www.sweetscape.com/010editor/
[3] https://msdn.microsoft.com/en-us/library/windows/desktop/ms680198(v=vs.85).aspx
[4] https://www.microsoft.com/en-us/download/details.aspx?id=19509
[5] https://github.com/merces/pev
[6] http://www.numaboa.com.br/

Editado por Leandro Fróes
  • Like 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para quem não entendeu o motivo de tudo isso dei uma editada colocando as vantagens que vejo em relação a esse aprendizado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora


  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×