CONSTRUINDO UM
 ANALISADOR DE
  EXECUTÁVEIS
    Fernando Mercês
 Vale Security Conference 2011
  São José dos Campos - SP
$ whoami

- Consultor de projetos com software livre na 4Linux
- Bacharelando em Ciência da Computação
- Foco em infraestrutura e segurança da aplicações
- Membro ativo de diversas comunidades de software livre
- A+, LPIC-2, MCP, MCITP
- Palestrante em eventos como FISL, LinuxCon e H2HC
- Idealizador do Universidade Livre, evento que leva o SL às
universidades brasileiras
- Autor do Mente Binária (http://www.mentebinaria.com.br)
- Criador do pev (analisador de arquivos PE)
- Criador do USBForce (antivírus para pen-drive)
- Mantenedor do T50 (ferramenta para stress em redes)
Agenda

- O que faz um analisador
- O executável
- Estudo do formato
- pev
- Perguntas
O que faz um
 analisador?
Interpreta o formato do executável para
exibir informações do tipo:

- Entrypoint (início do programa)
- Arquitetura alvo / tipo do executável
- Requisitos para execução
- Seções
- Proteções
- E qualquer outra informação útil para
quem analisa
Como todo arquivo, não passa de uma
sequência de bits. A diferença está em
como interpretamos:

       Binário    01010101
       Decimal    85
       Hexa       55
       ASM x86    PUSH EBP
       ASCII      U
O executável
- Além do código, contém informações
para ser devidamente executado no SO
alvo.

- Pode ser editado como qualquer outro

- Possui um formato / especificação

- Documentação do formato disponível na
internet. Mais usados são ELF e PE.
Estudo do
 formato
- Busca da disposição dos campos no
executável.

- Digamos que a documentação
especifique:

 -> Um arquivo PE válido começa com
um campo de dois bytes chamado magic
number, onde o primeiro byte é o 0x4D e o
segundo é o 0x5A, sempre.
Então basta validar:
int verify(char *filename)
{
     FILE *fp = fopen(filename, "rb");
     char bytes[2];
     fread(bytes, 2, 1, fp);
     fclose(fp);
     if (bytes[0]=='M' && bytes[1]=='Z')
          return 1;
     return 0;
}
-> 16 bytes a frente da assinatura PE, está
o checksum, que tem 2 bytes de tamanho.
unsigned short checksum;

fseek(fp, 16, SEEK_CUR);
fread(&checksum, 2, 1, fp);
printf("%xn", checksum);
- Para facilitar, é bem possível que o SO
tenha estruturas já prontas para leitura do
formato.
/* COFF header (trecho da windows.h) */
typedef struct _IMAGE_FILE_HEADER {
     WORD Machine;
     WORD NumberOfSections;
     DWORD TimeDateStamp;
     DWORD PointerToSymbolTable;
     DWORD NumberOfSymbols;
     WORD SizeOfOptionalHeader;
     WORD Characteristics;
} IMAGE_FILE_HEADER;
- Depois de ler as estruturas, o analisador
deve dar opção de mostrar os valores dos
campos para o usuário.

- É possível detectar proteções como
packers, crypters etc.

- Existe muita informação dentro de um
binário executável. Tudo o que o
analisador precisa fazer é interpretar os
bytes brutos (raw).
pev
the pe file analyzer
- Software livre (GPLv3)

- Multiplataforma (ANSI C)

- Suporte a PE32/PE32+

- Imprime todos os cabeçalhos do PE

- Detecta TLS callback, ASLR e DEP/NX

- Exibe resources no primeiro nível
$ pev -c psftp.exe 
COFF header:
 Machine:                   0x14c - Intel 386 and compatible (32-bits)
 Number of sections:        4
 Date/time stamp:           1177846971 (Sun, 29 Apr 2007 11:42:51 UTC)
 Symbol Table offset:       0
 Number of symbols:         0
 Size of optional header:   0xe0
 Characteristics:           0x10f (0000000100001111)
                            base relocations stripped
                            executable image
                            line numbers removed (deprecated)
                            local symbols removed (deprecated)
                            32-bit machine
$ pev -rp psftp.exe 
Resources (.rsrc section):
 Type:                       RT_ICON
 Offset:                     0x28
 Type:                       RT_GROUP_ICON
 Offset:                     0x68
 Type:                       RT_VERSION
 Offset:                     0x80
  Product Version:           0.60.0.0


$ pev -o psftp.exe  | head
Optional (PE) header:
 Magic number:               0x10b (PE32)
 Linker major version:       7
 Linker minor version:       10
 Size of .code section:      0x35000
 Size of .data section:      0x1a000
 Size of .bss section:       0
 Entry point:                0x2d812
 Address of .code section:   0x1000
 Address of .data section:   0x36000
TODO...

- Detecção de packers
- Disassembly de seções
- Formatação de saída (CSV, XML...)
- Extração de resources
- Exibir imports e exports
- Detecção do compilador
- Detecção do idioma do binário
- CRC32
- Detecção de strings inclusive XOReadas
Conteúdo: Fernando Mercês (CC 3.0)
baseado no paper "Construindo um
analisador de executáveis".

Template: Frank Skibby Jensen

http://pev.sf.net
@MenteBinaria
www.mentebinaria.com.br

Perguntas?

Vale Security Conference - 2011 - 11 - Fernando Mercês [Octane Labs] [Coding 40º]

  • 1.
    CONSTRUINDO UM ANALISADORDE EXECUTÁVEIS Fernando Mercês Vale Security Conference 2011 São José dos Campos - SP
  • 2.
    $ whoami - Consultorde projetos com software livre na 4Linux - Bacharelando em Ciência da Computação - Foco em infraestrutura e segurança da aplicações - Membro ativo de diversas comunidades de software livre - A+, LPIC-2, MCP, MCITP - Palestrante em eventos como FISL, LinuxCon e H2HC - Idealizador do Universidade Livre, evento que leva o SL às universidades brasileiras - Autor do Mente Binária (http://www.mentebinaria.com.br) - Criador do pev (analisador de arquivos PE) - Criador do USBForce (antivírus para pen-drive) - Mantenedor do T50 (ferramenta para stress em redes)
  • 3.
    Agenda - O quefaz um analisador - O executável - Estudo do formato - pev - Perguntas
  • 4.
    O que fazum analisador?
  • 5.
    Interpreta o formatodo executável para exibir informações do tipo: - Entrypoint (início do programa) - Arquitetura alvo / tipo do executável - Requisitos para execução - Seções - Proteções - E qualquer outra informação útil para quem analisa
  • 6.
    Como todo arquivo,não passa de uma sequência de bits. A diferença está em como interpretamos: Binário 01010101 Decimal 85 Hexa 55 ASM x86 PUSH EBP ASCII U
  • 7.
  • 8.
    - Além docódigo, contém informações para ser devidamente executado no SO alvo. - Pode ser editado como qualquer outro - Possui um formato / especificação - Documentação do formato disponível na internet. Mais usados são ELF e PE.
  • 9.
  • 10.
    - Busca dadisposição dos campos no executável. - Digamos que a documentação especifique: -> Um arquivo PE válido começa com um campo de dois bytes chamado magic number, onde o primeiro byte é o 0x4D e o segundo é o 0x5A, sempre.
  • 11.
    Então basta validar: intverify(char *filename) { FILE *fp = fopen(filename, "rb"); char bytes[2]; fread(bytes, 2, 1, fp);      fclose(fp); if (bytes[0]=='M' && bytes[1]=='Z') return 1; return 0; }
  • 12.
    -> 16 bytesa frente da assinatura PE, está o checksum, que tem 2 bytes de tamanho. unsigned short checksum; fseek(fp, 16, SEEK_CUR); fread(&checksum, 2, 1, fp); printf("%xn", checksum);
  • 13.
    - Para facilitar,é bem possível que o SO tenha estruturas já prontas para leitura do formato. /* COFF header (trecho da windows.h) */ typedef struct _IMAGE_FILE_HEADER { WORD Machine; WORD NumberOfSections; DWORD TimeDateStamp; DWORD PointerToSymbolTable; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; } IMAGE_FILE_HEADER;
  • 14.
    - Depois deler as estruturas, o analisador deve dar opção de mostrar os valores dos campos para o usuário. - É possível detectar proteções como packers, crypters etc. - Existe muita informação dentro de um binário executável. Tudo o que o analisador precisa fazer é interpretar os bytes brutos (raw).
  • 15.
  • 16.
    - Software livre(GPLv3) - Multiplataforma (ANSI C) - Suporte a PE32/PE32+ - Imprime todos os cabeçalhos do PE - Detecta TLS callback, ASLR e DEP/NX - Exibe resources no primeiro nível
  • 17.
    $ pev -cpsftp.exe  COFF header:  Machine: 0x14c - Intel 386 and compatible (32-bits)  Number of sections: 4  Date/time stamp: 1177846971 (Sun, 29 Apr 2007 11:42:51 UTC)  Symbol Table offset: 0  Number of symbols: 0  Size of optional header: 0xe0  Characteristics: 0x10f (0000000100001111) base relocations stripped executable image line numbers removed (deprecated) local symbols removed (deprecated) 32-bit machine
  • 18.
    $ pev -rppsftp.exe  Resources (.rsrc section): Type: RT_ICON Offset: 0x28 Type: RT_GROUP_ICON  Offset: 0x68  Type: RT_VERSION  Offset: 0x80   Product Version: 0.60.0.0 $ pev -o psftp.exe  | head Optional (PE) header:  Magic number: 0x10b (PE32)  Linker major version: 7  Linker minor version: 10  Size of .code section: 0x35000  Size of .data section: 0x1a000  Size of .bss section: 0  Entry point: 0x2d812  Address of .code section: 0x1000  Address of .data section: 0x36000
  • 19.
    TODO... - Detecção depackers - Disassembly de seções - Formatação de saída (CSV, XML...) - Extração de resources - Exibir imports e exports - Detecção do compilador - Detecção do idioma do binário - CRC32 - Detecção de strings inclusive XOReadas
  • 20.
    Conteúdo: Fernando Mercês(CC 3.0) baseado no paper "Construindo um analisador de executáveis". Template: Frank Skibby Jensen http://pev.sf.net @MenteBinaria www.mentebinaria.com.br Perguntas?