Ir para conteúdo

Leandro Fróes

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/

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...
  • 3 meses depois...

@Leandro Fróes que tal o Sr. transferir esse(s) artigo(s) para o wikilivros? O Mercês começou a produzir um livro sobre ER lá e a plataforma é ideal para colaboração. Acho que se você colocar lá vai motivar mais o Mercês e outros camaradas a trabalhar colaborativamente (o que pode ser benéfico a outros e prazeroso para o nosso meio de aprendizagem em ER). 

Link para o comentário
Compartilhar em outros sites

Curiosidade @Leandro Fróes, eu to começando ER e não entendo muito os termos usados nessa área, mas existe mesmo "tripa de bytes"? Eu pesquisei no Google e achei pouquíssimos resultados com essa expressão. Aproximadamente 11 resultados (excluindo repetições). Será que esse termo não veio de "tuple of bytes"? Em python por exemplo tupla é uma sequencia de objetos imutáveis.

$$('._Rm').forEach(function(i){console.log(i.firstChild)});
VM2067:1 "www.numaboa.com.br › Informática › Oráculo de Referências › Formatos Padrão"
VM2067:1 "www.numaboa.net.br/informatica/oraculo/230-formatos/1096-formato-pe"
VM2067:1 "https://acrecom.files.wordpress.com/2013/06/engenharia-reversa.doc"
VM2067:1 "https://www.passeidireto.com/arquivo/1914647/engenharia-reversa/2"
VM2067:1 "https://www.mentebinaria.com.br/forums/topic/97-formato-pe/?do=embed"
VM2067:1 "www.forum-invaders.com.br › Fórum › ¤ Segurança da Informação ¤ › Segurança"
VM2067:1 "caloni.com.br/como-ofuscar-strings/"
VM2067:1 "www.ebah.com.br/content/ABAAAf2CEAJ/50-apostilas-hacker-engenharia-reversa"
VM2067:1 "forum.guiadohacker.com.br › ... › Área Hacker › Matérias/Tutoriais/Dicas"
VM2067:1 "www.desenvolvedoresdaruma.com.br/sddn/ddn/ddn005_61.html"
VM2067:1 "https://docgo.net/embed/o-formato-pe"

Só esses sites acima ai.

 
 
 
 
 
 
 
 
Link para o comentário
Compartilhar em outros sites

Sobre o uso de editores, quem estiver usando cygwin (ou mesmo direto na plataforma Linux, WSL, etc.) já tem uma ferramenta que dá pra quebrar o galho. É o od (ferramenta do coreutils).

$ dd if=hello.exe of=saida skip=128 ibs=1 2>/dev/null;echo -e '\t0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F';od -A x -t x1z -v saida|head
        0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
000000 50 45 00 00 64 86 10 00 09 76 6e 5a 00 26 02 00  >PE..d....vnZ.&..<
000010 8d 02 00 00 f0 00 27 00 0b 02 02 1d 00 08 00 00  >......'.........<
000020 00 1e 00 00 00 02 00 00 00 10 00 00 00 10 00 00  >................<
000030 00 00 40 00 01 00 00 00 00 10 00 00 00 02 00 00  >..@.............<
000040 04 00 00 00 00 00 00 00 05 00 02 00 00 00 00 00  >................<
000050 00 e0 02 00 00 06 00 00 8b 8d 02 00 03 00 00 80  >................<
000060 00 00 20 00 00 00 00 00 00 10 00 00 00 00 00 00  >.. .............<
000070 00 00 10 00 00 00 00 00 00 10 00 00 00 00 00 00  >................<
000080 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00  >................<
000090 00 80 00 00 84 02 00 00 00 90 00 00 e8 04 00 00  >................<


 

Link para o comentário
Compartilhar em outros sites

4 horas atrás, gzn disse:

@Leandro Fróes que tal o Sr. transferir esse(s) artigo(s) para o wikilivros? O Mercês começou a produzir um livro sobre ER lá e a plataforma é ideal para colaboração. Acho que se você colocar lá vai motivar mais o Mercês e outros camaradas a trabalhar colaborativamente (o que pode ser benéfico a outros e prazeroso para o nosso meio de aprendizagem em ER). 

Bacana a ideia, vou falar com ele sim, obrigado!! ^_^

 

