Buscar

Construindo Um Analisador De Executáveis

Prévia do material em texto

Fernando Mercês
Vale Security Conference 2011
São José dos Campos - SP
CONSTRUINDO UM 
ANALISADOR DE 
EXECUTÁVEIS
$ 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?
	Slide 1
	Slide 2
	Slide 3
	Slide 4
	Slide 5
	Slide 6
	Slide 7
	Slide 8
	Slide 9
	Slide 10
	Slide 11
	Slide 12
	Slide 13
	Slide 14
	Slide 15
	Slide 16
	Slide 17
	Slide 18
	Slide 19
	Slide 20

Outros materiais

Materiais relacionados

Perguntas relacionadas

Perguntas Recentes