Jump to content

Leandro Fróes

Mente Binária
  • Posts

    183
  • Joined

  • Last visited

  • Country

    Brazil

Everything posted by Leandro Fróes

  1. 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 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 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 “arrastar” para os adoradores de linha de comando ). Logo de cara vemos todos os bytes dessa coisa linda: MZ-Signature: 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: 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. Invertendo os bytes temos o valor 0x00000080, e adivinha o que acontece se andarmos até lá? DOS-Stub: 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: 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/
×
×
  • Create New...