3 horas atrás, gzn disse:

Curiosidade @Leandro Fróes, eu to começando ER e não entendo muito os termos usados nessa área, mas existe mesmo "tripa de bytes"? Eu pesquisei no Google e achei pouquíssimos resultados com essa expressão. Aproximadamente 11 resultados (excluindo repetições). Será que esse termo não veio de "tuple of bytes"? Em python por exemplo tupla é uma sequencia de objetos imutáveis.


$$('._Rm').forEach(function(i){console.log(i.firstChild)});
VM2067:1 "www.numaboa.com.br › Informática › Oráculo de Referências › Formatos Padrão"
VM2067:1 "www.numaboa.net.br/informatica/oraculo/230-formatos/1096-formato-pe"
VM2067:1 "https://acrecom.files.wordpress.com/2013/06/engenharia-reversa.doc"
VM2067:1 "https://www.passeidireto.com/arquivo/1914647/engenharia-reversa/2"
VM2067:1 "https://www.mentebinaria.com.br/forums/topic/97-formato-pe/?do=embed"
VM2067:1 "www.forum-invaders.com.br › Fórum › ¤ Segurança da Informação ¤ › Segurança"
VM2067:1 "caloni.com.br/como-ofuscar-strings/"
VM2067:1 "www.ebah.com.br/content/ABAAAf2CEAJ/50-apostilas-hacker-engenharia-reversa"
VM2067:1 "forum.guiadohacker.com.br › ... › Área Hacker › Matérias/Tutoriais/Dicas"
VM2067:1 "www.desenvolvedoresdaruma.com.br/sddn/ddn/ddn005_61.html"
VM2067:1 "https://docgo.net/embed/o-formato-pe"

Só esses sites acima ai.

Então... até onde eu sei isso não é de fato um "termo de RE" e sim um simples termo para dizer "cadeia de bytes" ou "sequência de bytes". Não se prenda nos termos, se você pegou a ideia já está ótimo.
 
Abraços
 
 
 

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
  • 2 meses depois...
Em 26/04/2018 em 08:39, dudsdev disse:

Massa Leandro..

Esse conhecimento de base, que você citou no início do post dizendo sempre está estudando, quais são os conteúdos que sempre temos que reforçar?

 

Abraço!

Opa, tudo bem mano?

Então.. falar de forma específica ´é meio complicado, mas eu resumiria (de forma geral) em: Sistemas Operacionais (mais de um mesmo), programação, redes e arquitetura de computadores. Tem um artigo bem legal falando sobre como iniciar na área aqui no portal e ele fala também várias referências, este aqui.

É bem difícil conciliar tudo isso, pois é MUITA coisa e você nunca para, mas se você organizar certinho e fazer uma linha você vai aprender MUITO ?

Qualquer dúvida só falar, abs!

Link para o comentário
Compartilhar em outros sites

Isso que iria pergunta agora, eu acompanhei o projeto de uma gringa fera  no eng rv, e ela fazia esse HEX de trás para frente, me ajudou muito, ela falava sobre PE format também , great content,  ainda vou descobrir como ela encontrava no Hex Editor enable de funcionalidade x do game  .exe 

Link para o comentário
Compartilhar em outros sites

9 minutos atrás, Naelson Goncalves Saraiva disse:

Isso que iria pergunta agora, eu acompanhei o projeto de uma gringa fera  no eng rv, e ela fazia esse HEX de trás para frente, me ajudou muito, ela falava sobre PE format também , great content,  ainda vou descobrir como ela encontrava no Hex Editor enable de funcionalidade x do game  .exe 

Boa tarde!

Não sei se entendi, ela achava no editor como habilitar certa funcionalidade de um jogo?

Link para o comentário
Compartilhar em outros sites

To estudando assembly para entender o que são estas coisas que ela faz.

