Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 20

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("%x\n", 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?

Você também pode gostar