Para entender como ela pega esses endereços testa ou o que os endereços faz. Por que como vai da breakpoint em um executável de  rpg acho que não é possível ne? Usa os ganços acho que seria de menos problema é entender como funciona os endereços, BYTE etc...

	if (Config::Instance()->fixes->territoryWarPetFix) {
		WriteInstructionCall(0x8D1470, reinterpret_cast<UINT32>(GetUserOrMaster), 0x8D1476);
		WriteMemoryBYTES(0x8D1476, "\x4C\x39\xE8", 3);
		WriteMemoryBYTES(0x8D147B,
			"\x44\x8B\x45\x18\x8B\x40\x18\x44"
			"\x89\x44\x24\x30\x89\x44\x24\x20"
			"\x48\x8B\x85\x90\x0A\x00\x00\x8B"
			"\x90\x84\x0B\x00\x00\x89\x54\x24"
			"\x28", 33);
	}
          WriteInstructionCall(0x443F58 + 0x11D, reinterpret_cast<UINT32>(SendSaveCharacterInfoWrapper));
Link para o comentário
Compartilhar em outros sites

Interessante, ta ai uma coisa que eu quero tentar um dia, engenharia reversa em jogos, mas no momento eu realmente não sei sobre ?

 

Seguindo mais ou menos o que você mostrou: ela não ta mexendo nos endereços e sim diretamente nas instruções. Eu realmente não sei como ela acha tal funcionalidade em tal parte do código(você disse que não rola bp, né?!), mas se achar ela pode mudar tanto em um debugger quanto em um editor hexa (tomando cuidado com o número de bytes que ela tem pra cada instrução etc). Tenha em mente que todas as seções estão em disco, ou seja, estão no arquivo e quando o programa é executado o Loader as mapeia em memória. Todas as intruções do código executável (da seção .text, por exemplo) estão no arquivo e podem sim ser vistas por um editor hexa, basta saber procurar hehe.

 

Se você não entendeu bulhufas do que falei manda uma msg lá no discord qqc que a gente troca uma ideia, mas também aconselho a ver o curso de engenharia reversa do CERO. Sobre descobrir o que os opcodes fazem, da uma olhadinha aqui qqc http://ref.x86asm.net/

 

Abraço!!

Link para o comentário
Compartilhar em outros sites

3 horas atrás, Leandro Fróes disse:

Interessante, ta ai uma coisa que eu quero tentar um dia, engenharia reversa em jogos, mas no momento eu realmente não sei sobre ?

 

Seguindo mais ou menos o que você mostrou: ela não ta mexendo nos endereços e sim diretamente nas instruções. Eu realmente não sei como ela acha tal funcionalidade em tal parte do código(você disse que não rola bp, né?!), mas se achar ela pode mudar tanto em um debugger quanto em um editor hexa (tomando cuidado com o número de bytes que ela tem pra cada instrução etc). Tenha em mente que todas as seções estão em disco, ou seja, estão no arquivo e quando o programa é executado o Loader as mapeia em memória. Todas as intruções do código executável (da seção .text, por exemplo) estão no arquivo e podem sim ser vistas por um editor hexa, basta saber procurar hehe.

 

Se você não entendeu bulhufas do que falei manda uma msg lá no discord qqc que a gente troca uma ideia, mas também aconselho a ver o curso de engenharia reversa do CERO. Sobre descobrir o que os opcodes fazem, da uma olhadinha aqui qqc http://ref.x86asm.net/

 

Abraço!!

Blz, deixa eu entender esse assembly e logo entro no radio, tenho conhecimento de c/c++ mas nem da de ter uma conversa a nível com vocês, Ta osso pra crl. Frederico Pissarra ainda brinca na apostila dele que isto não é difícil aprender. 

Link para o comentário
Compartilhar em outros sites

45 minutos atrás, Naelson Goncalves Saraiva disse:

Blz, deixa eu entender esse assembly e logo entro no radio, tenho conhecimento de c/c++ mas nem da de ter uma conversa a nível com vocês, Ta osso pra crl. Frederico Pissarra ainda brinca na apostila dele que isto não é difícil aprender. 

Que isso rapaz, com ctz você é capaz de conversar com todos, assim como qualquer um é. Não se menospreza não, o mais importante é sua vontade de aprender. Manda um salve lá sem medo ?

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Bom dia, li seu post e me gerou uma dúvida. Se eu executar esse código em plataforma nativa DOS, o Loader executará o fragmento (stub) para informar que a aplicação não pode rodar em DOS e encerra a aplicação, no entanto não compreendi como o Loader consegue fazer essa distinção. Ao abrir um executável via um editor hexadecimal como identifico essa distinção dentro do código? Outra dúvida, no caso do...

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...