Você está na página 1de 144

Engenharia

Reversa de
Cdigo
Malicioso
Guilherme Venere
Engenharia
Reversa de
Cdigo
Malicioso

Guilherme Venere
Engenharia
Reversa de
Cdigo
Malicioso
Guilherme Venere

Rio de Janeiro
Escola Superior de Redes
2013
Copyright 2013 Rede Nacional de Ensino e Pesquisa RNP
Rua Lauro Mller, 116 sala 1103
22290-906 Rio de Janeiro, RJ

Diretor Geral
Nelson Simes

Diretor de Servios e Solues


Jos Luiz Ribeiro Filho

Escola Superior de Redes


Coordenao
Luiz Coelho

Edio
Pedro Sangirardi

Reviso
Lincoln da Mata

Reviso Tcnica
Thiago Oliveira Marques

Coordenao Acadmica de Segurana e Governana de TI


Edson Kowask Bezerra

Equipe ESR (em ordem alfabtica)


Celia Maciel, Cristiane Oliveira, Derlina Miranda, Elimria Barbosa, Evellyn Feitosa,
Felipe Nascimento, Lourdes Soncin, Luciana Batista, Luiz Carlos Lobato, Renato Duarte
e Yve Abel Marcial.

Capa, projeto visual e diagramao


Tecnodesign

Verso
1.0.1

Este material didtico foi elaborado com fins educacionais. Solicitamos que qualquer erro encon-
trado ou dvida com relao ao material ou seu uso seja enviado para a equipe de elaborao de
contedo da Escola Superior de Redes, no e-mail info@esr.rnp.br. A Rede Nacional de Ensino e
Pesquisa e os autores no assumem qualquer responsabilidade por eventuais danos ou perdas, a
pessoas ou bens, originados do uso deste material.
As marcas registradas mencionadas neste material pertencem aos respectivos titulares.

Distribuio
Escola Superior de Redes
Rua Lauro Mller, 116 sala 1103
22290-906 Rio de Janeiro, RJ
http://esr.rnp.br
info@esr.rnp.br

Dados Internacionais de Catalogao na Publicao (CIP)

V454e Venere, Guilherme


Engenharia reversa de cdigo malicioso / Guilherme Venere. 1. ed. aum.
Rio de Janeiro: RNP/ESR, 2013.
128 p. : il. ; 28 cm.

Bibliografia: p. 127.
ISBN 978-85-63630-26-1

1. Engenharia de software. 2. Assembly (Linguagem de programao). 3. Segurana


de software. 4. IDA Pro (software). 5. OllyDBG (software). I. Ttulo.

CDD 005.12
Sumrio

Escola Superior de Redes

A metodologia da ESRix

Sobre o curso x

A quem se destinax

Convenes utilizadas neste livrox

Permisses de usoxi

Sobre os autoresxii

1. Introduo engenharia reversa


Introduo1

Exerccio de nivelamento 1 Arquivos maliciosos2

Exerccio de fixao 1 Objetivo da engenharia reversa2

Definio2

Exerccio de fixao 2 Diferena entre vrus e trojan 3

Tipos de programas maliciosos3

Aes de um programa malicioso3

Exerccio de fixao 3 Engenharia social4

Formas de ataque4

Como a propagao?5

Quais funcionalidades o programa tem?5

Quais modificaes o programa causa?5

Qual o objetivo do cdigo?5

Classificao de cdigo malicioso6

Exerccio de fixao 4 Ambiente virtualizado6

iii
Ambiente de anlise7

Virtualizao x Emulao 8

Anlise ao vivo x Engenharia reversa 8

Roteiro de Atividades 19

Atividade 1.1 Anlise dinmica de binrio desconhecido9

2. Ferramentas
Montagem do ambiente de anlise11

Exerccio de nivelamento 1 Ferramentas11

VMWare12

Exerccio de fixao 1 VMWare13

Debugger13

Debuggers para Windows13

Exerccio de fixao 1 Decompilador e disassembler14

Decompilador14

Exerccio de fixao 2 Arquivos binrios14

Manipuladores de binrios15

Disassembler15

Roteiro de Atividades 217

Atividade 2.1 Configurao do VMWare17

Atividade 2.2 Ferramentas de decompilao18

Atividade 2.3 Ferramentas de manipulao de binrios18

3. Introduo ao IDA Pro e OllyDBG


Introduo ao IDA Pro19

Exerccio de nivelamento 1 IDA Pro e OllyDGB20

Exerccio de fixao 1 Conhecendo o IDA Pro21

IDA Pro22

Funcionalidades 23

Atalhos 24

Algoritmo de autoanlise 25

Grficos 25

Signatures e Type Library 27

Introduo ao OllyDBG28

Conhecendo o OllyDBG29

iv
Exerccio de fixao 2 OllyDGB30

Funcionalidades do OllyDBG30

Plugins31

Atalhos32

Roteiro de Atividades 333

Atividade 3.1 Signatures e Type Library33

Atividade 3.2 IDA Pro34

Atividade 3.3 OllyDBG34

4. Formato de arquivos executveis


Exerccio de fixao 1 Arquivos executveis37

Formato de arquivos executveis37

Exerccio de nivelamento 1 Execuo de cdigo38

Formato PE38

Estrutura do cabealho PE38

Cabealhos do formato PE41

Tabela de importao43

Cabealho de seo44

Roteiro de Atividades 445

Atividade 4.1 Navegando pela estrutura de um arquivo PE45

Atividade 4.2 Examinando arquivos PE45

5. Assembly bsico parte 1


Exerccio de fixao 1 Assembly47

Exerccio de nivelamento 1 Identificao de parmetros47

Assembly bsico47

Registradores49

Stack51

Layout de memria51

Exerccio de fixao 2 Tratamento de exceo54

Structured Exception Handling54

Instrues bsicas assembly54

Instrues assembly: Nmeros56

Instrues assembly: Endereamento56

v
Instrues assembly: Chamada de funo57

Instrues assembly: Enquadramento59

Instrues assembly: Parmetros de funo59

Roteiro de Atividades 561

Atividade 5.1 Structured Exception Handling61

Atividade 5.2 Estrutura de memria dos executveis61

6. Assembly bsico parte 2


Exerccio de fixao 1 Cdigo assembly63

Exerccio de nivelamento 1 Cdigo assembly63

Ramificaes63

Blocos condicionais64

Loops65

Switch66

Memcpy()/Strcpy()68

Strlen()/Strstr()68

Estruturas69

Operaes matemticas70

Nmeros randmicos71

Exerccio de fixao 2 Variveis em cdigos assembly72

Variveis72

Variveis de API72

Recuperao de tipos73

Cdigo orientado a objetos74

Lgica branchless75

Assembly bsico76

Roteiro de Atividades 677

Atividade 6.1 Assembly bsico77

Atividade 6.2 Reconhecimento de cdigos77

7. Import Address Table


Exerccio de fixao 1 Tabela de importao79

Exerccio de nivelamento 1 Tabela de importao79

vi
Import Address Table79

Reconstruo da IAT80

Roteiro de Atividades 783

Atividade 7.1 Recuperando a IAT com ferramentas83

Atividade 7.2 Recuperando a IAT manualmente83

Atividade 7.3 Anlise esttica85

8. Truques anti-engenharia reversa


Exerccio de fixao 1 Protetores de cdigo87

Exerccio de nivelamento 1 Debugger87

Truques anti-engenharia reversa87

Deteco de debugger88

Exerccio de fixao 2 Entry point89

Execuo de cdigo antes do Entry Point89

Thread Local Storage89

Cdigos no alinhados90

Modificaes no cabealho PE91

Structure Exception Handling92

Exerccio de fixao 3 Ambiente virtualizado93

Deteco de mquinas virtuais93

Tcnicas anti-engenharia reversa94

Roteiro de Atividades 895

Atividade 8.1 Deteco de debugger95

Atividade 8.2 Thread Local Storage95

Atividade 8.3 Cdigos no alinhados95

Atividade 8.4 Structured Exception Handling96

9. Anlise de um worm
Exerccio de nivelamento 1 Anlise de strings97

Descobrindo o bsico97

Exerccio de fixao 1 Identificao do cdigo 99

Emulao99

Strings99

Funes importadas100

vii
Assinaturas de cdigo101

Visualizao grfica102

Exerccio de fixao 2 Identificao do cdigo II104

Anlise de backtrace104

Funes bsicas105

Anlise de cdigo106

Roteiro de Atividades 9109

Atividade 9.1 Strings109

Atividade 9.2 Funes importadas109

Atividade 9.3 Assinatura de cdigo109

Atividade 9.4 Visualizao grfica109

Atividade 9.5 Anlise de backtrace110

Atividade 9.6 Funes bsicas110

10. Anlise do worm MyDoom


Exerccio de nivelamento 1 Anlise de backtrace111

Anlise do MyDoom111

Exerccio de fixao 1 Aplicando os conhecimentos112

Como ele se propaga?112

Quais dados so acessados ou modificados?114

Como ele se mantm no sistema?116

Exerccio de fixao 2 Executvel escondido122

Existe algum backdoor escondido?122

Concluso122

Roteiro de Atividades 10125

Atividade 10.1 Como ele se propaga?125

Atividade 10.2 Que dados ele acessa ou modifica?125

Atividade 10.3 Como ele se mantm no sistema?126

Atividade 10.4 Existe algum backdoor escondido?126

Atividade 10.5 Script IDC126

Bibliografia 127

viii
Escola Superior de Redes
A Escola Superior de Redes (ESR) a unidade da Rede Nacional de Ensino e Pesquisa (RNP)
responsvel pela disseminao do conhecimento em Tecnologias da Informao e Comunica-
o (TIC). A ESR nasce com a proposta de ser a formadora e disseminadora de competncias
em TIC para o corpo tcnico-administrativo das universidades federais, escolas tcnicas e
unidades federais de pesquisa. Sua misso fundamental realizar a capacitao tcnica do
corpo funcional das organizaes usurias da RNP, para o exerccio de competncias aplic-
veis ao uso eficaz e eficiente das TIC.

A ESR oferece dezenas de cursos distribudos nas reas temticas: Administrao e Projeto
de Redes, Administrao de Sistemas, Segurana, Mdias de Suporte Colaborao Digital e
Governana de TI.

A ESR tambm participa de diversos projetos de interesse pblico, como a elaborao e


execuo de planos de capacitao para formao de multiplicadores para projetos edu-
cacionais como: formao no uso da conferncia web para a Universidade Aberta do Brasil
(UAB), formao do suporte tcnico de laboratrios do Proinfo e criao de um conjunto de
cartilhas sobre redes sem fio para o programa Um Computador por Aluno (UCA).

A metodologia da ESR
A filosofia pedaggica e a metodologia que orientam os cursos da ESR so baseadas na
aprendizagem como construo do conhecimento por meio da resoluo de problemas tpi-
cos da realidade do profissional em formao. Os resultados obtidos nos cursos de natureza
terico-prtica so otimizados, pois o instrutor, auxiliado pelo material didtico, atua no
apenas como expositor de conceitos e informaes, mas principalmente como orientador do
aluno na execuo de atividades contextualizadas nas situaes do cotidiano profissional.

A aprendizagem entendida como a resposta do aluno ao desafio de situaes-problema


semelhantes s encontradas na prtica profissional, que so superadas por meio de anlise,
sntese, julgamento, pensamento crtico e construo de hipteses para a resoluo do pro-
blema, em abordagem orientada ao desenvolvimento de competncias.

Dessa forma, o instrutor tem participao ativa e dialgica como orientador do aluno para as
atividades em laboratrio. At mesmo a apresentao da teoria no incio da sesso de apren-
dizagem no considerada uma simples exposio de conceitos e informaes. O instrutor
busca incentivar a participao dos alunos continuamente.

ix
As sesses de aprendizagem onde se do a apresentao dos contedos e a realizao das
atividades prticas tm formato presencial e essencialmente prtico, utilizando tcnicas de
estudo dirigido individual, trabalho em equipe e prticas orientadas para o contexto de atua-
o do futuro especialista que se pretende formar.

As sesses de aprendizagem desenvolvem-se em trs etapas, com predominncia de tempo


para as atividades prticas, conforme descrio a seguir:

Primeira etapa: apresentao da teoria e esclarecimento de dvidas (de 60 a 90 minutos).


O instrutor apresenta, de maneira sinttica, os conceitos tericos correspondentes ao tema
da sesso de aprendizagem, com auxlio de slides em formato PowerPoint. O instrutor
levanta questes sobre o contedo dos slides em vez de apenas apresent-los, convidando
a turma reflexo e participao. Isso evita que as apresentaes sejam montonas e que o
aluno se coloque em posio de passividade, o que reduziria a aprendizagem.

Segunda etapa: atividades prticas de aprendizagem (de 120 a 150 minutos).


Esta etapa a essncia dos cursos da ESR. A maioria das atividades dos cursos assncrona e
realizada em duplas de alunos, que acompanham o ritmo do roteiro de atividades proposto
no livro de apoio. Instrutor e monitor circulam entre as duplas para solucionar dvidas e
oferecer explicaes complementares.

Terceira etapa: discusso das atividades realizadas (30 minutos).


O instrutor comenta cada atividade, apresentando uma das solues possveis para resolv-la,
devendo ater-se quelas que geram maior dificuldade e polmica. Os alunos so convidados a
comentar as solues encontradas e o instrutor retoma tpicos que tenham gerado dvidas,
estimulando a participao dos alunos. O instrutor sempre estimula os alunos a encontrarem
solues alternativas s sugeridas por ele e pelos colegas e, caso existam, a coment-las.

Sobre o curso
O curso apresenta tcnicas de anlise de malware para apoiar a investigao forense digital e
a resposta a incidentes envolvendo programas mal-intencionados. O objetivo fornecer aos
administradores de TI habilidades prticas para a anlise destes programas. So abordados
os conceitos, procedimentos, prticas e ferramentas para a anlise de um cdigo malicioso,
com o uso de uma ferramenta para a realizao das atividades prticas, que consolidam
o conhecimento terico. So apresentados os comandos bsicos de Assembly para que o
aluno faa a engenharia reversa de worms que afetaram milhares de computadores. O aluno
aprender as melhores prticas antiengenharia reversa, desenvolvendo competncias para a
criao de defesas mais eficazes contra cdigos maliciosos.

A quem se destina
Curso destinado a profissionais com slido conhecimento em segurana de redes e sistemas
e anlise forense, interessados em desenvolver competncias na rea de anlise de artefatos
maliciosos e engenharia reversa. Profissionais de outras reas que possuam conhecimento
compatvel com os requisitos bsicos tambm podero participar.

Convenes utilizadas neste livro


As seguintes convenes tipogrficas so usadas neste livro:

Itlico
Indica nomes de arquivos e referncias bibliogrficas relacionadas ao longo do texto.

x
Largura constante

Indica comandos e suas opes, variveis e atributos, contedo de arquivos e resultado da sada
de comandos. Comandos que sero digitados pelo usurio so grifados em negrito e possuem
o prefixo do ambiente em uso (no Linux normalmente # ou $, enquanto no Windows C:\).

Contedo de slide
Indica o contedo dos slides referentes ao curso apresentados em sala de aula.

Smbolo
Indica referncia complementar disponvel em site ou pgina na internet.

Smbolo
Indica um documento como referncia complementar.

Smbolo
Indica um vdeo como referncia complementar.

Smbolo
Indica um arquivo de adio como referncia complementar.

Smbolo
Indica um aviso ou precauo a ser considerada.

Smbolo
Indica questionamentos que estimulam a reflexo ou apresenta contedo de apoio ao
entendimento do tema em questo.

Smbolo
Indica notas e informaes complementares como dicas, sugestes de leitura adicional ou
mesmo uma observao.

Permisses de uso
Todos os direitos reservados RNP.
Agradecemos sempre citar esta fonte quando incluir parte deste livro em outra obra.
Exemplo de citao: VENERE, Guilherme; MARQUES, Thiago Oliveira. Engenharia reversa de
cdigo malicioso. Rio de Janeiro: Escola Superior de Redes, RNP, 2013.

Comentrios e perguntas
Para enviar comentrios e perguntas sobre esta publicao:
Escola Superior de Redes RNP
Endereo: Av. Lauro Mller 116 sala 1103 Botafogo
Rio de Janeiro RJ 22290-906
E-mail: info@esr.rnp.br

xi
Sobre os autores
Guilherme Venere Team Leader da equipe de Anlise de Malware do McAfee Lab e atua
como analista de malware pelos ltimos 4 anos, trabalhando com anlise avanada de
malware a partir do escritrio de pesquisa do McAfee Labs no Chile, criando deteces
para novas ameaas a clientes McAfee. Tem 7 anos de experincia em segurana de redes
e tratamento de incidentes, trabalhando para o backbone acadmico Brasileiro. bacharel
em Cincia da Computao pela Universidade Federal de So Carlos e certificado em an-
lise forense pelo Instituto SANS.

Thiago Oliveira Marques formado em Cincias da Computao pelo Centro Univer-


sitrio de Barra Mansa. Trabalha com engenharia reversa desde 2007, desenvolvendo
protees e ministrando treinamentos e palestras relacionadas anlise de malware,
no Brasil e no exterior.

Edson Kowask Bezerra profissional da rea de segurana da informao e governana


h mais de quinze anos, atuando como auditor lder, pesquisador, gerente de projeto
e gerente tcnico, em inmeros projetos de gesto de riscos, gesto de segurana da
informao, continuidade de negcios, PCI, auditoria e recuperao de desastres em
empresas de grande porte do setor de telecomunicaes, financeiro, energia, indstria
e governo. Com vasta experincia nos temas de segurana e governana, tem atuado
tambm como palestrante nos principais eventos do Brasil e ainda como instrutor de
treinamentos focados em segurana e governana. professor e coordenador de cursos
de ps-graduao na rea de segurana da informao, gesto integrada, de inovao e
tecnologias web. Hoje atua como Coordenador Acadmico de Segurana e Governana
de TI da Escola Superior de Redes.

xii
1
Introduo engenharia reversa
objetivos

Explicar o que a engenharia reversa e como ela pode ser utilizada na anlise de
malwares; entender as diferenas entre os tipos de cdigos maliciosos e conhecer
os tipos de ambientes de anlise.

conceitos
Engenharia reversa, programas maliciosos, formas de propagao, classificao do
cdigo malicioso, ambiente de anlise.

Introduo
Engenharia reversa: q
11 Processo de descoberta do funcionamento interno de um programa de computador
sem ter acesso ao cdigo-fonte.

11 Este processo pode ser to simples como executar o programa e monitorar suas
aes e resultados, ou to complexo quanto analisar as instrues de cdigo de
mquina, uma a uma.

Um especialista em engenharia reversa precisa responder perguntas como:

11 O que exatamente este software faz?

11 Qual parte do cdigo responsvel pelo acesso rede?

11 Quais parmetros ele aceita?

11 Quais aes ativam seu funcionamento?

De acordo com a literatura existente, a engenharia reversa pode ser descrita como o pro-
Captulo 1 - Introduo engenharia reversa

cesso de analisar, compreender e identificar as funes de um equipamento, software ou


dispositivo, de forma a ser capaz de fornecer manuteno ou desenvolver outro produto
compatvel com o analisado, ou ento descobrir o modo de funcionamento de algum pro-
grama desconhecido.

Este processo pode envolver diversas tcnicas, incluindo as mais simples, como a pura
execuo do software em um ambiente controlado, para identificar possveis aes e modifi-
caes causadas por ele, at a anlise do cdigo de mquina, possibilitando o entendimento
das funes do programa no nvel mais baixo de cdigo.

1
Alguns exemplos de situaes onde a engenharia reversa pode auxiliar, alm da anlise de
programas maliciosos:

11 Desenvolvimento de driver para um dispositivo;

11 Entendimento do funcionamento de um programa proprietrio, para desenvolvimento de


verso livre que no use o mesmo cdigo do programa proprietrio;

11 Entendimento de protocolos para permitir compatibilidade entre produtos existentes e


futuros produtos desenvolvidos;

11 Documentao de cdigo legado, para o qual no exista mais o cdigo-fonte.

Exerccio de nivelamento 1 e
Arquivos maliciosos
Todos os arquivos maliciosos podem ser classificados como vrus? Qual a principal caracte-
rstica de um vrus?

Qual a diferena entre virtualizao e emulao?

Exerccio de fixao 1 e
Objetivo da engenharia reversa
Qual a finalidade da Engenharia Reversa?

Definio
Engenharia reversa de arquivos maliciosos um estudo de cdigo suspeito ou malicioso q
com o intuito de descobrir:

11 Suas funcionalidades e caractersticas.

11 Seu modo de ao.

11 Possveis ameaas.
Engenharia Reversa de Cdigo Malicioso

A engenharia reversa de arquivos maliciosos envolve no somente a anlise de cdigo


executvel, mas em muitos casos, de protocolos de comunicao, criptografia de dados,
entre outros. Este estudo permite identificar as funes executadas por determinado cdigo
malicioso, permitindo assim sua identificao em dispositivos infectados, e em muitos casos
a remoo dos mesmos do sistema.

Outro objetivo na anlise de programas maliciosos permitir aos times de tratamento de


incidentes a identificao e o combate ao destes programas em redes e sistemas on-line.

2
Exerccio de fixao 2 e
Diferena entre vrus e trojan
Qual a diferena entre um vrus e um trojan?

Tipos de programas maliciosos


11 Vrus. q
11 Trojan.

11 Worm.

11 Spyware.

11 Rootkit.

muito difcil catalogar todos os tipos de programas maliciosos existentes atualmente.


Apresentamos abaixo uma lista com exemplos de possveis pragas que podem ser encon-
tradas ao analisar um programa desconhecido. Muitas vezes, o programa vai se encaixar em
mais de uma classificao:

11 Vrus: software que infecta outras aplicaes e as usa como vetor de infeco de
outros arquivos.

11 Trojan: aplicao que tem um funcionamento malicioso baseado na diferena daquilo


que se espera que ela faa.

11 Worm: cdigo malicioso com capacidade de se espalhar de um computador para outro


atravs de diversos protocolos de rede.

11 Spyware: aplicao maliciosa usada para coletar informaes pessoais sobre o usurio
de um computador.

11 Rootkit: ferramenta capaz de esconder a presena de programas, usurios ou


servios maliciosos.

Hoje em dia os programas maliciosos utilizam tcnicas diversas para descobrir e infectar
sistemas vulnerveis, e para se esconder de possveis mecanismos de deteco. Ao infectar
um sistema, eles costumam instalar diversos outros programas maliciosos, comprometendo
ainda mais o computador.

Aes de um programa malicioso


Captulo 1 - Introduo engenharia reversa

11 Infeco de arquivos. q
11 Explorao de vulnerabilidades.

11 Engenharia social.

11 Instalao de outros programas maliciosos.

11 Destruio de dados.

11 Roubo de informaes.

11 Ocultao de atividade maliciosa.

11 Agente de aes coordenadas.

11 Propagao.

3
Um ponto a se destacar que nos ltimos anos os programas maliciosos tm cada vez mais
sido utilizados para suporte a atividades criminosas, atravs de ataques coordenados a sites
em troca de pagamento, distribuio de spywares, fraudes em sistemas de pay-per-click ou
de ranking de sites, roubo de informaes pessoais e de dados sigilosos e bancrios.

Exerccio de fixao 3 e
Engenharia social
O que engenharia social?

Formas de ataque
Vetores de ataques de baixo nvel: q
11 Estouros de buffers (Stack e Heap).

11 Vulnerabilidades de formato de strings.

Vetores de ataque de alto nvel:

11 Explorao de vulnerabilidades em aplicativos.

11 Explorao de falhas existentes de configurao do sistema ou de protees.

Ataques de mais alto nvel:

11 Engenharia social.

11 E-mails em massa.

Os vetores de ataque usados por programas maliciosos apresentam variaes, e muitas


vezes um nico cdigo malicioso pode explorar diversas vulnerabilidades, tanto de baixo
como de alto nvel.

Os ataques de estouro de buffer (buffer overflow) exploram vulnerabilidades na forma como


os programas tratam dados gravados em buffers (espaos de memria reservados para
variveis). Muitas vezes, o programador no verifica o contedo de um parmetro gravado
em um buffer, o que permite que o parmetro seja gravado nesta rea de memria com um
tamanho maior do que suportado. Como a rea de memria seguinte rea de armaze-
namento de variveis reservada para a pilha de execuo do programa, estes dados sero
sobrescritos, permitindo ao atacante controlar o fluxo de execuo do programa, e conse-
quentemente permitindo a execuo de cdigo malicioso.

Os ataques contra formatos de string exploram uma vulnerabilidade em cdigos escritos em


Engenharia Reversa de Cdigo Malicioso

C/C++, onde um parmetro para uma funo de string (printf por exemplo) no verificado,
permitindo a manipulao da memria escrita no Stack e consequentemente a execuo do
cdigo malicioso.

Finalmente, ataques de engenharia social so difceis de combater, pois dependem exclusi-


vamente da ingenuidade do usurio do computador. Estes ataques induzem o usurio a exe-
cutar o programa malicioso ou divulgar inconscientemente informaes pessoais ou sigilosas.
hoje em dia um dos principais vetores de ataque utilizados por programas maliciosos.

Exemplo disso so os milhares de spams enviados diariamente, com fotos ou relatrios


falsos anexados, ou links para pginas e arquivos maliciosos para serem executados.

4
Como a propagao?
11 Se por rede, qual a velocidade de propagao? q
11 Existe algum padro na forma de se propagar ( randmica ou viciada)?

11 O programa contm um mdulo para reenvio de e-mails em massa?

11 Ele se replica por compartilhamentos?

11 Ele se replica por P2P ou outros protocolos de troca de arquivos?

11 Quais vulnerabilidades ele explora?

A seguir, conheceremos algumas perguntas mais especficas que devem ser respondidas
pelo analista fazendo a engenharia reversa. O mtodo de propagao de um programa mali-
cioso pode envolver diversas tcnicas e etapas, e descobrir essas informaes pode ajudar
no somente a encontrar outras possveis mquinas vulnerveis, mas tambm descobrir
novas vulnerabilidades que possam estar sendo exploradas pelo programa.

Quais funcionalidades o programa tem?


11 Backdoor? q
11 Servidor IRC?

11 Abre alguma porta de servio?

11 Busca dados em alguma pgina web?

11 Recebe algum tipo de comando remoto?

11 Tem algum temporizador para executar funes programadas?

A lista de funcionalidades de um programa malicioso atual, como os bots, pode ser gigan-
tesca. Um programa desse tipo pode dar controle total ao invasor sobre a mquina invadida,
e permitir que ele execute praticamente qualquer funo remotamente.

Descobrir estas funes pode ajudar na identificao de comportamentos estranhos em um


sistema, ou a deteco de informaes que possam estar sendo coletadas pelo invasor.

Quais modificaes o programa causa?


11 Ele cria/modifica/remove alguma chave de registro? q
11 Quais arquivos ele cria/modifica/remove?

11 Ele modifica algum processo em execuo?

11 Ele se auto modifica?


Captulo 1 - Introduo engenharia reversa

11 Ele modifica algum dado ou funo do sistema?

Um programa malicioso, ao invadir o computador, pode modificar o sistema a ponto de


somente uma restaurao completa do mesmo ser capaz de corrigir os problemas.

Descobrir as modificaes causadas pelo programa pode ajudar a recuperar o estado sadio
do sistema, ou identificar possveis maneiras de combater novas infeces.

Qual o objetivo do cdigo?


Para qu o programa foi escrito? q
11 Ataque direcionado?

11 Roubo de informaes?

11 Rede de computadores infectados?


5
Quem escreveu o cdigo? q
11 Qual linguagem foi usada?

11 Em que data foi escrito?

11 Existe alguma caracterstica na forma de escrever o cdigo, que permita a associao


a algum ou a algum grupo?

A motivao por trs de quem escreve um programa malicioso pode dar pistas sobre seu
autor, ou de possveis esquemas criminosos. Quase sempre, existe uma motivao finan-
ceira dos autores desse tipo de programa.

Outra informao importante a ser pesquisada a caracterstica do cdigo escrito. Muitas vezes
possvel identificar um padro no cdigo que possa ser associado a uma pessoa ou grupo.

Classificao de cdigo malicioso


O cdigo pode ser classificado em trs categorias: q
11 Cdigo constante: executado constantemente durante a execuo do programa.

22 Ex: loop de coleta de endereos de e-mails, ou de scan por mquinas vulnerveis

11 Cdigo reativo: executado em resposta a um evento especfico

22 Ex: quando um usurio acessa determinada pgina de um banco

11 Cdigo dormente: executado em data determinada

22 Ex: ataque DDoS coordenado

As categorias descritas abrangem quase a totalidade de cdigos que podem ser encontrados
em um programa malicioso.

Muitas vezes, durante a anlise de um binrio, o analista vai encontrar pores do cdigo
que so executadas em um loop constante e em alguns casos podem causar a degradao
do sistema.

Cdigos reativos so muito utilizados em programas que coletam informaes bancrias, e


que agem no momento em que o usurio acessa a pgina do seu banco. Eles podem ento
sobrepor a tela de digitao dos dados, ou ento monitorar o teclado e cliques do mouse
para capturar as informaes digitadas.

O cdigo dormente costuma ser usado em situaes que exijam uma ao coordenada das
mquinas infectadas. Exemplos disso so diversos programas maliciosos que agem somente
em determinadas datas, ou em determinado perodo do dia.

Exerccio de fixao 4 e
Engenharia Reversa de Cdigo Malicioso

Ambiente virtualizado
Qual a finalidade de um ambiente virtualizado?

6
Ambiente de anlise
Como analisar estes programas? q
11 Ambiente instalado para finalidade de anlise:

22 Forma mais segura.

22 Gasta muito tempo e recurso, pois a cada execuo do programa malicioso, preci-
samos recuperar o estado inicial do sistema.

22 Podemos utilizar hardware especial: CoreRestore, Norton Ghost, e outros


hardwares/softwares para recuperao de disco.

11 Ambiente virtual:

22 VMWare, Xen, Virtual PC, entre outros.

22 Mais barato para implantar uma estrutura de anlise.

22 Pode simular um ambiente de rede completo.

22 Facilita a recuperao do estado inicial, agilizando a anlise, mas pode


prejudicar a anlise.

Para analisar um programa malicioso em tempo de execuo, pode-se utilizar basicamente


trs formas:

1. Um ambiente fsico preparado para isso, com computadores e sistemas operacionais


reais, que permitam simular com fidelidade o ambiente comum de um usurio. a forma
mais garantida de conseguir um comportamento normal do programa analisado, pois
este no saber jamais que o computador infectado est sendo examinado. Suas des-
vantagens so o alto custo de implementao e manuteno, j que a cada execuo do
programa malicioso, todo o ambiente precisar ser restaurado. Existem diversos equipa-
mentos que podem ser usados para realizar essa operao. Basicamente, eles mantm o
estado do contedo em disco em seu formato original, direcionando todas as operaes
de gravao para um disco spare. Para restaurar o ambiente, eles simplesmente des-
cartam esse contedo gravado, e reiniciam o sistema a partir do disco original.

2. Outra tcnica a utilizao de imagens binrias dos discos utilizados, que so gravados
novamente no disco, sobrescrevendo quaisquer modificaes causadas pelo programa
malicioso. O ambiente virtual tem a vantagem de facilitar muito a restaurao do sistema,
agilizando assim a anlise. Alm disso, muito mais barato de implantar, permitindo assim
a simulao de um ambiente de rede completo, com diversas mquinas virtuais realizando
funes especficas para enganar o programa malicioso e analisar interaes remotas do
mesmo. A desvantagem desses sistemas que muitos programas maliciosos esto cientes
Captulo 1 - Introduo engenharia reversa

desse tipo de ambiente, e modificam seu comportamento, parando a execuo, execu-


tando funes diferentes ou at mesmo tentando explorar vulnerabilidades no gerenciador
do sistema virtual. Por isso o analista deve tomar cuidado ao usar esse tipo de tcnica.

3. Uma terceira tcnica envolve a utilizao de um simulador de sistema operacional, que


no deixa de ser um ambiente virtual. Mas diferente dos ambientes virtuais simulados,
estes programas simulam apenas as chamadas especficas do sistema operacional, no
executando as funes propriamente ditas. Exemplos destes softwares so o Norman
Sandbox e o CWSandbox.

7
Virtualizao x Emulao
11 Tecnologias de virtualizao tais como VMWare capturam todo o acesso a hardware, q
e simulam toda a placa-me, menos o processador.

11 Tecnologias de emulao, tais como BOCHS ou QEMU, emulam completamente o


processador, dispositivos de hardware e memria.

11 Emulao mais lenta, mas permite o controle total sobre o ambiente, e muito mais
segura para impedir que o programa malicioso fuja do ambiente virtual.

11 Emulao parcial pode ser muito til na anlise esttica.

A emulao tem algumas vantagens sobre a virtualizao simples, pois permite controlar a
forma como o cdigo binrio vai ser executado pelo processador.

Devido ao fato de sistemas de virtualizao simularem todo o hardware com exceo


do processador, o cdigo executado diretamente pelo processador do sistema. Em um
ambiente emulado, at o processador simulado, permitindo assim que uma instruo seja
interpretada da forma como o analista quiser.

Um exemplo disso so instrues de TRAP de processamento, que normalmente param


a execuo de um programa executado dentro de um debugger. Um programa que use
essa tcnica para impedir a engenharia reversa facilmente enganado em um sistema
emulado, que pode simplesmente ignorar esse tipo de instruo.

Anlise ao vivo x Engenharia reversa


Anlise ao vivo: q
11 Significa executar o programa malicioso em um ambiente e monitorar sua atividade.

11 Permite identificar rapidamente algumas funes do programa.

11 Complicado de identificar a forma como um programa executa essas funes, mas


um bom ponto de incio para a engenharia reversa.

Engenharia reversa:

11 Anlise do cdigo do programa.

11 Permite entender seu funcionamento, e descobrir funes escondidas, ou cdigo


dormente ou reativo.

A anlise ao vivo de um programa pode ser um bom incio na anlise de um programa mali-
cioso, j que pode dar pistas importantes sobre as funcionalidades de um programa.

Mas ela no permite descobrir facilmente as funcionalidades que sejam ativadas por uma
ao especfica do usurio ou uma funo dormente ativada em determinada data.
Engenharia Reversa de Cdigo Malicioso

8
Roteiro de Atividades 1
Atividade 1.1 Anlise dinmica de binrio desconhecido
Esta atividade demonstra uma possvel anlise dinmica de um binrio desconhecido, em
um ambiente virtual. O objetivo identificar mudanas no sistema causadas pela execuo
de um programa desconhecido. Para isso, utilizamos a ferramenta RegShot, um utilitrio
livre que permite monitorar mudanas em arquivos e no registro, e comparar dois estados
do sistema, para identificar mudanas.

O aluno deve abrir a mquina virtual disponibilizada para o curso, que contm um sistema
operacional Windows XP Pro com Service Pack 2.

Para garantir que todos os alunos tenham um ambiente igual, foi gerado um snapshot
chamado Incio das aulas.

1. Inicie o VMWare e abra a imagem D:\Windows_XPSP2_Malware\WinXPPro.vmx.

2. Restaure o snapshot Incio das aulas.

3. Execute o Process Explorer, o atalho encontra-se no desktop, e mantenha-o aberto


durante o exerccio, para examinar os processos em execuo.

4. Execute a ferramenta RegShot no desktop;

5. Marque a opo HTML Document e Scan Dir, acrescentando a linha abaixo:

6. C:\Windows;C:\Docume~1\

7. Clique em 1st Shot e escolha Shot;

8. Execute o cone acer.jpg.exe no desktop;

9. Clique em 2nd Shot e depois em Shot, e quando terminar, clique em Compare para
gerar a diferena entre as execues.

Captulo 1 - Roteiro de Atividades

9
Ao final do exerccio, o RegShot abrir uma janela do Internet Explorer com o contedo das
modificaes identificadas por ele.

Perguntas:

1. Que modificaes o programa causou no sistema?

2. Voc percebeu algum outro comportamento estranho no sistema?

3. Faa um breve relatrio com suas suspeitas, e descreva dicas para auxiliar uma possvel
engenharia reversa desse programa.

4. Aps terminar, restaure novamente o snapshot Incio das aulas, pois o sistema
est comprometido.
Engenharia Reversa de Cdigo Malicioso

10
2
Ferramentas
objetivos

Criar um ambiente de anlise e utilizar as ferramentas para auxiliar a anlise


do cdigo e entender as diferenas entre elas, identificando a melhor utilizao
de cada uma.

conceitos
Ambiente de anlise, virtualizao, debuggers, decompiladores e disassemblers.

Montagem do ambiente de anlise


Antes de iniciar a anlise, deve-se montar um ambiente completo, composto de: q
11 Mquinas virtuais.

11 Ferramentas de anlise dinmica.

11 Debuggers.

11 Decompiladores.

11 Disassemblers.

11 Ferramentas de manipulao de arquivos executveis.

A anlise de binrios suspeitos pode envolver diversas tcnicas, e por isso recomenda-se
que o ambiente usado pelo analista atenda a todas essas necessidades. O uso de mquinas
virtuais facilita muito esse tipo de anlise, pois permite ao analista no somente ter as fer-
ramentas disponveis, como tambm diversas configuraes de ambientes, como sistemas
operacionais, patches, configuraes de firewall, rede etc. A partir da, o analista deve
compor um ambiente com as ferramentas que atendam a suas necessidades e com as quais
tenha familiaridade.

Neste captulo veremos algumas ferramentas de apoio anlise de binrios suspeitos, tanto
para anlise dinmica quanto para anlise esttica.

Exerccio de nivelamento 1 e
Captulo 2 - Ferramentas

Ferramentas
O que um debugger?

11
Qual a diferena entre decompilador e disassembler?

VMWare
11 Salvamento de estado em background. q
11 Diversos nveis de snapshot.

11 Clones.

11 Simulao de infraestrutura de redes.

11 Gravao de vdeos.

l
Marcando a opo
disable acceleration
nas configuraes da
mquina virtual, alguns
programas maliciosos
deixam de detectar o
VMWare.

Figura 2.1
Snapshot Manager.

O ambiente virtual que usaremos durante o curso baseado no VMWare, um ambiente de


virtualizao que simula todo o hardware de um computador, mas passa diretamente
execuo das instrues ao processador fsico da mquina. Por isso ele no considerado
um emulador.

Dentre as caractersticas que podemos destacar no VMWare, podemos citar o gerencia-


mento de snapshot, que permite a criao de uma hierarquia de estados salvos do sistema.
Isto permite ao analista testar diversas configuraes ou situaes diferentes usando
apenas uma mquina virtual.
Engenharia Reversa de Cdigo Malicioso

Outra caracterstica importante a possibilidade de simular uma infraestrutura de rede


bsica, atravs do uso das interfaces virtuais do VMWare (vmnet1, vmnet2 etc). Cada
mquina virtual pode estar conectada a uma ou mais redes virtuais, e podem se comunicar
entre si, permitindo a criao, por exemplo, de um roteador/firewall entre duas redes.

Finalmente, o VMWare tem a capacidade de tirar um snapshot da tela da mquina virtual em


execuo, ou de gravar um vdeo da atividade na tela, uma tima ferramenta para estudar o
comportamento de determinado programa, ou para utilizao em treinamentos.

O VMWare implementa um hook virtual na CPU do sistema virtual, para que haja comuni-
cao entre a mquina virtual e o processador fsico. dessa forma que ele implementa a
execuo de instrues diretamente no processador. Mas esse hook passvel de deteco

12
no ambiente virtual. Alguns programas maliciosos tm a capacidade de identificar esse hook
e mudam sua execuo por estarem dentro do ambiente virtual. Muitas vezes, esses pro-
gramas no vo executar dentro de uma mquina virtual. Ao configurar a mquina virtual,
o analista pode marcar a opo Disable Acceleration no menu VMgSettingsgHardware
gProcessorsgDisable acceleration for binary translation, fazendo com que o hook no seja
criado e estes programas passem a funcionar.

Exerccio de fixao 1 e
VMWare
O VMWare um software de emulao ou virtualizao?

Debugger
Debugger uma ferramenta de anlise em tempo de execuo, que permite a manipu- q
lao do programa no nvel de cdigo de mquina (assembly).

Funcionalidades:

11 Informaes sobre estado da CPU.

11 Execuo passo-a-passo.

11 Pontos de parada (breakpoints).

11 Visualizao e manipulao de memria e registros.

11 Visualizao de threads.

A partir de agora conheceremos algumas ferramentas que podem auxiliar na anlise de um


binrio desconhecido. Elas so utilizadas para realizar tarefas especficas, e isoladas no
seriam de grande serventia.

O primeiro tipo de ferramenta que veremos so os debuggers, programas utilizados para


analisar o cdigo de mquina (assembly) de um programa em execuo. Com essa ferra-
menta possvel:

11 Examinar informaes como estado de registradores e posies de memria;

11 Executar o programa instruo por instruo;

11 Visualizar threads;

11 Criar pontos de parada em determinadas posies do cdigo ou ento em caso de acesso


a determinada posio de memria.

Os debuggers permitem ainda modificar o contedo de registradores e memria, alterando


assim a execuo do programa. Esta funcionalidade importante para permitir ao analista
desviar a linha de execuo do programa, evitando cdigos de proteo ou direcionando o
programa para uma funo especfica que se queira analisar.
Captulo 2 - Ferramentas

Debuggers para Windows


11 Microsoft WinDBG. q
11 OllyDBG.

11 IDA Pro.

11 PyDBG.

13
Entre os exemplos de debugger para Windows, o SoftIce foi durante muito tempo conside- w
rado o melhor debbuger existente, pois era extremamente poderoso. Ele foi descontinuado Muitos compiladores
em 2006, mas continua sendo uma referncia. vm com suas prprias
verses de debugger.
Em http://www.
Exerccio de fixao 1 e thefreecountry.com/
compilers/cpp.shtml
Decompilador e disassembler podem ser encon-
trados diversos
Qual a diferena entre um decompilador e um disassembler?
compiladores gratuitos,
muitos dos quais
possuem debugger
interno e outras
ferramentas de
debugging.
Decompilador
Ferramenta que tenta traduzir dados binrios em uma linguagem de alto nvel, geralmente q
apresentando falhas (decompilao de verdade impossvel). Realiza otimizaes do
compilador, remoo dos smbolos, nomes de variveis e funes perdidas.

Existem ferramentas que basicamente deixam o disassembly mais legvel.

Decompiladores so ferramentas que auxiliam o analista na tentativa de recuperar um


cdigo de alto nvel, a partir de um cdigo em linguagem de mquina. Eles normalmente
tentam atingir esse objetivo com a identificao de estruturas dentro do cdigo binrio,
e posterior transformao dessas estruturas em uma representao de alto nvel.

Por exemplo, ao analisar um cdigo binrio, a ferramenta pode identificar uma estrutura
representando um switch/case, e ento substitu-la por uma representao em alto nvel
(geralmente C ou C++) dessa estrutura.

Mas esse tipo de abordagem falha na maioria dos casos. O problema que durante o
processo de compilao, muitas informaes so perdidas, como nomes de variveis e de
funes, e a otimizao feita pelo compilador modifica a forma como a estrutura em lin-
guagem de alto nvel mapeada para a linguagem de mquina.

Ferramentas de decompilao: q
11 REC e REC Studio.

11 Desquirr.

11 Boomerang.

11 Hex-Rays Decompiler.

Entre as ferramentas que tentam decompilar cdigo, Desquirr e Hex-Rays Decompiler so


plugins para o IDA Pro. As demais so ferramentas stand-alone, sendo que o REC Studio
Engenharia Reversa de Cdigo Malicioso

a mais estvel.

Exerccio de fixao 2 e
Arquivos binrios
O que so arquivos binrios?5

14
Manipuladores de binrios
Ferramentas de manipulao de binrios: q
11 Permitem examinar e modificar a estrutura dos arquivos executveis.

Arquivos executveis:

11 Arquivos estruturados, geralmente baseados em um padro comum dentro de uma


arquitetura de processador.

11 Informaes que podem ser encontradas nessas estruturas:

22 Entry point do programa.

22 Tamanho das sees.

22 Lista de funes importadas.

Exemplos de padres de executveis:

11 PE, ELF, COM, MACH-O, COFF, entre outros.

Uma parte importante da anlise de arquivos suspeitos inclui a identificao de informaes


bsicas sobre os arquivos analisados. O primeiro passo identificar o tipo de arquivo anali-
sado: se arquivo de dados, executvel, se est compactado ou no.

Ao identificar um arquivo executvel e examinando a estrutura desse binrio, o analista


pode conseguir informaes importantes. O formato de executvel que estudaremos
durante esse curso o formato Portable Executable (PE), o padro de executvel usado no
Microsoft Windows.

No formato PE, a estrutura do binrio contm informaes importantes sobre o executvel.

Ferramentas de manipulao de binrios q


11 LordPE

22 http://www.woodmann.net/collaborative/tools/index.php/LordPE

11 PEiD

22 http://www.peid.info/

11 ImportREC

22 http://vault.reversers.org/ImpRECDef

11 PE Explorer (comercial)

22 http://www.heaventools.com/overview.htm

Durante o curso veremos exemplos de ferramentas para manipulao de binrios. O ltimo link
fornecido contm uma lista de ferramentas de manipulao de binrios e de engenharia reversa.

Disassembler
11 O que um disassembler? q
Captulo 2 - Ferramentas

22 uma ferramenta de anlise esttica que transforma bytes em linguagem assembly.

11 Praticamente todos os debuggers podem realizar o disassembly de um executvel.

11 O aspecto mais difcil em relao ao disassembly diferenciar o que cdigo


executvel do que apenas dado.

15
O disassembly usado para realizar a anlise esttica de um binrio. A principal vantagem
de realizar uma anlise esttica ter acesso ao cdigo do programa. Em uma anlise din-
mica, ficamos restritos apenas ao que o programa decide executar baseado nos seus par-
metros. J em uma anlise esttica, temos acesso a toda a estrutura do cdigo do programa,
podendo seguir o caminho que melhor nos convier.

Apesar disso, a dificuldade encontrada na anlise esttica diferenciar o que cdigo execu-
tvel do que apenas dado. Em um arquivo binrio, tudo apresentado por uma sequncia
de bits. Cabe ao sistema operacional, na hora da execuo, identificar o ponto inicial do pro-
grama (atravs dos cabealhos PE) e transferir o controle para este ponto. A partir da,
o programa decide o fluxo de execuo, e com isso faz a diferenciao entre cdigo e dado.

Uma tcnica comum anti-engenharia reversa armazenar partes do cdigo na rea do exe-
cutvel reservada aos dados do programa, e vice-versa.

Os disassemblers, por no executarem o programa, no tm a informao do que cdigo e


do que dado, e precisam descobrir isso seguindo o fluxo de instrues, mas sem execut-las.

Um exemplo seriam os programas executveis compactados. Normalmente eles contm


uma rotina de descompactao, e ao final dela, o fluxo de execuo transferido para uma
rea de memria que ainda no contm cdigo executvel. Este tipo de situao muitas
vezes confunde o disassembler, que pode marcar aquela posio como cdigo, quando na
verdade ela ainda no .

Ferramentas de Disassembly: q
11 IDA Pro

22 http://www.hex-rays.com/idapro/

11 OllyDBG

22 http://www.ollydbg.de/

11 Fenris

22 http://lcamtuf.coredump.cx/fenris

11 PE Browser

22 http://www.smidgeonsoft.prohosting.com/pebrowse-pro-file-viewer.html

Entre as ferramentas de disassembly, a mais conhecida e considerada a melhor o IDA Pro.


Apesar disso, outra boa ferramenta que pode ser usada em conjunto com o IDA Pro o
OllyDBG. Com essas duas ferramentas, possvel analisar praticamente qualquer tipo de
arquivo suspeito, mesmo aqueles que tentam se proteger de anlises.

No link abaixo h uma lista com diversas ferramentas de disassembly para download:
Engenharia Reversa de Cdigo Malicioso

11 http://www.woodmann.net/collaborative/tools/index.php/Category:Disassemblers

16
Roteiro de Atividades 2
Atividade 2.1 Configurao do VMWare
Esta atividade instrui o aluno a iniciar o sistema e prepar-lo para as prximas sesses. Por
isso, este roteiro descreve todas as aes que o aluno dever executar risca, para ter um
sistema pronto para as prximas sesses.

Ser utilizado o sistema operacional Windows XP Pro com Service Pack 2, com uma licena
temporria de 60 dias.

Para modificar as configuraes do sistema operacional, ele deve estar parado, isto , o
aluno deve fazer o shutdown do sistema operacional se ele ainda estiver ativo desde a
ltima sesso, ou se estiver em estado de pausa.

11 Execute o VMWare;

11 Abra a mquina virtual fornecida:

22 D:\Windows_XPSP2_Malware\winXPPro.vmx

11 Desabilite a acelerao nas configuraes da VM;

11 Compartilhe um diretrio para ser acessado pela mquina virtual;

11 Inicie o sistema, faa um snapshot e salve como Incio das atividades.

Na aba Hardware, o aluno deve confirmar que a configurao da interface de rede ethernet
est como Host-only, pois assim a mquina virtual no ter acesso internet.

Na aba Options, opo Shared Folders, o aluno dever verificar se existe um compartilha-
mento ativo, apontando para o diretrio malware presente no CD do aluno ou no disco da
mquina host.

Apenas como exemplo, est configurado na mquina virtual disponvel no CD do aluno um


diretrio compartilhado apontando para um diretrio em meu sistema. Este compartilha-
mento dever ser removido ou modificado para apontar para um diretrio existente.

Repare que o aluno poder acessar esse compartilhamento depois atravs do Explorer,
indicando no lugar do IP da mquina host, o endereo \\vmware-host\ e o nome do com-
partilhamento, no formato \\vmware-host\Shared Folders\nome_compartilhamento. Aps
encontrar a mquina, o aluno poder mapear o compartilhamento em um drive local para
facilitar o acesso.

Finalmente, o aluno dever ligar o sistema operacional e fazer um snapshot, a partir do qual
sero executadas todas as atividades daqui para a frente. Ao executar uma atividade que
Captulo 2 - Roteiro de Atividades

exija a execuo de cdigo malicioso e o consequente comprometimento da mquina, o


aluno poder retornar a este snapshot para ter novamente um sistema limpo.

17
Atividade 2.2 Ferramentas de decompilao
1. Execute Rec/RecStudio;

2. Abra Exemplos\Sesso 2\mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dat no desktop;

3. Qual a sua opinio sobre o resultado obtido? Discuta com seus colegas situaes onde
este tipo de ferramenta pode ser til.

Para ilustrar a dificuldade de se trabalhar com ferramentas de decompilao, utilizaremos uma


destas ferramentas para analisar um binrio suspeito, e visualizar o resultado da decompilao.

Ao abrir o executvel, o programa analisar a estrutura do binrio e mostrar uma estrutura


em rvore esquerda, e o cdigo assembly direita. Clicando em algum dos procedimentos
identificados pelo programa, possvel visualizar o cdigo decompilado daquela funo.

Atividade 2.3 Ferramentas de manipulao de binrios


Os alunos devem abrir, com cada ferramenta, dois ou mais arquivos suspeitos presentes no
diretrio Malware no desktop da mquina virtual, para que possam comparar diferentes
informaes sobre cada um.

1. Utilize as ferramentas PEiD, Lord PE e ImportREC, disponveis no desktop da mquina virtual


para examinar os arquivos maliciosos presentes no diretrio Malware, tambm no desktop.

2. Utilize todas as funcionalidades de cada um dos programas. Quais funcionalidades voc


considera que seriam mais teis em uma anlise de um programa malicioso? Discuta com
seus colegas as informaes encontradas com cada ferramenta, e como essas informaes
podem ser teis para identificar um programa malicioso. Faa um relatrio descrevendo as
funcionalidades que voc considera mais teis e as situaes em que elas podem ajudar.
Engenharia Reversa de Cdigo Malicioso

18
3
Introduo ao IDA Pro e OllyDBG
objetivos

Apresentar as ferramentas de disassembly mais utilizadas para engenharia reversa,


mostrando suas diferenas e principais funcionalidades.

conceitos
IDA Pro, OllyDbg.

Introduo ao IDA Pro


DataRescue IDA Pro: q
11 Ferramenta padro para anlise esttica.

11 Suporta mltiplas arquiteturas de processadores.

11 Cross-plataforma, interface de console e grfica.

11 Expansvel atravs de plugins em diversas linguagens.

11 Manipulvel atravs de scripts.

11 Possui dezenas de plugins e ferramentas escritas para ele.

11 Verso comercial custa pouco mais de US$ 500.

Neste captulo, vamos conhecer as ferramentas que usaremos ao longo do curso, como o
Interactive Disassembler Pro, ou IDA Pro, reconhecido como um dos melhores programas
do mercado para engenharia reversa. Custando pouco mais de 500 dlares, a quantidade de
funcionalidades disponveis compensa o valor pago.

Trata-se de um programa de disassembly capaz de manipular executveis de praticamente


Captulo 3 - Introduo ao IDA Pro e OllyDBG

qualquer tipo de processador, por causa da sua arquitetura modular. Basta o analista ter
ou desenvolver os mdulos de acesso a um processador, que o IDA identificar binrios
daquele processador.

Alm de suportar processadores diferentes, o IDA suporta tambm diversos tipos de binrios,
atravs de mdulos de reconhecimento de executveis. Esta propriedade torna possvel, por
exemplo, analisar programas escritos para microprocessadores PIC, programas escritos em
linguagens variadas como Java, .Net, Linux ELF ou executveis de outras arquiteturas, como
Mac, Sun etc.

A licena do IDA d direito ao uso da verso Windows e tambm da verso Linux ou Mac
do programa. O IDA tambm suporta um sistema de plugins e scripts externos, que faz
com que suas possibilidades de anlise sejam praticamente ilimitadas. Os scripts podem

19
ser desenvolvidos tanto em sua prpria linguagem, o IDC, como em Python, C e Perl, entre
outras. Justamente por isso, existem na internet centenas de ferramentas escritas para
integrao com o IDA Pro.

Interactive Disassembler Pro: q


11 IDA uma das melhores ferramentas para engenharia reversa.

11 Controlvel atravs de scripts IDC IDA Perl ou IDA Python.

11 Interativo, pois possvel interagir com seu banco de dados, corrigindo o que ele no
conseguir identificar automaticamente.

FLIRT:

11 Fast Library Identification and Recognition Technology.

11 Bibliotecas de padres, permitem que o IDA reconhea as chamadas padro de bibliotecas.

Como j foi comentado, o IDA Pro pode ser controlado e expandido atravs de scripts IDC,
ou atravs de outras linguagens como Python e Perl.

O termo interativo advm do fato de que o IDA funciona na verdade como um gerenciador
de banco de dados. Ao abrir um executvel, as informaes sobre ele so inseridas em um
banco de dados, e a partir da todas as operaes so realizadas nele.

Por isso, o executvel no mais necessrio aps a criao da base de dados, facilitando a distri-
buio da anlise entre um grupo de pessoas, sem a necessidade de enviar o binrio malicioso
propriamente dito, que s se faz necessrio no caso de se realizar a execuo do binrio.

As operaes realizadas na base permitem ao analista modificar informaes no disassembly,


adicionar comentrios, consertar cdigos que tenham sido identificados erroneamente pelo
IDA, criar ou remover funes, estruturas e tipos, renomear objetos, entre outras operaes.

Uma das caractersticas mais vantajosas do IDA a utilizao de bibliotecas de reconhe-


cimento de padres. O FLIRT um sistema de biblioteca de padres aplicados ao banco
de dados analisado, que permite identificar automaticamente funes pertencentes a
bibliotecas padro do Windows. Por exemplo, o sistema pode identificar automaticamente
funes padro do Delphi ou do Visual C, o que facilita o trabalho do analista, j que ele no
vai precisar analisar novamente essas funes.

Exerccio de nivelamento 1 e
IDA Pro e OllyDGB
Utilizando o IDA podemos analisar o cdigo do binrio sem que o processo esteja em execuo.
Como isso possvel?
Engenharia Reversa de Cdigo Malicioso

Qual o plugin do OllyDBG que nos permite gerar um dump do executvel?

Durante o curso: q
11 Ser utilizado IDA Pro 5.0 Free.

11 Os arquivos de exemplo esto nas pastas Exemplos e Malware no desktop.

11 Sempre que houver comprometimento da mquina, restaurar o ltimo snapshot sadio.

20
11 Por isso, evite executar os arquivos maliciosos durante o curso, a no ser quando indicado q
11 Para comear, vamos configurar o IDA Pro Free para facilitar o uso.

Neste curso vamos utilizar o IDA Pro Free. Esta verso distribuda livremente atravs do
site do IDA Pro, mas no conta com uma srie de funcionalidades da verso atual (6.x).

A principal caracterstica faltante a visualizao da listagem assembly em forma de grfico,


que facilita a identificao de estruturas e fluxo. Na verso Free no possvel usar os
plugins compilados para as verses comerciais, o que mais um incentivo para a compra da
verso comercial.

Os arquivos de exemplo vo estar disponveis dentro da mquina virtual, nos diretrios


Exemplos e Malware no desktop. Estes arquivos so realmente maliciosos, coletados
pelo CAIS atravs do projeto de banco de dados de malwares. Estes arquivos devem ser
manipulados em observncia aos preceitos de segurana e tica.

Durante o curso ser necessrio, em alguns casos, executar o arquivo malicioso de forma
a auxiliar a anlise. Nestes casos, onde ocorre o comprometimento da mquina virtual,
deve-se recuperar o ltimo estado salvo do VMWare, para retornar a mquina virtual a um
estado sadio.

Por isso importante relembrar a criao de um diretrio compartilhado entre a mquina


virtual e a mquina host, para que ele sempre grave qualquer arquivo que deseja manter
neste diretrio, pois ao recuperar o estado salvo, os arquivos armazenados dentro da
mquina virtual sero perdidos.

Salve o estado da mquina logo no incio desse captulo, para ter um ponto de
retorno mais atualizado para recuperar a mquina aps uma infeco.

O primeiro passo antes de iniciar este captulo configurar o IDA Pro.

Exerccio de fixao 1 e
Conhecendo o IDA Pro
O IDA Pro um decompilador ou um disassembler?

Captulo 3 - Introduo ao IDA Pro e OllyDBG

21
IDA Pro
Ao abrir o IDA Pro e um executvel para anlise, esta a tela que voc ir encontrar
(Figura 3.1).

Toolbar
Abas de vises
e navegador
Highlight
de sintaxe
Endereamento

rea de
disassembly

Jumps e uxo
do cdigo
rea de
mensagens Figura 3.1
IDA Pro.

Na parte superior esto as barras de ferramentas, com acesso a muitas funes do IDA, e no
menu, acesso a outras ferramentas.

Abaixo da rea de toolbar, temos a barra de navegao. Ao abrir um executvel, essa rea
representa o arquivo completo. Ela colorizada, e cada cor indica um tipo de informao.
Ao remover a barra de navegao da toolbar (puxando-a para o centro da tela por exemplo,
destacando da rea de toolbar) ela mostrar uma legenda com o significado de cada cor.
A caixa dropdown esquerda permite ao aluno encontrar rapidamente alguns tipos de infor-
mao, como o entry point do programa ou algum padro de texto ou hexadecimal.

Abaixo da barra de navegao temos as abas com as janelas abertas. possvel abrir outras
janelas atravs do menu Views->Open Subviews. Estas janelas mostram informaes
diferentes presentes no banco de dados, como todas as funes identificadas ou todas as
strings encontradas.

Na aba IDA View A temos a rea de disassembly. Cada aba IDA View pode representar uma
parte diferente do cdigo, e voc poder abrir quantas abas IDA View precisar (View g Open
Subview g Disassembly).

Nesta rea, temos o cdigo assembly do programa que est sendo analisado. esquerda,
temos uma rea reservada para mostrar o fluxo do programa. As setas indicam JUMPs dentro
do cdigo. Ao lado, temos o endereo de cada instruo, precedido do nome da seo onde o
cdigo est. Logo aps, qualquer identificador, como o nome de funo, labels etc.
Engenharia Reversa de Cdigo Malicioso

Em seguida, vem o cdigo propriamente dito. Veja que o IDA faz um highlight de objetos
selecionados, marcando outras ocorrncias para facilitar a visualizao. Uma colorizao
aplicada para identificar diferentes tipos de informaes no cdigo, como por exemplo azul
para instrues e parmetros nomeados, verde para endereos ou dados brutos, e ver-
melho para reas com problemas na identificao. O IDA permite navegar no cdigo dando
um duplo clique em algum objeto nomeado.

Por ltimo, na parte mais direita, o IDA mostra as referncias e comentrios.

Na parte inferior da tela so mostradas as mensagens do programa e de sada dos plugins e


scripts. Essa rea deve ser examinada para descobrir se a funo executada teve sucesso ou no.

22
Funcionalidades
11 Viso hexadecimal. q
11 Lista de funes.

11 Lista de nomes e smbolos.

11 Lista de funes importadas.

11 Lista de funes exportadas.

11 Lista de strings.

11 Estruturas e enumeraes.

11 Debugger.

11 Referncias cruzadas.

11 Scripts IDA.

11 Viso hexadecimal: mostra o contedo dos bytes do programa. Pode ser sincronizada
com a listagem disassembly, de forma a sempre exibir o mesmo local que est sendo
mostrado na listagem. Isto pode ser muito til para identificar partes do cdigo que no
foram identificadas automaticamente pelo IDA, ou que foram identificadas erroneamente.
Por exemplo, o analista pode com o IDA identificar uma string de texto como cdigo, e
observando a viso hexadecimal fazer a correo no banco de dados.

11 Lista de funes: mostra todas as funes identificadas pelo IDA, tanto as pertencentes
a bibliotecas, quanto aquelas nomeadas automaticamente. Um duplo clique em qualquer
uma delas leva funo na listagem disassembly; clicando com o boto direito possvel
visualizar e modificar informaes sobre as flags da funo.

11 Lista de nomes: mostra todos os nomes identificados e criados automaticamente pelo


IDA ou criados pelo analista. Atravs dessa lista voc pode chegar rapidamente a qual-
quer dado identificado dentro do programa.

11 Lista de funes importadas: mostra a lista de funes que o IDA identifica como sendo
importadas de DLLs externas, que so representadas no cdigo apenas por suas declaraes.

11 Lista de funes exportadas: as funes que o programa exporta. Para uma DLL,
conter todas as funes exportadas, mas para um binrio, ela normalmente contm
todos os entry points do programa.

11 Lista de strings: mostra todos os textos reconhecidos pelo IDA. Essa lista gerada dina-
micamente, e normalmente o IDA reconhece somente um tipo especfico e bsico de string
(estilo C, 7 bit ASCII null terminated). Para configurar outros tipos de string, deve-se clicar
com o boto direito na janela de string, e escolher Setup. Nesta tela tambm possvel
Captulo 3 - Introduo ao IDA Pro e OllyDBG

escolher a opo Ignore instruction/data definition, que far com que o IDA procure por
strings at dentro de funes. Isto pode aumentar os falsos positivos, mas tambm pode
resolver o problema do IDA no encontrar certas strings misturadas com cdigo.

11 Estruturas e enumeraes: nas janelas Structures e Enums so encontradas as estru-


turas e enumeraes identificadas automaticamente pelo IDA. Estas estruturas so
identificadas atravs da anlise do cdigo, biblioteca de assinaturas, ou pelo uso de
determinadas variveis em chamadas a funes de bibliotecas. possvel tambm criar
novas estruturas ou enumeraes conforme a necessidade.

11 Debugger: permite executar de forma controlada o programa analisado, mas no esquea


de que ao executar um programa malicioso, a mquina poder ser comprometida.

23
11 Referncias cruzadas: janela que pode ser acessada clicando em um objeto, nome ou
funo dentro da listagem disassembly, e pressionando Control+X.

11 Scripts: podem ser acessados atravs do menu File->IDC File ou do toolbar corres-
pondente. Ao executar um script, o output dele ser enviado para a rea de mensagens.
Algumas vezes, o script pode pedir a interveno do usurio, outras vezes, ele adicionar
uma funo ao IDA Pro.

Como exemplo, a execuo do script C:\Program Files\Ida Free\IDC\call_count_prefixer.


idc o far escanear todo o banco de dados do programa analisado, e renomear as funes
colocando como prefixo o nmero de vezes que a funo chamada; desta forma se pode
saber as funes mais importantes e que devem ser analisadas primeiro.

Atalhos
Atalhos e navegao: q
11 R: transforma valor hexa em caractere.

11 H: transforma valor hexa em decimal.

11 N: renomeia objeto atual.

11 X: mostra referncias de cdigo.

11 F12: mostra grfico de controle de fluxo.

11 Ctrl+F12: mostra grfico de chamada de funo.

11 Enter: segue uma referncia (duplo clique).

11 ESC: retorna para a referncia anterior.

11 : (dois pontos): adiciona comentrio.

11 ; (ponto-vrgula): adiciona comentrio repetitivo.

O mais importante a lembrar aqui so os atalhos para navegao no cdigo. ENTER em cima
de um XREF faz com que a listagem disassembly pule para aquela referncia, e ao pressionar
ESC, o IDA retorna para o ponto anterior. Com isso, voc pode navegar rapidamente por uma
sequncia de chamadas a funes, e retornar ao ponto inicial com facilidade.

Ao analisar uma funo e entender seu funcionamento, voc poder renome-la, e assim
identific-la rapidamente depois, procedimento que deve sempre ser usado.

11 CTRL+X: mostra referncias funo corrente. q


11 CTRL+UP/DOWN: para navegar sem perder a marcao de highlight de texto.

11 CTRL+LEFT/RIGHT: parar pular entre itens.

11 SHIFT+ENTER: para marcar o item atual.


Engenharia Reversa de Cdigo Malicioso

11 ALT+UP/DOWN: para encontrar a prxima ocorrncia do item atual.

11 ALT+M: marca uma posio.

11 CTRL+M: pula para a posio marcada.

11 Para apagar marcas:

22 No menu Jump -> Clear Mark, escolha a marca a apagar.

24
Algoritmo de autoanlise
Algoritmo de autoanlise do IDA: q
1. Carregue o arquivo e crie os segmentos.

2. Adicione o ponto de entrada e as DLLs exportadas fila de anlise.

3. Encontre todas as sequncias de cdigo e marque-as.

4. Pegue um endereo da fila para desassemblar, adicionando na fila as referncias


de cdigo.

5. Enquanto a fila no estiver vazia, repita o procedimento anterior.

6. Analise uma ltima vez todo o cdigo, convertendo para dado o que no foi analisado
no segmento de texto.

Agora que voc j conhece um pouco sobre a interface do IDA, vamos entender o que feito no
momento em que um programa carregado pelo IDA para ser analisado. Deve ser escolhido um
programa para ser carregado, como o arquivo \Desktop\Exemplos\Sessao 3\mal.Down.nopack.
worm.exe. Ao escolher um programa para ser carregado, poder ser visualizada uma tela de
configurao do arquivo. Ao pressionar OK, o IDA ir proceder com a autoanlise do arquivo.

No primeiro passo, o arquivo carregado na base de dados e os segmentos so criados,


de acordo com o descrito no cabealho do arquivo.

A seguir, o entry point do programa e todas as DLLs requeridas so adicionados fila de


anlise. Em seguida, o IDA encontra todas as sequncias de cdigo dentro do arquivo, e
seleciona-as para anlise.

O prximo passo inicia um loop. Uma instruo retirada da fila, e o fluxo de instrues a
partir dela analisado, at que no seja mais possvel encontrar uma instruo executvel.
Por exemplo, a partir do entry point, o IDA examinar a sequncia de instrues seguintes,
at uma instruo de sada ou de retorno. Aps isso, se no houver mais cdigo, ele pega
outra instruo da fila, e comea novamente. Se for feita uma referncia de fluxo a uma
posio de memria que no tenha sido marcada como cdigo, o IDA adiciona essa posio
lista de instrues a analisar. Ao final, o cdigo inteiro analisado mais uma vez, e aquilo
que no for identificado marcado como dado.

Ao carregar o arquivo, voc poder acompanhar o estado da autoanlise atravs da rea de


mensagens do IDA, e da modificao na barra de navegao, que passar a mostrar novas
cores dependendo do que for identificado.

Grficos
Captulo 3 - Introduo ao IDA Pro e OllyDBG

Grficos de chamadas: q
11 Os programas analisados podem ser visualizados como grficos.

11 A funo so os ns, e as chamadas da funo so as arestas.

11 til para visualizar relaes entre funes.

25
sub_4055E4

sub_403A9C GetLastError SetFileAttributesA

Figura 3.2
__imp_GetLastError __imp_SetFileAttributesA Grficos de
chamadas

Os grficos de chamada so muito teis para visualizar informaes de fluxo dentro do


programa. As informaes de fluxo servem para encontrar relaes entre funes dife-
rentes, e descobrir pontos importantes no programa analisado.

No IDA Pro comercial, a partir da verso 5, existe um modo de viso disassembly que j
incorpora uma viso grfica, sem a necessidade de gerar o grfico toda vez.

Nestes grficos, os ns so as funes, e as arestas so as chamadas entre as funes.

11 Abra o arquivo: q
\Desktop\Exemplos\Sessao3\mal.Down.nopack.worm.exe

11 D duplo clique em uma funo na lista de funes.

11 Pressione Control-Shift-T para grficos at a funo atual.

11 Control-Shift-F para grficos a partir da funo atual.

Para visualizar um grfico de chamada de funes, abra o arquivo indicado e escolha uma
das funes identificadas pelo IDA, na janela Funes, de preferncia alguma identificada
pelo nome como sub_xxxxxx, sendo xxxxxx qualquer nmero. Clique uma vez sobre o
nome da funo na listagem disassembly.

Aps isso, basta pressionar Control+Shift+T para gerar um grfico de chamadas a partir
do entry point at a funo atual. Se o atalho no estiver configurado, basta clicar no cone
identificado ao lado do texto acima.

Para gerar um grfico de chamada a partir da funo atual, basta pressionar Control+Shift+F
ou pressionar o cone correspondente.

11 Grficos de fluxo de controle: q


22 Funes podem ser visualizadas como grficos.
Engenharia Reversa de Cdigo Malicioso

22 Blocos bsicos so representados como ns.

22 Os caminhos lgicos so representados pelas arestas.

11 Procure a funo sub_403D70:

22 CTRL+P e digite o nome da funo.

11 F12 para ver grfico de fluxo.

26
00000010 sub_00000010
00000010 push ebp
00000011 mov ebp, esp
00000013 sub esp, 128h
...
00000025 jz 00000050

0000002b
0000002B mov eax, 0Ah
00000030 sub ebx, 0Ah
...

00000050
00000050 xor eax, eax
Figura 3.3
Grficos de fluxo 00000052 xor ebx, ebx
de controle. ...

Outra funcionalidade importante para o analista poder visualizar, dentro de uma funo,
como se comporta o fluxo de controle do programa.

Saltos condicionais, como blocos if/then/else ou switch/case podem ser difceis de identificar
dentro da listagem assembly. Por isso, o IDA Pro permite visualizar uma funo como um
grfico de fluxo de controle.

Neste grfico, blocos bsicos so representados pelos ns, e as arestas indicam os caminhos
lgicos possveis. Linhas verdes indicam o caminho seguido quando a condio for verda-
deira, e linhas vermelhas quando a condio for falsa.

Um bloco bsico a maior sequncia de instrues executadas antes de um salto condicional.

Como um pequeno exerccio, voc pode usar um atalho para procurar na lista de funes
pela funo sub_403D70. Pressionando Control+P, uma janela aberta com as funes reco-
Captulo 3 - Introduo ao IDA Pro e OllyDBG

nhecidas. Nesta tela, bem como em outras parecidas, basta digitar o nome da funo, e a
lista ser percorrida at o cursor parar na funo desejada.

Ao encontrar a funo, basta clicar duas vezes sobre ela, e uma vez sobre o nome da funo
na listagem disassembly. Aps isso, basta pressionar F12 para visualizar o grfico.

Signatures e Type Library


11 Muitas vezes, funes dentro do programa podem pertencer a bibliotecas padro de q
compiladores ou do sistema.

11 O IDA Pro usa bibliotecas de assinaturas para identificar essas funes.

11 Algumas vezes, o IDA reconhece erroneamente o compilador usado, e acaba no


identificando corretamente essas funes.

27
Muitas vezes, ao compilar um programa, o autor pode optar por embutir nele as DLLs neces-
srias para seu funcionamento. Ou seja, ele compila estaticamente as bibliotecas necessrias.

Alm disso, dependendo do compilador usado, diversos mdulos caractersticos desse com-
pilador tambm podem ser embutidos no programa. Por exemplo, em linguagens visuais
como Visual C++ ou Delphi, as funes para tratamento dos objetos visuais, como formul-
rios e botes, so padronizadas.

Ao analisar um programa suspeito, identificar corretamente o compilador usado pode ofe-


recer um grande auxlio ao analista, que pode ento procurar por funes padronizadas e
elimin-las da lista a ser analisada.

O IDA Pro tem duas funcionalidades muito importantes para auxiliar o analista nesta tarefa.
A primeira delas a biblioteca de tipos. Uma biblioteca de tipos um conjunto de assina-
turas que auxiliam o IDA a identificar o compilador usado no programa, e na identificao de
variveis padro, mtodos de chamada, funes padro etc.

Signatures (ou assinaturas de funo) so bibliotecas de assinaturas que auxiliam o IDA a


reconhecer funes padro de bibliotecas. Ele realiza essa tarefa atravs da pesquisa por
hash de funes existentes. Se uma funo desconhecida tem o mesmo hash de uma funo
de uma biblioteca do sistema, ento elas possivelmente so a mesma funo.

Dessa forma, o IDA consegue reconhecer automaticamente partes do cdigo que de outro
modo permaneceriam desconhecidas, e caberia ento ao analista identificar a funcionali-
dade daquela funo. Algumas vezes, porm, o IDA reconhece erroneamente o compilador,
e no aplica corretamente as assinaturas. Veremos a seguir um exemplo disso.

Veja como a barra de navegao muda, quando as assinaturas so aplicadas:

Figura 3.4
Mudanas na barra
de navegao.

Finalmente, aps todas as assinaturas aplicadas, voc vai perceber que muitas funes que antes
estavam marcadas como desconhecidas, agora esto marcadas como pertencendo s bibliotecas
Engenharia Reversa de Cdigo Malicioso

do Borland. Isto facilita a anlise, pois agora no mais preciso analisar essas funes.

Demonstraremos a seguir a utilidade das funes de reconhecimento automtico de


padres no IDA. As assinaturas podem ser encontradas em diversas fontes pela internet ou
desenvolvidas pelo prprio analista, permitindo assim expandir a funcionalidade do IDA.

Introduo ao OllyDBG
11 Freeware. q
11 Contm diversas funcionalidades cracker friendly.

11 Expansvel atravs de diversas linguagens.

28
11 Controlvel atravs de scripts OllyScript. q
11 Contm um disassembler poderoso.

11 H centenas de funes escondidas.

11 A documentao existente excelente.

Cuidado: o programa carregado colocado em estado de execuo pausada, e qual-


quer erro pode comprometer seu sistema!

Veremos a partir de agora outra ferramenta muito til na anlise de programas maliciosos.
O OllyDBG um debugger e disassembler, distribudo livremente, que contm uma grande
quantidade de funcionalidades teis para a anlise.

O Olly uma ferramenta cracker friendly, pois suas funcionalidades so especialmente


desenvolvidas para facilitar a engenharia reversa de programas protegidos. Com a possibili-
dade de expandir seu funcionamento atravs de scripts e plugins, assim como o IDA, o Olly
complementa as caractersticas do IDA. O conjunto das duas ferramentas atende a pratica-
mente qualquer necessidade que o analista possa ter durante uma anlise.

Uma caracterstica do Olly que a maioria das funes no so acessveis pelo menu do
programa. Menus contextuais no boto direto contm muitas outras funcionalidades, assim
como atalhos de teclado acessam outras tantas funcionalidades inacessveis de outro modo.
Felizmente, a documentao existente excelente e o analista poder aprender muito com ela.

Um ponto a ser destacado que o Olly, ao abrir um executvel para anlise, diferentemente
do IDA, coloca o programa em execuo e pausa a execuo na primeira instruo a ser
executada. Isto significa que o programa vai estar carregado em memria, pronto para ser
executado. Qualquer ao errada por parte do analista pode colocar o programa em exe-
cuo, e comprometer a mquina, por isso tome cuidado.

Conhecendo o OllyDBG
Ao abrir um programa para anlise, esta a janela principal do Olly (Figura 3.5). Basica-
mente nessa tela esto as principais informaes que o analista precisa saber durante a
anlise. Outras janelas podem ser abertas atravs do menu View.

Janela principal da CPU:

Toolbar
Captulo 3 - Introduo ao IDA Pro e OllyDBG

Janela de Janela de
Disassembly registradores

Janela de
mensagens

Janela de Janela de
memria Stack de
chamadas
Figura 3.5
OllyDBG.

29
Na parte superior, h uma pequena toolbar, com botes para abrir novas janelas e para a
execuo controlada do programa.

Abaixo, esquerda, temos a janela de disassembly, dividida em colunas. Da esquerda


para a direita:

11 Endereo da instruo;

11 Bytes relativos instruo;

11 Instrues assembly e parmetros;

11 Comentrios, referncias, tipos de parmetros etc.

direita da janela de disassembly, temos a primeira mudana em relao ao IDA. Nesta tela,
pelo fato do programa ser colocado em modo de execuo pelo Olly, ele pode mostrar o
estado atual dos registradores e flags da CPU. Isto s possvel durante a execuo. reco-
mendada a pesquisa na seo de ajuda do Olly para saber o significado de cada um desses
campos. importante conhecer bem pelo menos os registradores (nove primeiros valores
no topo dessa janela) e as flags da CPU (CPAZSTDO, a seguir na janela), pois so importantes
durante a anlise.

Abaixo da janela de disassembly, h uma pequena janela de mensagens, que serve tambm
para mostrar o estado de variveis monitoradas (watches). Abaixo, a representao da
rea de memria do programa. Atravs dessa janela, possvel navegar na memria do
programa em tempo real. Isto importante para monitorar reas de memria que estejam
sendo modificadas pelo programa durante a execuo.

direita, uma rea representa o Stack de chamadas do programa. Outra informao impor-
tante a estrutura de Structured Exception Handling (SEH), que ser vista adiante.

Exerccio de fixao 2 e
OllyDGB
Como o OllyDBG armazena as informaes obtidas durante a anlise?

Funcionalidades do OllyDBG
Mdulos principais: q
11 Disassembly comentvel.

11 Enumerao de argumentos.

11 Registradores de CPU.
Engenharia Reversa de Cdigo Malicioso

11 Pilha da CPU.

11 Dump da memria.

11 Janela de log.

11 Pilha de chamada.

11 Mdulos executveis.

11 Mapa de memria.

11 Threads.

11 Breakpoints.

11 Bookmarks.

30
11 Cadeia de SEH. q
11 Expresses monitoradas.

11 Handles.

11 Plugins.

11 Call Stack Graph.

Abra o arquivo \Desktop\Exemplos\Sessao 3\mal.Down.nopack.worm.exe novamente,


para usar como exemplo.

Os sete primeiros itens da lista acima so as janelas padro mostradas na tela principal.
Aqui, como no IDA, o disassembly pode ser comentado, tanto automaticamente pelo Olly,
como manualmente pelo usurio.

Sempre que possvel, o Olly tenta tambm identificar parmetros e anot-los no disassembly,
como pode ser visto nas chamadas ao WinExec no incio do programa.

O log pode ser acessado clicando-se no boto L na toolbar.

Os mdulos executveis so todas as DLLs e demais executveis usados pelo programa.


Podem ser acessados clicando no boto E na toolbar.

O mapa de memria, que mostra a estrutura das sees do programa na memria, pode ser
acessado com o boto M.

Os threads criados pelo programa podem ser vistos com o boto T.

Os breakpoints marcados no programa, para controlar a execuo do mesmo, podem ser


vistos clicando-se no boto B.

Os bookmarks so marcaes feitas pelo analista para relembrar de posies importantes


no cdigo. Eles podem ser acessados atravs do plugin Bookmarks (Plugins g Bookmarks
g Bookmarks).

A cadeia de Exception Handling pode ser vista clicando-se em View->SEH chain.

Expresses monitoradas podem ser visualizadas na janela de log da tela principal, ou na tela
de watches acessvel pelo menu View g Watches.

Os handles mostram os arquivos mantidos abertos pelo programa, incluindo arquivos


normais, diretrios, pipes, sockets, conexes de rede etc. Eles podem ser acessados pelo
boto H na toolbar.

Os plugins instalados nesta verso do Olly incluem no somente os padres, mas tambm
Captulo 3 - Introduo ao IDA Pro e OllyDBG

um grande conjunto de plugins encontrados na internet em sites especializados no Olly.

Um plugin interessante o plugin OllyFlow, capaz de gerar diversos grficos, como no IDA.
Mas alm dos tipos de grfico do IDA, um tipo especial que o Olly disponibiliza o Call Stack
Graph. Este grfico mostra as modificaes feitas no Stack de uma funo para enviar par-
metros a ela, isto , com ele possvel descobrir rapidamente quais instrues no cdigo
foram usadas para passar parmetros uma funo.

Plugins
O OllyDBG tem um suporte excelente a plugins: q
11 OllyDump

31
11 OllyScript q
11 OllyFlow

11 Hide Debugger

11 Heap Vis

11 Breakpoint Manager

O suporte a plugins do Olly muito bom, sendo que diversos esto instalados na verso
distribuda na mquina virtual:

11 OllyDump: exporta o processo atual para disco, reconstruindo a IAT;

11 OllyScript: permite a execuo de scripts externos;

11 OllyFlow: gera grficos de funes, como no IDA Pro;

11 Hide Debugger: implementa diversas funes para esconder o OllyDBG do programa analisado;

11 Heap Vis: enumera e procura por heaps do processo atual;

11 Breakpoint Manager: importa e exporta marcaes de breakpoint.

A lista acima mostra apenas alguns dos plugins disponveis. O OllyDump um plugin impor-
tante, pois permite copiar para disco a imagem de um programa em memria. Muitas vezes,
os programas maliciosos so compactados ou criptografados, e fica impossvel analis-los
diretamente. Neste caso, necessrio executar o programa dentro de um ambiente contro-
lado, e aps a rotina de descompactao/decriptografia, usar o plugin OllyDump para copiar
o novo executvel em memria para o disco. Adiante veremos como usar essa funcionali-
dade para descompactar um programa desconhecido.

O OllyScript o plugin que permite a execuo de scripts externos para executar diversas
funes. Juntamente com a distribuio do Olly, encontraremos centenas de scripts para
descompactar ou desproteger alguns tipos de sistema de proteo comumente usados por
programas maliciosos, em \Desktop\Install\OllyDbg\OllyScripts\.

Atalhos
11 F9: executa o programa atual. q
11 CTRL+F9: executa at retornar.

11 ALT+F9: executa at cdigo de usurio.

11 F12: pausa.

11 F7: step into.

11 F8: step over.

11 F2: marca/apaga breakpoint.


Engenharia Reversa de Cdigo Malicioso

11 CTRL+G: vai para endereo.

11 Qualquer tecla: modifica assembly.

11 : (dois pontos): adiciona label.

11 ; (ponto e vrgula): adiciona comentrio.

11 CTRL+F7: animate.

11 ENTER: segue um jump.

Aqui esto alguns atalhos teis durante o uso do OllyDBG. O Help do programa disponibiliza
uma lista completa de atalhos, alm de algumas funes interessantes.

32
Roteiro de Atividades 3
Atividade 3.1 Signatures e Type Library
O objetivo desta atividade verificar como o reconhecimento correto do compilador usado
pode auxiliar na anlise. Como exemplo, utilizaremos o mesmo programa malicioso dos
exemplos anteriores: \Desktop\Exemplos\Sessao 3\mal.Down.nopack.worm.exe.

1. Com o arquivo \Desktop\Exemplos\Sessao 3\mal.Down.nopack.worm.exe aberto,


examine a barra de navegao para verificar o que foi reconhecido. Examinando as
strings, podemos ver algumas referncias ao Borland Delphi no cdigo do programa.

2. Abra a janela Type Libraries (View g Open Subviews g Type Libraries), observando que
o compilador identificado vc6win.

3. Abra a janela Signatures (View g Open Subviews g Signatures) e adicione as assinaturas


que julgar pertinentes, observando aquelas que identificam funes de bibliotecas.

Observe que as partes azuis representam quase a totalidade do cdigo, e devem ser anali-
sadas, pois representam funes desconhecidas.

Ao adicionar as assinaturas, perceba que enquanto elas forem aplicadas ao cdigo, a janela
vai indicar quantas funes so reconhecidas pelas assinaturas. Ao mesmo tempo, a barra
de navegao vai mostrar as funes identificadas como pertencendo a uma biblioteca,
mudando as cores de azul escuro para azul claro.

Pesquise na internet o modo como essas assinaturas so criadas, e outras vantagens


existentes no uso de assinaturas. Faa um relatrio descrevendo as pginas que encontrar
sobre o assunto, explicando a razo de terem sido consideradas interessantes.

Captulo 3 - Roteiro de Atividades

33
Atividade 3.2 IDA Pro
Abra o arquivo \Desktop\malware\mal.Down.nopack.winlogin.exe no IDA Pro, navegue pelas
funcionalidades que acabamos de estudar no mdulo terico e responda as seguintes questes:

1. Na janela de funes exportadas existe alguma funo? Caso positivo, qual o endereo
desta funo?

2. Navegue pela janela de strings e encontre a string task32.exe. Qual o endereo da


funo que faz referncia a esta string?

Atividade 3.3 OllyDBG


1. Abra \Desktop\Exemplos\Sesso 3 \mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dat;

2. V para 0x50EDB6h (Control+g) e marque um breakpoint (F2);

3. Encontre o endereo de memria onde o binrio vai ser descompactado, e v para este
endereo no dump de memria (Control+g);

4. Execute com F9 at breakpoint;

5. CTRL+F7 para executar Animate;

6. Clique no boto de Pause (||) para parar ou no boto << para restaurar o programa para
o estado inicial.

Nesta atividade, conheceremos uma funcionalidade interessante do Olly, e comearemos a


entender o processo de anlise de um binrio suspeito.

O arquivo que usaremos como exemplo \Desktop\Exemplos\Sesso 3\mal.upx.6dddd7e8


e5ff88a15b7884a833ff893b.dat. Este arquivo est compactado com UPX, um compactador
muito popular em arquivos maliciosos. Este compactador instala uma rotina de descom-
pactao em uma rea no usada pelo programa, e modifica o entry point do programa para
realizar um desvio para essa funo assim que o programa iniciado. Esta rotina de des-
compactao grava o programa descompactado em outra rea de memria, j reservada no
cabealho do executvel para esta finalidade.

Veja o arquivo \Desktop\Install\Unpacking\OpenRCE UPX Notes.txt para consultar um


Engenharia Reversa de Cdigo Malicioso

pequeno roteiro de como descompactar arquivos UPX.

34
De acordo com o arquivo TXT indicado acima, um arquivo compactado com UPX tem no seu
entry point o seguinte contedo:

60 PUSHAD

BE [4 Bytes] MOV ESI, [ADDRESS]

8DBE [4 bytes] LEA EDI, DWORD PTR DS:[ESI+Value]

57 PUSH EDI

83CD FF OR EBP, FFFFFFFF

EB 10 JMP SHORT [Relative Jump]

90 NOP

Leia o documento descrevendo o funcionamento do compactador UPX e tente descobrir o


endereo de memria que deve monitorar para ver o cdigo descompactado.

Agora veremos o OllyDBG executando cada linha do cdigo (uma a uma), de forma animada
(uma instruo a cada 0,25 segundos, aproximadamente), e ao mesmo tempo, as modifica-
es sendo gravadas na memria na posio indicada.

Pressione F9 para executar o programa at o breakpoint marcado. Aps isso, basta pres-
sionar Control+F7 para iniciar a animao. O aluno poder acompanhar a descompactao
dos bytes do programa pela rea de memria descoberta. Esta funcionalidade muito til
durante a anlise de um binrio desconhecido, para a identificao de partes do cdigo
executadas em um loop.

Captulo 3 - Roteiro de Atividades

35
36
Engenharia Reversa de Cdigo Malicioso
4
Formato de arquivos executveis
objetivos

Apresentar o formato PE e mostrar como extrair informaes relevantes das sees,


tabela de importao e cabealhos para a anlise esttica do arquivo.

conceitos
Formato e cabealho PE, tabela de importao, cabealho de seo.

Exerccio de fixao 1 e
Arquivos executveis
Todo arquivo binrio um arquivo executvel? E todo arquivo executvel um arquivo binrio?

Formato de arquivos executveis


11 Para um programa ser executado em um sistema operacional, ele deve obedecer a q
certos formatos padronizados.

11 Dessa forma, o sistema sabe onde encontrar o cdigo, recursos, bibliotecas, e como
mapear tudo isso no espao de memria reservado ao programa.

11 Alguns formatos de executveis:

22 Portable Executable PE (Windows, DOS).

22 ELF (Linux, Unix).


Captulo 4 - Formato de arquivos executveis

22 ABI Mach-O (MacOS X).

Neste captulo, conheceremos um pouco sobre o formato usado por arquivos executveis.
Estudaremos rapidamente a estrutura do formato ELF do Linux, mas vamos nos concentrar
no formato PE, usado pelos executveis do Windows.

Um formato de arquivo executvel descreve a estrutura dos dados e cdigos de um pro-


grama, de forma a permitir ao sistema operacional identificar cada parte do programa,
alocando o espao necessrio em memria e mapeando a estrutura fsica do arquivo na
memria virtual, iniciando a execuo do programa a partir do ponto de entrada do cdigo.

Os formatos executveis descrevem ento como organizar a informao dentro de um


arquivo, descrevendo onde ficam as reas de cdigo, de recursos, as bibliotecas que devem

37
ser carregadas junto com o programa, o endereo inicial de execuo (entry point) e a quan-
tidade de memria que deve ser reservada ao programa, entre outras informaes.

Os formatos PE, ELF e ABI Mach-O descrevem como deve ser um executvel em ambientes
Windows, Linux/Unix e Mac OS X, respectivamente.

Exerccio de nivelamento 1 e
Execuo de cdigo
Em que campo est localizado o endereo do incio da execuo do cdigo?

Qual o cabealho que contm informaes relacionadas s sees do executvel?

Formato PE
11 Formato de arquivos Portable Executable (PE): q
22 A Microsoft baseou o formato PE no antigo formato COFF do Unix.

11 Por que portvel?

22 Suporta 32 bits e 64 bits.

22 Suporta arquiteturas MIPS, PowerPC, DEC Alpha e ARM.

11 Arquivos PE:

22 Extenso .exe ou .dll

O formato PE o principal formato de executveis usado em sistemas Windows. Ele foi


baseado no antigo formato COFF usado em verses mais antigas do Unix. Outros formatos
suportados no Windows so os formatos DOS (formato de executvel de 16 bits do antigo
DOS, reconhecido pela string MZ no comeo do arquivo), COM (executvel de 16 bits do
DOS com extenso COM) e NE (New Executable, formato usado pelo DOS Multitasking, que
usualmente pode ser executado como 32 bits).

O formato PE considerado portvel, pois pode ser utilizado tanto por arquivos de 32 bits como
de 64 bits, e pode ser executado sem modificaes em outras arquiteturas de processador,
como MIPS, PowerPC, DEC Alpha e ARM.

Uma caracterstica muito conhecida desse formato, e que causa muitos problemas para os
usurios mais leigos, que ele reconhecido pelo sistema operacional pela sua extenso,
que pode ser .EXE ou .DLL. Muitas vezes, um usurio malicioso disfara o fato de um pro-
Engenharia Reversa de Cdigo Malicioso

grama ser executvel, mudando sua extenso para outra que no seja EXE, ou adicionando
uma extenso extra, levando a vtima a acreditar que o programa no passa de um arquivo
comum, como por exemplo nomeando um arquivo como fotos.jpg.exe.

Estrutura do cabealho PE
11 Inicia com a assinatura PE: q
22 E_magic=4D5Ah MZ

11 Cabealho NT compreende o cabealho FILE e o OPTIONAL

22 Assinatura = 5045h PE

38
DOS MZ header

DOS stub

PE header

Section table

Section 1

Section 2

Section ...
Figura 4.1
Formato de
arquivos Portable Section n
Executable (PE).

A Figura 4.1 representa a estrutura do cabealho de um arquivo PE. A primeira coisa a se


notar a assinatura de um arquivo executvel. Em sistemas Windows, arquivos executveis
sempre comeam com a string MZ. Este fato permite identificar um arquivo executvel
mesmo que ele no esteja com a extenso certa, ou tambm identificar executveis embu-
tidos dentro de outros arquivos.

A seguir, temos o stub DOS, que o cdigo responsvel por imprimir a mensagem This
program cannot be run in DOS mode.

O campo a seguir o cabealho NT ou cabealho PE propriamente. Ele sempre iniciado


pela string PE. nele que ficam contidas as informaes sobre o executvel, incluindo
endereo do entry point, endereo das tabelas de importao e exportao, nmero de
sees, entre outras informaes.

A ltima parte do cabealho PE descreve as sees existentes no binrio. Cada descrio


contm o nome da seo, tamanho real (em disco) e virtual (em memria), realocaes (se
forem necessrias), atributos da seo (leitura/escrita, executvel, contm cdigo etc).

Estas caractersticas permitem ao analista identificar alguns casos onde o binrio foi
modificado, como por exemplo, se foi usado um compactador. Estes programas costumam
compactar somente as sees de cdigo, e criam sees extras para armazenar o cdigo
descompactado. Estas sees extras geralmente tm tamanho 0 em disco, e um tamanho
virtual grande o suficiente para armazenar o cdigo descompactado. Outras caractersticas
Captulo 4 - Formato de arquivos executveis

dessas sees vazias que elas geralmente tm o atributo de execuo setado, pois aps a
descompactao, o controle do programa passar ao cdigo armazenado ali.

39
00500000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ....... ..
00500010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 .......@.......
00500020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00500030 00 00 00 00 00 00 00 00 00 00 00 00 DB 00 00 00 ...............
00500040 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 ..!OL!Th
00500050 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F is program canno
00500060 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 t be run in DOS
00500070 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 mode....$.......
00500080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00500090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
005000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
005000B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
005000C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
005000D0 00 00 00 00 00 00 00 00 50 45 00 00 4C 01 03 00 ........PE..LO.
005000E0 00 00 00 00 00 00 00 00 00 00 00 00 E0 00 0F 01 .............O
005000F0 0B 01 07 00 00 60 00 00 00 10 00 00 00 80 00 00 ..............
00500100 00 ED 00 00 00 90 00 00 00 F0 00 00 00 00 50 00 ...........P.
00500110 00 10 00 00 00 02 00 00 04 00 00 00 00 00 00 00 ..............
00500120 04 00 00 00 00 00 00 00 00 00 01 00 00 10 00 00 ..............
00500130 00 00 00 00 02 00 00 00 00 00 10 00 00 10 00 00 .............
00500140 00 00 10 00 00 10 00 00 00 00 00 00 10 00 00 00 .............
00500150 00 00 00 00 00 00 00 00 14 F5 00 00 30 01 00 00 ........J..O..
00500160 00 F0 00 00 14 05 00 00 00 00 00 00 00 00 00 00 .............
00500170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00500180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00500190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
005001A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
005001B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
005001C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
005001D0 55 50 58 30 00 00 00 00 00 00 00 00 00 10 00 00 UPX0..........
005001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
005001F0 00 00 00 00 80 00 00 E0 55 50 58 31 00 00 00 00 ......UPX1....
00500200 00 60 00 00 00 90 00 00 00 60 00 00 00 04 00 00 ....+..........
00500210 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 E0 ............@..
00500220 2E 72 73 72 63 00 00 00 00 10 00 00 00 F0 00 00 .rsrc.........
00500230 00 08 00 00 00 64 00 00 00 00 00 00 00 00 00 00 ....d..........
00500240 00 00 00 00 40 00 00 C0 00 00 00 00 00 00 00 00 ....@..........
00500250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

DOS EXE Signature


Engenharia Reversa de Cdigo Malicioso

DOS Header
Oset to PE Signature
PE Header
Section Description

Na Figura 4.2 podemos ver como se parece o incio de um arquivo PE quando visto em um Figura 4.2
editor hexadecimal. Podemos ver a assinatura de arquivo executvel MZ logo no comeo Arquivo PE quando
visto em um editor
do dump, seguida pelo cabealho DOS. O campo em vermelho indica o Offset, a partir do hexadecimal.
comeo do arquivo, do incio do cabealho PE. Logo aps est o stub DOS com a mensagem
impressa quando o programa executado em DOS.

40
O cabealho PE inicia com a string PE e no fim vemos a regio que descreve as sees do
programa. Neste caso podemos notar pelas sees que se trata de um arquivo compactado
com o compactador UPX, um programa muito utilizado para compactao de executveis de
programas maliciosos.

Cabealhos do formato PE
11 Cabealhos DOS e NT: q
22 O arquivo PE comea com o stub DOS, usualmente responsvel pela mensagem
This program cannot be run in DOS mode, e por apontar para o cabealho NT
(Offset to PE signature).

11 So necessrias no mnimo duas sees em um arquivo PE: uma para dados e uma
para cdigo.

22 Podem existir mais sees, dependendo do tipo de arquivo, sendo as mais comuns:

33 .text: cdigo executvel.

33 .data, .rdata ou .bss: dados.

33 .rsrc: seo de recursos.

33 .idata, .edata: importao e exportao de funes.

Como vimos, o cabealho de um arquivo PE est dividido em trs partes:

11 Cabealho DOS, responsvel por imprimir a mensagem quando o arquivo executado


em DOS, e por indicar o offset do cabealho PE;

11 O prprio cabealho PE;

11 Os cabealhos de seo, que descrevem as caractersticas das sesses existentes.

A seguir so mostrados alguns exemplos de sees padro que podem existir em um exe-
cutvel. Muitas vezes, quando um binrio compactado ou criptografado com um compac-
tador de executveis, ele pode modificar o nmero ou alguma caracterstica das sesses, e
por isso voc deve ficar atento a essas informaes quando for analisar um arquivo.

Sees mais comuns:

11 .text cdigo executvel;

11 .data, .rdata ou .bss dados; normalmente BSS usado para armazenar dados dinmicos
durante a execuo, por exemplo na descompactao do binrio.

11 .rsrc seo de recursos; programas maliciosos costumam guardar parte do cdigo ou


tabelas de importao aqui, para dificultar a anlise dos binrios.
Captulo 4 - Formato de arquivos executveis

11 . idata, .edata importao e exportao de funes.

11 Cabealhos NT: cabealho de arquivo. q


22 Primeiro cabealho NT, logo aps a assinatura PE.

11 Contm alguns campos interessantes:

22 Machine: indica o tipo de arquitetura.

22 NumberOfSections: o nmero de sees no executvel.

22 TimeDateStamp: no crtico, mas pode indicar a data em que o arquivo foi criado.

22 SizeOfOptionalHeader: indica o tamanho exato do cabealho opcional.

41
A primeira parte do cabealho NT descreve caractersticas gerais do binrio, como tipo
de arquitetura para o qual ele foi compilado, nmero de sees existentes, timestamp da
criao do arquivo e tamanho do cabealho PE.

O timestamp existente aqui pode ser uma indicao de quando o binrio foi compilado, e por
isso os autores dos programas maliciosos costumam zerar esse valor, para apagar seus rastros.

O tamanho do cabealho opcional indica o tamanho em bytes do restante do cabealho,


a partir da assinatura PE, at o incio dos cabealhos de sees.

11 Cabealho NT: cabealho Optional. q


11 Assinatura = 10 Bh (magic number PE32)

11 AddressOfEntryPoint: endereo de incio da execuo.

22 possvel que outros cdigos sejam executados antes do ponto de entrada.

11 ImageBase: endereo usado como base para todos os endereos relativos no cdigo.

22 possvel algumas vezes encontrar o cabealho PE neste endereo na memria.

11 SizeOfHeaders: indica o tamanho do cabealho completo, a partir do incio do


arquivo, inclusive dos cabealhos de sees.

11 SectionAlignment: alinhamento das sees na memria.

11 FileAlignment: alinhamento das sees no disco.

No cabealho opcional esto localizadas a maioria das informaes sobre o executvel.


Um dos principais campos desse cabealho o endereo do entry point do programa. Este
o endereo da primeira instruo que ser executada aps o programa ser carregado na
memria. Ou pelo menos, esta a descrio oficial do formato PE.

Durante a anlise de um programa malicioso o analista deve tomar muito cuidado, pois
existem casos onde um cdigo pode ser executado ANTES do sistema transferir o controle
de execuo para a instruo no entry point, ou antes do debugger paralisar a execuo
do programa. Em captulo posterior, analisaremos exemplos destes casos, mas por ora
devemos apenas ficar conscientes de que mesmo executando o programa em um ambiente
controlado, no se deve jamais confiar que o sistema est seguro e que o programa mali-
cioso no foi executado.

Seguindo com a descrio dos campos mais importantes do cabealho opcional, a seguir
temos o campo que indica o endereo base a partir do qual os offsets fazem referncia na
imagem. neste endereo que a imagem do programa ser carregada na memria virtual,
e onde podemos encontrar o incio do cabealho PE do programa carregado. possvel
conferir isso, examinando no Olly o valor indicado em ImageBase e depois procurando pelo
endereo do incio do cabealho do executvel.
Engenharia Reversa de Cdigo Malicioso

O campo SizeOfHeaders indica o tamanho completo dos cabealhos incluindo os cabealhos


de sees.

Os campos que indicam o alinhamento das sees permitem descobrir quanto de espao
deve realmente existir entre as sees. Em casos raros, um programa malicioso pode utilizar
esse espao entre sees para armazenar dados ou cdigo. Por exemplo, se uma seo tem
500 bytes e o alinhamento de sees 1000, a prxima seo s ir comear a partir do
endereo 1000, e no do endereo 500.

42
11 Cabealho NT: Cabealho Optional. q
22 Export Table Address/Size.

33 Indica o endereo da tabela de exportao; normalmente usada em DLLs.

22 Import Table Address/Size.

33 Indica o endereo da tabela de importao.

22 Resource Table Address/Size.

33 Endereo da rea de recursos, onde so armazenados cones, imagens, strings etc.

22 TLS Table Address/Size.

33 Endereo da tabela de chamadas da Thread Local Storage.

Abaixo esto descritas algumas das principais tabelas existentes no cabealho PE. Essas
tabelas so as mais importantes durante a anlise de um binrio malicioso:

11 Export Table Address/Size: indica o endereo da tabela de exportao; normalmente


usada em DLLs.

11 Import Table Address/Size: indica o endereo da tabela de importao. Se o offset


indicar um endereo fora da rea de cdigo, pode significar que o binrio foi modificado
para dificultar a anlise. A tabela de importao indica as DLLs e funes delas que o
programa utilizar, e por isso muitas vezes o autor do programa modifica a localizao da
tabela, para dificultar a anlise.

11 Resource Table Address/Size: endereo da rea de recursos, onde so armazenados


cones, imagens, strings etc. Pode tambm conter cdigo ou a tabela de importao em
binrios modificados. A tabela de recursos indica como esto organizados os recursos
dentro da seo destinada a eles. A seo de recursos normalmente usada por autores
de programas maliciosos para armazenar cdigo ou dados do programa.

11 TLS Table Address/Size: endereo da tabela de chamadas da Thread Local Storage.


Esta tabela pode indicar funes que sero executadas antes do entry point do programa.
A tabela de chamadas do TLS (Thread Local Storage) serve normalmente para guardar
informaes relativas aos threads criados pelo programa, mas devido a sua caracters-
tica de ser possvel criar funes de chamada a TLSs executadas antes do entry point do
programa, elas so usadas para execuo de cdigo malicioso, como por exemplo uma
funo para descompactar ou decriptografar cdigo, ou mesmo infectar o sistema se o
programa for carregado em um debugger.

Tabela de importao
Captulo 4 - Formato de arquivos executveis

11 A funo primria da Tabela de Endereos de Importao (IAT) prover informaes q


para o loader do sistema localizar as funes de API e outros smbolos utilizados por
um executvel.

11 Pode tambm prover informaes sobre as aes que um executvel pode tomar.

11 Ocultar ou obfuscar a IAT uma tcnica comumente utilizada por arquivos maliciosos.

11 A IAT pode ser reconstruda por diversas ferramentas.

A Tabela de Endereos de Importao (Instruction Address Table, ou IAT), usada pelo


sistema para saber as DLLs que o programa precisa para funcionar, e as funes dessas
DLLs que sero utilizadas.

43
Estas informaes podem ser teis para a identificao do tipo de comportamento que o
programa pode ter. Por isso, normalmente a IAT modificada ou obfuscada pelos autores
de programas maliciosos, dificultando o trabalho de anlise do programa, mas no o impede
de funcionar corretamente. Em alguns casos, o prprio cdigo do programa carrega dinami-
camente as DLLs e funes que vai utilizar. Isso pode ser notado em um programa malicioso,
pois as nicas funes que ele vai importar sero KERNEL32.LoadLibraryA e KERNEL32.
GetProcAddress.

Essas duas funes so utilizadas para carregar uma DLL em memria, e descobrir o ende-
reo base da mesma, a partir do qual o programa poder acessar as funes que precisar.

Mesmo assim, existem diversas ferramentas que podem ser usadas para recriar a tabela de
importao e descobrir as funes que o programa utiliza. Veremos um exemplo disso em
captulo posterior.

Cabealho de seo
11 VirtualSize: tamanho da seo quando carregada na memria. q
22 Pode ser maior que SizeOfRawData, e neste caso ser preenchida com zeros.

11 VirtualAddress: endereo da seo na memria, relativo a ImageBase.

11 SizeOfRawData: tamanho da seo no disco.

11 PointerToRawData: offset no arquivo do contedo da seo a ser carregado na memria.

11 Characteristics: contm flags como execuo, leitura e escrita, entre outras.

A ltima parte do cabealho de um executvel descreve as sees existentes, onde ficam


armazenados os cdigos e dados do programa. Existem dois estados para uma seo:

11 Estado fsico: modo da seo no arquivo fsico gravado no disco.

11 Estado virtual: modo como a seo vai ser mapeada em memria.

Existem casos em que o tamanho da seo em disco nulo, e quando a seo carregada
em memria, fica com um tamanho maior. Isto pode ser usado, por exemplo, para indicar
uma seo onde sero armazenados dados dinmicos do programa.

11 VirtualSize e VirtualAddress campos que indicam o tamanho e o offset em que ser


carregada a seo a partir do ImageBase.

11 SizeOfRawData indica o tamanho real da seo em disco.

11 PointerToRawData define o offset onde a seo est armazenada a partir do incio


do arquivo.

11 Characteristics campo que indica os atributos da seo, como por exemplo


UNINITIALIZED_DATA, EXECUTE, READ, WRITE, entre outros.
Engenharia Reversa de Cdigo Malicioso

44
Roteiro de Atividades 4
Atividade 4.1 Navegando pela estrutura de um arquivo PE
1. Execute o OllyDBG;

2. Abra o arquivo:
\Desktop\Exemplos\Sessao 4\mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dat

3. Abra a Janela de Memria (Alt-M ou boto M na barra de ferramentas);

4. Identifique a rea de memria do programa, e clique duas vezes sobre o item PE Header;

5. Examine as estruturas dos cabealhos DOS e NT. Voc pode alternar entre visualizao no
formato de cabealho e no formato hexadecimal, clicando com o boto direito e escolhendo
Special->PE Header ou Hex->Hex/ASCII (16 bytes);

6. Faa uma lista dos campos que considera mais importantes durante a anlise;

7. Mantenha o Olly DBG aberto para acompanhar o mdulo terico, acompanhando no


arquivo os campos explicados pelo instrutor.

Atividade 4.2 Examinando arquivos PE


1. Examine os arquivos em \Desktop\malware\, utilizando o LordPE e o OllyDBG;

2. Navegue pelas informaes de cabealho dos executveis;

3. Procure por inconsistncias nos campos do cabealho que possam dificultar a anlise ou
indiquem comportamento malicioso ou suspeito;

4. Discuta alguns casos encontrados pela turma que tenham dificultado a anlise do programa;

5. Pesquise na internet problemas e solues relacionadas a mudanas na estrutura de


arquivos executveis;

6. Faa um relatrio descrevendo os arquivos analisados e as inconsistncias encontradas,


indicando se elas dificultaram a anlise do arquivo e possveis solues para contornar os
problemas. Complemente o relatrio com as informaes encontradas na internet.

Captulo 4 - Roteiro de Atividades

45
Para mais informaes sobre o formato PE, consulte os arquivos:

11 \Desktop\PE File Format - A Reverse Engineers View.pdf

11 \Desktop\PE Format Poster.pdf


Engenharia Reversa de Cdigo Malicioso

46
5
Assembly bsico parte 1
objetivos

Apresentar a linguagem assembly e seus pontos principais, como anlise de stack


e anlise de memria, para extrair o mximo de informaes em uma anlise
de cdigo malicioso.

conceitos
Assembly, registradores, stack, mapeamento de memria, structured
exception handling.

Exerccio de fixao 1 e
Assembly
Por que devemos entender o assembly para trabalhar com engenharia reversa?

Exerccio de nivelamento 1 e
Identificao de parmetros
Qual o registrador responsvel por armazenar o endereo do topo da pilha?

A partir de um endereamento baseado em EBP, como podemos identificar os parmetros


passados e as variveis locais definidas em uma funo?
Captulo 5 - Assembly bsico parte 1

Assembly bsico
Para fazer a engenharia reversa de um programa, necessrio saber um pouco de q
assembly. No tem como escapar. Vamos comear pelo bsico:

11 Os componentes principais da arquitetura x86 so CPU, memria, registradores e disco.

11 A CPU recupera uma instruo, decodifica e executa.

11 Uma aplicao implementada como uma sequncia de instrues assembly.

47
A partir desse captulo comearemos a estudar o assembly em um nvel bsico.
Para esta parte do curso, importante ter um conhecimento mnimo de assembly
e do funcionamento do sistema operacional no nvel de cdigo de mquina.

No est no escopo deste curso ensinar tudo sobre a linguagem; o conhecimento mnimo
dela pr-requisito para o curso, mas somente relembraremos alguns conceitos teis
durante a anlise de programas maliciosos.

Primeiro, devemos relembrar os componentes macro de um processador: CPU, memria,


registradores e disco.

A CPU processa as instrues de um programa, lendo cada instruo a partir da memria


principal para uma memria interna CPU (cache), decodificando-a e executando-a. Para
isso, utiliza registradores, que so reas de memria internas CPU, para armazenar dados
necessrios execuo da instruo. Os programas so armazenados em disco, e dele so
lidos atravs de instrues de acesso a dispositivos fsicos do sistema operacional.

Um programa implementado como uma sequncia de instrues assembly. Mas como


veremos daqui para a frente, essa sequncia nem sempre muito clara.

11 As instrues podem: q
22 Referenciar ou manipular posies de memria.

22 Fazer clculos.

22 Controlar o fluxo do programa.

22 Controlar a entrada e sada de dados.

11 Uma nica linha de cdigo de alto nvel convertida em diversas instrues assembly.

importante lembrar que essas instrues so de baixo nvel, isto , perfazem as aes
mais simples. Por isso, uma nica linha de cdigo em linguagem de alto nvel, como C por
exemplo, pode se transformar em diversas linhas em assembly.

HelloWorld proc near Figura 5.1


var_8= dword ptr -8 Comparao de
linha de cdigo em
var_4= dword ptr -4
linguagem de alto
push ebp nvel com assembly.
mov ebp, esp
sub esp, 8
and esp, 0FFFFFFF0h
mov eax, 0
add eax, 0Fh
Engenharia Reversa de Cdigo Malicioso

int main () { add eax, 0Fh


printf("Hello World"); shr eax, 4
}
shl eax, 4
mov [ebp+var_4], eax
mov eax, [ebp+var_4]
call sub_401088
call __main
mov [esp+8+var_8], oset aHelloWorld ; "Hello World"
call printf
leave
retn
HelloWorld endp

48
Este cdigo foi complicado com o Cygwin GCC, com diversas funes extras de inicializao
inseridas pelo compilador. Outros compiladores poderiam adicionar outros tipos de
cdigo. Esta uma caracterstica importante durante a anlise, pois possvel reconhecer
o tipo de compilador usado apenas estudando as funes de inicializao adicionadas ao
cdigo do usurio.

No exemplo, vemos que um simples cdigo Hello World pode se transformar em funes e
instrues diversas.

O arquivo no IDA Pro est disponvel no diretrio \Desktop\Sessao 5\HelloWorld.exe.

Registradores
11 Registradores so reas de memria reservadas para uso pela CPU. q
11 Existem oito registradores de uso geral em plataformas x86 de 32 bits, cada um
tambm com 32 bits.

11 O acesso aos registradores muito rpido.

22 Como o acesso rpido e eles so limitados, os compiladores tentam utiliz-los de


forma eficiente.

22 Isso se torna um fator importante durante a anlise.

Durante a execuo de uma instruo, a CPU precisa armazenar dados que possam ser
necessrios para execut-la. A CPU no tem acesso direto memria da mquina, e por-
tanto precisa utilizar uma memria interna para isso. Por exemplo, para copiar dados de
uma posio de memria para outra, a CPU precisa copiar cada byte da posio de memria
de origem, para dentro da memria da CPU, e depois para a posio de memria de destino.

Estas reas de memria interna so os registradores. Existem oito registradores de uso geral em
processadores de 32 bits, e cada registrador tem 32 bits de espao para armazenar informaes.

Em plataformas x64 temos os registradores de 64 bits que alm dos registradores de uso geral
existentes na plataforma 32 bits existem mais 8 registradores de R8 at R15. Os registradores j
existentes na plataforma x86 so acessados como: RAX, RBX, RCX, RDX, RSI, RDI, RBP e RSP.

Os registradores especiais possuem uma forma especial para acesso aos contedos de
32 bits, 16 bits e 8 bits. Por exemplo, o registrador R8 acessa o seu contedo 64 bits, para
acessar o seu respectivo DWORD (32 bits) utilizamos R8D, para acessar o WORD (16 bits)
utilizamos R8W e para acessar os 8 bits utilizamos R8L.

O ponteiro de instruo (EIP na plataforma 32 bits) tambm recebeu seu equivalente 64 bits
que acessado como RIP.

Como esses registradores esto localizados dentro da CPU, o acesso a eles muito rpido.
Captulo 5 - Assembly bsico parte 1

Devido ao fato de estarem em nmero restrito, o uso dos compiladores precisa ser otimi-
zado. Dessa forma, ao analisar um programa, poderemos entender o que se passa quando
um registrador usado para realizar operaes distintas, e como a CPU faz para no perder
as informaes armazenadas em um registrador quando precisar us-lo para outro fim.

Registradores de uso geral na arquitetura x86: q


11 EAX: acumulador, voltil, utilizado para retorno de valores de funes.

11 EBX: no voltil, utilizado para endereamento indireto.

11 ECX: utilizado em contadores e funes de loop, voltil.

11 EDX: voltil, de uso geral.

49
8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits

RAX

EAX

AX Tabela 5.2
Organizao de um
AH AL
registrador.

A Tabela 5.2 de um grfico que mostra como est organizado um registrador. importante
notar que um mesmo registrador pode ser acessado por diversos nomes em um programa.
Cada nomenclatura indica o tamanho do dado que queremos acessar, mas todos eles se
referem ao mesmo registrador. Olhando a figura, vemos que o mesmo registrador RAX (64 bits)
pode ser acessado como EAX (32 bits), AX (16 bits) e AH e AL se referem aos 8 bits mais significa-
tivos e 8 bits menos significativos, respectivamente, do registrador AX.

importante ter esse conceito bem entendido, pois isso se torna importante durante a
anlise e quase sempre motivo de confuso. Se temos um registrador EAX, por exemplo,
com valor 0x09ABCD01, e executamos uma operao que zere o contedo de AL, o regis-
trador EAX ter seu valor modificado para 0x09ABCD00, pois AL se refere a uma posio do
registrador EAX.

Tendo isso em mente, veremos que normalmente os compiladores usam determinados


registradores para algumas funes comuns. Por exemplo, EAX geralmente usado como
acumulador para instrues, ou para retorno de funes.

EBX costuma ser usado para endereamento indireto de dados, ECX em contadores e
funes de loop, e EDX um registrador de uso geral.

Mesmo assim, em alguns casos o compilador pode precisar de mais de um registrador para
executar uma instruo, e pode us-los de forma diferente da descrita acima.

Registradores de uso geral: q


11 ESI

22 Armazena dados de origem em operaes com strings (no voltil).

11 EDI

22 Armazena dados de destino em operaes com strings (no voltil).

11 ESP/EBP

22 Ponteiro do Stack (voltil) / ponteiro de frame (no voltil).

11 EIP

22 Ponteiro de instruo, indica a prxima instruo a ser executada.


Engenharia Reversa de Cdigo Malicioso

Mais alguns registradores e seus usos mais comuns:

11 ESI e EDI: registradores normalmente usados em operaes que envolvem strings, como
origem e destino das mesmas, respectivamente.Normalmente, estes registradores
contm o endereo de memria onde as strings esto armazenadas, e as instrues vo
ler cada byte do endereo de origem e escrever no endereo de destino.

11 ESP e EBP: normalmente usados como apontadores do Stack e de frame.

11 EIP: usado para controlar o fluxo de execuo, apontando sempre para a instruo
seguinte que deve ser executada.

50
Voc pode examinar o funcionamento dos registradores abrindo o arquivo
\Desktop\Sessao 5\HelloWorld.exe, e executando passo a passo o programa com F7,
examinando a janela de registradores (alto direita) e do Stack (embaixo direita). Algumas
instrues modificam os valores dos registradores (MOV, ADD), e outras modificam o Stack
(PUSH xxx; SUB ESP,xxx). O Olly mostra em vermelho os registradores e flags que foram
modificados pela ltima instruo.

Stack
11 Estrutura de dados abstrata baseada em uma combinao de hardware e software. q
11 Utilizado para armazenar dados, em uma estrutura LIFO (Last In First Out).

22 Passagem de parmetros para funes.

22 Armazena endereos de retorno de chamadas.

22 No Windows, serve tambm para armazenar a Structured Exception Handling (SEH).

11 A instruo PUSH utilizada para colocar um valor de 32 bits no Stack.

11 A instruo POP remove um valor de 32 bits do Stack.

11 Dados podem ser acessados no Stack atravs de referncia indireta usando o


registrador EBP.

Entender o funcionamento do Stack fundamental para realizar uma anlise de qualquer


tipo de programa em nvel de cdigo de mquina. O Stack usado pela CPU para passar
parmetros a funes, armazenar endereos de retorno de chamadas, e outras estruturas
mais complexas como a Structured Exception Handling (SEH).

Ele funciona como uma estrutura LIFO, isto , o ltimo dado a ser colocado no Stack vai ser o
primeiro a sair. O Stack comparado a uma pilha de pratos, que cresce de baixo para cima.
O registrador ESP utilizado para apontar para o topo da pilha, e normalmente, quando um
programa precisa reservar espao de memria para um parmetro de funo, ele subtrai o
tamanho necessrio de ESP. Essa subtrao adiciona espao ao Stack. Para limpar o Stack,
deve-se somar o tamanho desejado a ESP, o que remover este tamanho do Stack.

Para gravar um dado de 32 bits na pilha, usamos a funo PUSH, e para remover esse dado,
usamos a funo POP.

Os dados tambm podem ser acessados atravs de referncia indireta usando o registrador
EBP, como mostrado no exemplo abaixo:

MOV EAX,DWORD PTR SS:[EBP-14]

Move para EAX o valor armazenado na posio 14 do Stack.

Layout de memria
Captulo 5 - Assembly bsico parte 1

Tabela 5.3 Espao na memria


Layout de memria
no Microsoft 232 = 4.294.967.296 bytes = 4 gigabytes disponveis
Windows.

Separao de memria: q
11 Sistemas baseados em Windows dividem estes 4 GB em duas partes: memria do
kernel e do usurio.

11 Cada processo v apenas seu prprio bloco de 2 GB.

11 Processos no podem sair de seu espao de memria.

51
11 Os endereos virtuais so divididos em pginas de 4096 bytes. q
11 O acesso memria feito no nvel de pginas.

O sistema operacional Windows, em sua verso de 32 bits, disponibiliza um total de 4 GB de


memria virtual para os aplicativos de kernel e de usurio. Cada processo v somente 2 GB
de memria virtual, que compartilhada entre todos os processos.

O compartilhamento ocorre atravs da paginao de memria, isto , cada processo v sua


memria como sendo de 2 GB contnuos em memria, mas o sistema organiza esses 2 GB
em pginas de 4096 bytes, e somente as pginas em uso de um processo ficam em memria.
Duas pginas no ocupam nunca o mesmo espao fsico na memria real, e assim o sistema
consegue fazer com que os processos compartilhem a memria fsica, sem que um tenha
acesso memria de outro. Este esquema permite que um processo tenha disponveis 2 GB
sempre, independente da memria fsica do computador. As pginas que no couberem na
memria fsica ficam armazenadas na partio de swap at que sejam necessrias.

11 No incio da execuo, a imagem do programa carregada na memria. q


11 As DLLs necessrias so carregadas.

11 As variveis de ambiente so mapeadas.

11 As pilhas do processo so iniciadas.

0x00000000 USER SPACE

0x00010000 Environment Variables

0x00030000 Heap

0x0012f000 Stack of Main Thread

0x00150000 Heap

0x00400000 Main Executable

0x00d8d0000 Stack of Main Thread 2

0x71ab0000 WS2_32.DLL

0x7c800000 KERNEL32.DLL

0x7c900000 NTDLL.DLL
Figura 5.4
Mapeamento de
0x7f000000
um processo na
Engenharia Reversa de Cdigo Malicioso

0x80000000 KERVEL SPACE memria.

Na Figura 5.4 podemos observar como o mapeamento de um processo nos 2 GB reservados


para ele. Podemos notar que o cdigo executvel do programa no carregado necessaria-
mente no incio da memria. O endereo onde ele carregado dentro da memria virtual
definido pelo seu atributo ImageBase de acordo com o que est determinado no cabealho do
executvel. Normalmente (mas nem sempre) esse endereo 0x00400000.

Podemos notar ainda que as variveis de ambiente so as primeiras a serem carregadas,


seguido do Heap e do Stack (normalmente disponvel a partir de 0x0012f000) do thread prin-
cipal do programa. Aps o executvel, existe um espao reservado aos Stacks dos threads
adicionais, e finalmente o espao reservado pelo programa s DLLs necessrias.

52
Durante o carregamento, essas estruturas so mapeadas em memria, as DLLs so carre-
gadas, as pilhas iniciadas e o programa comea sua execuo, com o controle passado ao
entry point.

Conhecer essa estrutura importante, principalmente se o analista se deparar com alguma


vulnerabilidade em um programa. Um tipo de vulnerabilidade muito explorada o estouro
de pilha, onde o atacante cria uma varivel com valor muito grande, que estoura o espao
reservado para o Stack, e acaba sobrescrevendo reas importantes de memria. Isto pode
causar o trmino inesperado do programa, ou a execuo de cdigo malicioso.

Address Size Owner Section Contains Type Access Initial Mapped as


00010000 00001000 Priv 00021004 RW RW
00020000 00001000 Priv 00021004 RW RW
0022D000 00001000 Priv 00021104 RW Guarded RW
0022E000 00002000 stack of main thread Priv 00021104 RW Guarded RW
00230000 00003000 Map 00041002 R R
00240000 00006000 Priv 00021004 RW RW
00340000 00006000 Priv 00021004 RW RW
00350000 00003000 Map 00041004 RW RW
00360000 00016000 Map 00041002 R R \Device\Harddi
00380000 0003D000 Map 00041002 R R \Device\Harddi
003C0000 00006000 Map 00041002 R R \Device\Harddi
003D0000 00001000 Priv 00021040 RWE RWE
003E0000 00001000 Priv 00021040 RWE RWE
00400000 00001000 HelloWo: PE header Imag 01001002 R RWE
00401000 00001000 HelloWo: .text SFX Imag 01001002 R RWE
00402000 00001000 HelloWo: .rdata Imag 01001002 R RWE
00403000 00001000 HelloWo: .bss data Imag 01001002 R RWE
00404000 00001000 HelloWo: .idata imports Imag 01001002 R RWE
00410000 00041000 Map 00041002 R R \Device\Harddi
0065B000 00001000 Priv 00021004 RW Guarded RW
0065C000 00004000 stack of main thread Priv 00021004 RW Guarded RW
60000000 00005000 Map 00041004 RW RW
60010000 0000B000 Map 00041004 RW RW
60040000 00003000 Map 00041004 RW RW
61000000 00001000 cygwin1 PE header Imag 01001002 R RWE
61001000 000FE000 cygwin1 .text code Imag 01001002 R RWE
610FF000 00003000 cygwin1 /4 Imag 01001002 R RWE
61102000 0000B000 cygwin1 .data data Imag 01001002 R RWE
6110D000 00034000 cygwin1 .rdata Imag 01001002 R RWE
61141000 0000A000 cygwin1 .bss Imag 01001002 R RWE
61141B00 00008000 cygwin1 .edata exports Imag 01001002 R RWE
61153000 00001000 cygwin1 .rsrc resources Imag 01001002 R RWE
61154000 00011000 cygwin1 .reloc relocations Imag 01001002 R RWE
61165000 00001000 cygwin1 /19 Imag 01001002 R RWE
61166000 00001000 cygwin1 /38 Imag 01001002 R RWE
61167000 00009000 cygwin1 .idata imports Imag 01001002 R RWE
61170000 00090000 cygwin1 .cygheap Imag 01001002 R RWE
77DD0000 00001000 ADVAPI3; PE header Imag 01001002 R RWE
Captulo 5 - Assembly bsico parte 1

77DD1000 00075000 ADVAPI3; .text code, imports, exports Imag 01001002 R RWE

Figura 5.5 Podemos ver no Olly como fica esse mapeamento de memria de um programa real. Basta
Layout da memria abrir o arquivo \Desktop\Sessao 5\HelloWorld.exe, e examinar o mapa de memria com o
de processo.
comando Alt-M ou clicando no boto M da barra de ferramentas.

Podemos ver acima os endereos da memria do processo, a regio reservada ao Stack, a


regio reservada ao executvel (cada seo carregada em uma regio), seguida do Stack do
thread adicional, e finalmente a rea das DLLs.

53
Se quiser examinar uma regio especfica, basta clicar duas vezes sobre ela. Por exemplo,
para ver quais variveis de ambiente esto sendo utilizadas pelo programa, basta clicar duas
vezes sobre a primeira regio de memria, e o dump dessa regio ir abrir.

importante se familiarizar com essa tela, pois ela muito importante para encontrar informa-
es na hora da anlise. Por exemplo, se o programa carrega dinamicamente DLLs durante a
sua execuo, usando as funes LoadLibraryA e GetProcAddress, o aluno poder ver onde essas
DLLs foram mapeadas em memria e acess-las atravs dessa tela. Isto pode ser interessante,
por exemplo, quando o programa carrega uma DLL que no padro no sistema. Uma DLL
embutida, por exemplo. muito comum um programa malicioso descarregar em um sistema
uma DLL com funes maliciosas e carreg-la dinamicamente, como se fosse um plugin.

Exerccio de fixao 2 e
Tratamento de exceo
possvel utilizar o tratamento de exceo de forma maliciosa?

Structured Exception Handling


11 SEH: q
22 Manipuladores de exceo so funes registradas para tratar problemas.

22 Podemos registrar uma funo para tratar erros de E/S ou divises por zero,
por exemplo.

11 Os endereos destas funes so armazenados no Stack.

11 Quando ocorre uma exceo, a lista de manipuladores percorrida para encontrar


uma apropriada.

11 Existe um manipulador que trata todas as excees, responsvel pela mensagem:

22 Windows has detected a general protection fault.

Sistemas Windows utilizam um sistema de tratamento de excees chamado Structured


Exception Handling (SEH). Essa estrutura formada por ponteiros para funes, que so
chamadas toda vez que uma exceo ocorre dentro do programa.

Um programa pode registrar funes para tratar algumas excees, como por exemplo uma
diviso por zero. Quando ocorre a exceo, o Windows percorre essa lista, passando o con-
trole para cada funo registrada, e aquela que conseguir tratar o erro ser executada.

O endereo dessas funes fica armazenado no Stack, em uma lista encadeada. Existe
Engenharia Reversa de Cdigo Malicioso

sempre uma funo de tratamento de excees registradas pelo Windows, e geralmente ela
responsvel por mostrar a mensagem Windows has detected a general protection fault.

Alguns programas utilizam essa estrutura para controlar seu fluxo de execuo. Veremos nas
atividades prticas um exemplo de um compactador de executveis chamado PECompact,
que utiliza essa funcionalidade para executar sua rotina de descompresso.

Instrues bsicas assembly


11 Assembly bsico: q
22 O padro que adotaremos o assembly Intel (outro padro seria AT&T).

22 Ex: MOV destino, origem.

54
11 Ponteiros so indicados por [] q
22 Ex: [EAX] = *EAX = Contedo do endereo apontado por EAX.

11 Load Effective Address (LEA)

22 Transfere o endereo de offset da origem para o registrador de destino.

22 mais rpido que usar MOV.

33 Ex: LEA EAX, [EBX] vs. MOV EAX, EBX.

22 LEA geralmente utilizado em operaes matemticas.

33 Ex: LEA EAX, [EAX*EAX] equivalente a EAX 2.

A seguir faremos uma rpida reviso de alguns comandos mais usados em assembly.

Primeiramente vemos dois exemplos de uso de ponteiros em assembly. O primeiro caso


usado para indicar o contedo do endereo armazenado em um registrador.

Assim, se EAX=0x00401000, e a partir do endereo 0x00401000 temos os valores 0xDE 0x41,


0xBE e 0x00, o comando MOV EAX, [EAX] vai fazer EAX=0x00BE41DE. Isto porque EAX um
registrador de 32 bits (4 bytes so copiados) e em sistemas little endian os valores so arma-
zenados de trs para a frente. Nesse caso, o comando MOV no copiou o valor de EAX, mas
sim o contedo apontado pelo endereo em EAX.

No caso do LEA, o indicador de ponteiro funciona de forma diferente. Load Effective Address
(LEA) indica que o que vamos copiar para o registrador de destino o endereo armazenado
no registrador de origem. Assim, se EBX=0x00401000, o comando LEA EAX,[EBX] vai copiar o
valor 0x00401000 em EAX. Isto o equivalente a fazer MOV EAX, EBX.

LEA geralmente usado em operaes matemticas envolvendo os valores armazenados nos


registradores. Um exemplo disso o incio do cdigo em um arquivo compactado com UPX:

0050ED00 PUSHAD <- Salva flags

0050ED01 MOV ESI,509000 <- Move para ESI endereo 0x00509000

0050ED06 LEA EDI,DWORD PTR DS:[ESI+FFFF8000] <- Salva em EDI o


endereo onde ser descompactado o programa (ESI+0xFFFF8000 => ESI-
0x8000 => 0x00501000)

0050ED0C PUSH EDI <- Salva EDI

11 XOR executa a operao OU-EXCLUSIVO. q


22 Passar o mesmo registrador nos dois parmetros zera o contedo do registrador.

33 Ex: XOR EAX, EAX igual a EAX = 0.


Captulo 5 - Assembly bsico parte 1

11 PUSH/POP salva ou recupera o contedo de um registrador no Stack.

22 Ex: PUSH EAX/POP ECX.

11 PUSHF(D)/POPF(D) salva ou recupera os flags de CPU.

22 Ex: PUSHF.

11 As verses terminadas em D trabalham em 32 bits; o comando normal em 16 bits.

O comando XOR usado basicamente para zerar registradores, mas pode indicar o uso de
criptografia. Qualquer operao XOR onde o operando da direita diferente do da esquerda
pode ser considerada uma criptografia simples. Os valores da esquerda so mascarados
com o valor da direita, que pode ser chamado de chave da criptografia. Nas duas ltimas
sesses, veremos um exemplo de criptografia usando essa tcnica.
55
Os comandos PUSHAD e POPAD so usados para salvar todas as flags e registradores no
Stack. Isso geralmente feito antes de uma operao que v modificar muitos registradores,
e o programa precisa salvar essa informao antes de executar as operaes. O compactador
UPX usa essas funes para salvar o estado inicial do programa antes de descompact-lo, e
recuperar esse estado antes de passar o controle para o programa descompactado.

11 Instrues de matemtica bsica: q


22 INC, DEC, ADD, SUB, MUL, DIV.

11 Manipulao de registradores:

22 MOV, LEA.

11 Instrues de chamadas de funo:

22 CALL / RET, ENTER / LEAVE.

11 Comparao de valores:

22 CMP, TEST.

11 Controle de fluxo:

22 JMP, JZ, JNZ, JG, JL, JGE etc.

11 Manipulao de Stack:

22 PUSH, POP.

11 Operao binria:

22 AND, OR, XOR, SHL, SHR.

Diversas instrues realizam operaes bsicas em assembly, como operaes matemticas,


manipulao de registradores, chamada de funes, comparaes e controle de fluxo, mani-
pulao de Stack e operaes binrias.

Um manual mais completo sobre essas operaes pode ser obtido atravs do IDA Pro, se
tiver configurado corretamente o Help adicional conforme foi sugerido (opcodes.hlp), bas-
tando posicionar o cursor em um comando e pressionar Control-F1.

Instrues assembly: Nmeros


11 Nmeros podem ser representados com sinal ou sem. q
11 Nmeros positivos sem sinal variam de 0 a 0xFFFFFFFF.

11 Nmeros com sinal ocupam metade desse valor:

22 Positivos vo de 0x00000000 a 0x7FFFFFFF.

22 Negativos vo de 0x80000000 a 0xFFFFFFFF (-1).


Engenharia Reversa de Cdigo Malicioso

importante guardar bem esses conceitos sobre formato dos nmeros em assembly. Como
assembly no mantm os tipos de variveis, muitas vezes o analista se confunde ao consi-
derar um valor como nmero quando na verdade ele no mais, ou considerar um nmero
positivo quando na verdade ele negativo. Um exemplo disso foi dado quando mostramos
que 0xFFFF8000 na verdade -0x8000.

Instrues assembly: Endereamento


Modos de endereamento de memria: q
11 Endereamento direto.

11 Endereamento indireto.

56
11 Endereamento indexado. q
11 Endereamento indexado escalado.

Formas de endereamento usadas em assembly:

11 Endereamento direto
MOV EAX, 0xDACAFE
int big num = 0xDACAFE;

11 Endereamento indireto
MOV EAX, [EBX]
char inicial = *nome;

11 Endereamento indexado
MOV EAX, [EBX+0xB4D]
int opcao = char array [0xB4D];

11 Endereamento indexado escalado


MOV EAX, [EBX+ECX*20]
struct *mystruct = struct array[20];

O endereamento direto aquele onde o valor do operando da direita copiado direta-


mente para o operando da esquerda.

No endereamento indireto, o valor do operando da direita o endereo copiado para o


operando da esquerda.

Os dois ltimos exemplos mostram como usar endereamento indireto para criar estruturas
como arrays e estruturas mais complexas.

No ltimo caso, temos que EBX o endereo base da estrutura, ECX o tamanho de cada
registro, e 20 o nmero do registro que queremos acessar.

Instrues assembly: Chamada de funo


Existem diversos padres para a chamada de funo: q
11 cdecl

22 Quem chama limpa o Stack.

11 stdcall

22 Funo chamada limpa o Stack.

11 fastcall

22 Argumentos podem ser passados em registradores diferentes.

11 thiscall
Captulo 5 - Assembly bsico parte 1

22 Cdigo gerado por C++, ponteiro para objetos passado em registrador.

33 Microsoft: ECX.

33 Borland / Watcom: EAX.

11 naked

As chamadas a funes podem indicar o tipo de compilador usado no programa, pois cada
compilador tem uma preferncia por um tipo diferente de chamada.

As chamadas mais comuns so cdecl e stdcall. Normalmente os parmetros para essas


funes so passados atravs do Stack, por meio de instrues PUSH que precedem

57
a chamada, na ordem inversa dos parmetros esperados. A diferena entre as duas que
nas chamadas cdecl a funo que chamou limpa o Stack aps a finalizao da funo, e no
padro stdcall a funo chamada que deve limpar o Stack.

Os outros tipos de chamada so usados em casos especiais, como por exemplo as chamadas
thiscall que so usadas em cdigo orientado a objetos para passagem nos registradores de
ponteiros para objetos.

Tanto o IDA Pro quanto o OllyDBG tentam reconhecer o padro de chamada utilizado em um
programa e nomeiam automaticamente as variveis passadas como parmetro quando a
funo for conhecida (por exemplo, chamadas a funes de bibliotecas do sistema).

Argumentos de funo so empilhados na ordem inversa:

stdcall cdecl
funcao(arg1, arg2); funcao(arg1, arg2);
push arg2 push arg2
push arg1 push arg1
call funcao call funcao Figura 5.6
Argumentos
mov [ebp-0xc], eax add esp, 8 de funo so
mov [ebp-0xc], eax empilhados na
ordem inversa.

Abaixo esto dois exemplos de chamada de funes com passagem de parmetros e os


respectivos modos de tratamento do Stack:

stdcall

funcao(arg1, arg2);

push arg2

push arg1

call funcao

mov [ebp-0xc], eax

cdecl

funcao(arg1, arg2);

push arg2

push arg1
Engenharia Reversa de Cdigo Malicioso

call funcao

add esp, 8

mov [ebp-0xc], eax

Podemos observar que no caso da funo cdecl o Stack limpo aps a chamada funo
com o comando ADD ESP, 8. Como vimos anteriormente, esse comando remove 8 bytes
do Stack, removendo efetivamente os dois parmetros passados anteriormente com o
comando PUSH. No caso da chamada stdcall, isso feito dentro da prpria funo.

58
No final dos cdigos, o valor de retorno da funo, em EAX, salvo na posio de memria
indicada por [EBP-0xc] (posio 0xC do Stack). Vamos ver a seguir como funciona esse tipo
de endereamento.

Instrues assembly: Enquadramento


11 Enquadramento baseado em EBP: q
22 Registrador utilizado para indicar a localizao de argumentos e variveis
em uma funo.

11 Modo tradicional:
push ebp
mov ebp, esp
sub esp, 0x100

11 DLLs mais recentes:


mov edi, edi
push ebp
mov ebp, esp

11 Compiladores otimizados podem omitir o apontador de frame.

22 As variveis so referenciadas por ESP.

O endereamento baseado em EBP permite ao programa acessar o Stack independente-


mente dos valores que possam ter sido adicionados ao mesmo. Por exemplo, quando uma
funo chamada, seus parmetros ficam armazenados no Stack. Durante a execuo da
funo, outros valores podem ser gravados ou removidos do Stack, modificando o ponteiro de
topo da pilha. Para acessar os parmetros, a funo normalmente salva o valor de ESP em EBP
no comeo da execuo, e passa a acessar os parmetros usando EBP como valor relativo.

Vimos um exemplo disso quando o programa salva o retorno da chamada de funo EAX em
sua varivel [EBP-0xC], ou seja, na posio 0xC relativa a EBP.

importante notar que apesar dessa ser a maneira mais comum de acesso s variveis,
nem sempre esse formato usado. Compiladores mais recentes ou otimizaes durante a
compilao podem omitir o uso de EBP.

Instrues assembly: Parmetros de funo


11 Parmetros so positivos. q
22 Parmetros passados para funes so referenciados positivamente a partir de EBP.

11 [EBP + valor]

22 Normalmente indica argumentos no Stack.

11 [EBP - valor]
Captulo 5 - Assembly bsico parte 1

22 Indica variveis locais.

11 O retorno de funes normalmente feito em EAX quando o valor 32 bits.

Finalmente, para diferenciar o uso de variveis locais e variveis passadas como parmetros,
os compiladores geralmente usam valores positivos ou negativos referentes a EBP.

Vimos o uso de [EBP-0xC], que indica uma varivel local. Lembrando dos exemplos de
chamada cdecl e stdcall, poderamos escrever aquele cdigo em assembly da seguinte forma:

localvar=funcao(arg1,arg2);

Ou seja, o valor de retorno de funcao(arg1,arg2) seria armazenado em localvar.

59
60
Engenharia Reversa de Cdigo Malicioso
Roteiro de Atividades 5
Atividade 5.1 Structured Exception Handling
00401000 MOV EAX,4BA070

00401005 PUSH EAX

00401006 PUSH DWORD PTR FS:[0]

0040100D MOV DWORD PTR FS:[0],ESP

00401014 XOR EAX,EAX

00401016 MOV DWORD PTR DS:[EAX],ECX

00401018 PUSH EAX

1. Com OllyDBG, abra o arquivo:

\Desktop\Malware\mal.Banker-Down.PECompact.worm.scr

2. Examine o Stack quando executar 0x0040100D;

3. Execute com F7 cada instruo acima, at chegar em 0x00401016;

4. Ao executar 0x00401016, ser gerada uma exceo, que deve ser passada ao programa
com Shift-F7;

5. Descreva o que aconteceu com o fluxo do programa e os possveis efeitos na anlise


do programa.

Atividade 5.2 Estrutura de memria dos executveis


1. Examine os arquivos no diretrio \Desktop\Malware com o OllyDBG;

2. Verifique o mapeamento das sees na memria e o contedo da memria nos


endereos das sees;

3. Examine as DLLs carregadas. Os processos que usam LoadLibraryA e GetProcAddress


tm alguma diferena em relao aos demais?
Captulo 5 - Roteiro de Atividades

61
4. Compare os executveis que usam o mesmo compactador, e veja se consegue descrever
o padro de cdigo e de mapeamento de memria usado por pelo menos trs deles.
Engenharia Reversa de Cdigo Malicioso

62
6
Assembly bsico parte 2
objetivos

Identificar blocos de cdigo que so normalmente encontrados em cdigos analisados,


visando facilitar a anlise do cdigo e a identificao de funcionalidades.

conceitos
Blocos condicionais, estruturas de repetio, manipulao de memria e strings,
operaes matemticas, recuperao de tipos, lgica branchless.

Exerccio de fixao 1 e
Cdigo assembly
possvel identificar estruturas de programao como if, for e switch em linhas de
cdigo assembly?

Exerccio de nivelamento 1 e
Cdigo assembly
Sabendo que os compiladores evitam utilizar a instruo DIV por ela ser muito lenta, qual a
instruo utilizada para efetuar divises em casos em que o resto da diviso no necessrio?

Ao abrir um executvel em um disassembler, possvel recuperar informaes referentes


aos tipos de variveis?
Captulo 6 - Assembly bsico parte 2

Ramificaes
11 Instrues utilizadas no controle de decises do programa. q
11 Em uma instruo CMP, o operando da esquerda o parmetro de comparao:

22 CMP EBX, [EAX+20h]

22 EBX:

33 > [EAX+20h]? JA endereo

33 < [EAX+20h]? JB endereo

33 = [EAX+20h]? JE endereo
63
Ramificaes podem ser entendidas como cdigo de controle de fluxo dependente do valor
de uma varivel. No exemplo do slide, temos o uso de uma instruo de comparao CMP
EBX, [EAX+20h]. Essa instruo compara EBX com o valor armazenado no endereo apon-
tado por EAX+20h. A seguir, existem trs pulos condicionais, que vo depender do valor dos
flags configurados por CMP.

Existem outras maneiras de realizar tais comparaes, como por exemplo o cdigo abaixo,
encontrado no endereo 0x00407354 do programa malicioso em anlise:

CODE:00407354 call sub_40729C

CODE:00407359 sub al, 1 ; Se


(sub_40729C()-1)

CODE:0040735B jb short loc_407372 ; < 0? va


para location1

CODE:0040735D jz short loc_407361 ; = 0? Va


para location2

CODE:0040735F jmp short loc_407362 ; qualquer


outro valor? Va para location3

Neste cdigo, o valor de retorno da funo sub_40729C diminudo em 1, e o resultado


testado. Se for menor que 0, o controle passa para loc_407372, se for 0, passa para
loc_407361, e qualquer outro valor faz o programa pular para loc_40736.

Blocos condicionais
if (var > 128) q
var = 128;

mov eax, [ebp+8]

cmp eax, 0x80

jbe skip

mov eax, 0x80

skip:

11 Jump Below or Equal (JBE) uma comparao sem sinal.

11 Jump if Less than or Equal (JLE) uma comparao com sinal.

Blocos condicionais so parecidos com as ramificaes, mas normalmente contm apenas


Engenharia Reversa de Cdigo Malicioso

uma comparao e um nico desvio de fluxo. No cdigo existem diversos exemplos desse
tipo de estrutura.

if (var > 128)

var = 128;

mov eax, [ebp+8]

cmp eax, 0x80

jbe skip

64
mov eax, 0x80

skip:

Loops
for (i = 0; i < 100; i++) q
do_something();

xor eax, eax

start:

cmp eax, 0x64

jge exit

call do_something

inc eax

jmp start

exit:

11 Loops so fceis de visualizar em grficos.

11 No IDA Pro 5, o modo normal de visualizao j em forma grfica.

11 Pode-se usar F12 para visualizar o fluxo de uma funo.

Loops so estruturas de cdigo executadas um certo nmero de vezes, normalmente


com uma condio de sada. Por exemplo, a funo FOR executa a sequncia de cdigo
do_something() cem vezes.

for (i = 0; i < 100; i++)

do_something();

xor eax, eax

start:

cmp eax, 0x64

jge exit

call do_something

inc eax

jmp start
Captulo 6 - Assembly bsico parte 2

exit:

Um loop facilmente identificado em um grfico de controle de fluxo. No IDA, basta posi-


cionar o cursor dentro da funo desejada e pressionar F12 para gerar um grfico como mos-
trado na Figura 6.1, onde possvel facilmente identificar o loop e as suas condies de sada.

65
sub_407338: Figura 6.1
push ebx Grfico gerado no
push esi IDA para identificar
push edi um loop.
mov ebx, edx
mov esi, eax
mov edx, ebx
mov eax, esi
call sub_407AB
mov edi, eax
test edi, edi
jz short loc_407372

loop:
mov edx, edi : Do {
sub edx, esi
mov eax, esi
call ub_40729C
sub al, 1 ; Se (sub_40729C( ) -1)
jb sort loc_407372; < 0? va para location1

0040735D:
jz short loc_407361; = 0? va para location2

loc_407361: 004073F:
inc edi jmp short oc_407362; qualquer outro valor va para location3

loc_407372: loc_407362:
mov eax, edi inc edi
pop edi mov edx, ebx
pop esi mov eax, edi legenda:
pop ebx call sub_4057AB Verdadeiro
retn mov edi, eax Falso
test edi, edi
jnz short loop ; } while (EDI ! = 0)

Switch
Switch Statements: q
switch (var) {

case 0: var = 100; break;


Engenharia Reversa de Cdigo Malicioso

case 1: var = 200; break;

jmp switch_table[eax*4]

case_0:

mov [ebp-4], 100

jmp end

case_1:

mov [ebp-4], 200

66
jmp end q
end:

IDA Pro e OllyDBG tm excelente identificao de switch/case.

Estruturas Switch so muito comuns para controlar o fluxo de execuo de um programa


quando necessrio testar uma varivel para comparar com diversos valores. Existem basi-
camente duas maneiras de se fazer isso em assembly, e o formato que o analista encontrar
depende muito do compilador usado.

switch (var) {

case 0: var = 100; break;

case 1: var = 200; break;

jmp switch_table[eax*4]

case_0:

mov [ebp-4], 100

jmp end

case_1:

mov [ebp-4], 200

jmp end

end:

No exemplo acima, a estrutura switch criada atravs de uma tabela de JMP. Neste caso, o
JMP executado de acordo com o valor de EAX*4 (4 o tamanho do endereo armazenado
na tabela switch_table, e EAX o ndice da localizao que ser chamada). Por exemplo, se
quisermos passar o controle para o sexto valor da tabela de switch, faremos o seguinte:

MOV EAX,6h

JMP switch_table[EAX*4]

No IDA, uma tabela de switch pode ser reconhecida pela sequncia de


offsets, seguindo a definio de uma varivel:

MOV EAX, 3h

JMP off_407F8C[EAX*4]


Captulo 6 - Assembly bsico parte 2

off_407F8C dd offset loc_4045C4 ; DATA XREF:


CODE:00407F88

dd offset loc_404394

dd offset loc_4045FC

dd offset loc_4046E4

No caso acima, o controle do fluxo direcionado para a terceira localizao a partir de


off_407F8C, ou seja, loc_4045FC.

67
Memcpy()/Strcpy()
memcpy() / strcpy() inline q
mov esi, origem

mov edi, [ebp-64]

mov ebx, ecx

shr ecx, 2

rep movsd

mov ecx, ebx

and ecx, 3

rep movsb

11 REP MOVSD copia ECX DWORDS de ESI para EDI.

11 REP MOVSB copia o restante dos bytes.

Este tipo de estrutura pode ser encontrada em qualquer programa que trabalhe com strings.

mov esi, origem

mov edi, [ebp-64]

mov ebx, ecx

shr ecx, 2

rep movsd

mov ecx, ebx

and ecx, 3

rep movsb

Os comandos REP so usados para ler/copiar strings em geral. Mais informaes sobre os
comandos REP SCA* podem ser encontradas no Help do IDA Pro (opcodes.hlp).

O importante a notar aqui que o registrador ESI usado para indicar o endereo da string
de origem; EDI usada para indicar o endereo da string de destino, e ECX usado para
indicar quantos caracteres sero lidos. Se a string no for um mltiplo de DWORD, os bytes
restantes so copiados por REP MOVSB.

Strlen()/Strstr()
Engenharia Reversa de Cdigo Malicioso

strlen()/strstr() inline q
mov edi, string

or ecx, 0xFFFFFFFF

xor eax, eax

repne scasb

not ecx

dec ecx

68
11 REPNE SCASB percorre a string em EDI procurando pelo caractere em AL. q
11 Para cada caractere percorrido, ECX decrementado e EDI incrementado.

11 No fim da sequncia REPNE:

22 EDI = posio do caractere encontrado + 1 (mais um).

22 ECX = tamanho negativo da string - 2 (menos dois).

11 Tamanho da string:

22 not ECX - 1

As funes strlen() e strstr() so implementadas atravs do comando REPNE SCASB, que per-
corre a string apontada por EDI, procurando pelo caractere armazenado em AL (byte menos
significativo de EAX).

mov edi, string

or ecx, 0xFFFFFFFF

xor eax, eax

repne scasb

not ecx

dec ecx

Para strstr(), cada caractere percorrido comparado com AL (ECX decrementado e EDI
incrementado). Ao final, ECX vai conter a posio do caractere em AL na string. Se AL=0x00, o
comando procura pelo caractere de fim de string, transformando o comando em strlen().

Como ECX vai ser um nmero negativo, normalmente o cdigo transforma o mesmo em
nmero positivo fazendo NOT ECX; DEC ECX.

Estruturas
Acesso a estruturas: q
push ebp

amov ebp, esp

mov eax, off_struct

mov ebx, [ebp+arg_0] ; varivel arg_0 local

push esi

cmp ebx, [eax+14h] ; byte 0x14 a partir de EAX


Captulo 6 - Assembly bsico parte 2

mov eax, off_object

ja short loc_12345678

cmp [eax+8*var_4], ebx ; if (struct[var_4]==EBX), cada struct[]

; tem 8 bytes

sbb esi, esi

11 EAX carregado de uma varivel global.

11 EAX acessado utilizando [], o que indica que um ponteiro para a estrutura.

69
O acesso a estruturas geralmente feito atravs de endereamento indireto usando o regis-
trador EAX ou EBP. No cdigo abaixo podemos ver alguns exemplos de uso de estruturas:

push ebp

mov ebp, esp

mov eax, off_struct

mov ebx, [ebp+arg_0] ; varivel arg_0 local

push esi

cmp ebx, [eax+14h] ; byte 0x14 a partir de EAX

mov eax, off_object

ja short loc_12345678

cmp [eax+8*var_4], ebx ; if (struct[var_4]==EBX), cada struct[]

; tem 8 bytes

sbb esi, esi

O primeiro caso o salvamento do endereo da estrutura off_struct em EAX. Este valor


usado posteriormente para acessar o dcimo quarto byte da varivel, com a chamada CMP
EBX, [EAX+14h]. Isso significa que deve-se comparar o valor de EBX com o dcimo quarto
byte a partir de EAX.

Outro uso de estruturas mostrado acima o acesso a variveis locais da funo, atravs
de endereamento indireto de EBP. O comando MOV EBX, [EBP+arg_0] acessa o argumento
arg_0 passado funo.

Finalmente, temos um exemplo de acesso uma estrutura mais complexa. Neste caso,
podemos considerar off_object como um array de estruturas. No caso, cada estrutura
deve ter 0x8 bytes de tamanho, e o acesso a cada membro da estrutura feito como
mostrado: CMP [EAX+8*var_4], EBX, ou seja, EBX vai ser comparado estrutura com ndice
var_4 em nosso array.

Operaes matemticas
11 A diviso usando a instruo DIV extremamente lenta. q
22 Compiladores s a utilizam quando necessitam do resto.

11 Divises so feitas utilizando uma combinao de instrues de Shift.

22 Ex: diviso por 4.


Engenharia Reversa de Cdigo Malicioso

33 SHR EAX, 2.

11 SHL faz a operao oposta (multiplicao).

As operaes de multiplicao e diviso em assembly so geralmente realizadas atravs das


funes de Shift binrio. O comando DIV extremamente lento, e portanto o compilador s
o utiliza quando precisar de resto.

Para casos onde o resto no necessrio, ou em que realizamos uma multiplicao, o uso
das funes SHR e SHL escolhido pelo compilador. Tomando como exemplo o nmero 8
representado em binrio por 00001000:

70
SHR EAX, 2 => 00000010 => 2

SHL EAX, 3 => 00010000 => 16

No caso de algum bit significativo ser movido para fora do tamanho do byte, ele ser descar-
tado, e as flags de CARRY, ZERO e OVERFLOW podem ser setadas. Exemplo:

EAX=10001001

SHL EAX, 2 => 00100100

SHR EAX=3 => 00000100

Nmeros randmicos
Pseudo geradores de nmeros randmicos.

; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||

SaveCurrentTime proc near


call GetTickCount
mov ds:CurrentSavedTime, eax
retn
SaveCurrentTime endp

; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||

RandomNumberGenerator proc near


mov eax, ds:CurrentSavedTime
imul eax, 343FDh
add eax, 269EC3h
mov ds:CurrentSavedTime, eax
mov ax, word ptr ds:CurrentSavedTime+2
retn
RandomNumberGenerator endp

Figura 6.2 Muitas vezes, um programa pode precisar gerar nmeros randmicos para usar em suas
Pseudo geradores funes. Como o Windows no prov um gerador de nmeros randmicos real, os pro-
de nmeros
randmicos. gramas costumam implementar essa funo atravs do uso do relgio do sistema. A funo
GetTickCount devolve a hora atual em nmero de segundos desde uma data especfica (no
Linux, UnixTime, contado a partir de 1 de janeiro de 1970).
Captulo 6 - Assembly bsico parte 2

Como esse nmero est sempre mudando, e geralmente um nmero grande, o programa
realiza algumas operaes matemticas com ele, para causar o estouro do espao reser-
vado para o nmero, e pega algumas partes do nmero final, para contar como nmero
randmico. Este tipo de operao chamada de gerao de nmeros pseudo randmicos.

O exemplo foi retirado do programa malicioso que analisaremos nas duas ltimas sesses;
ele retorna o nmero randmico de 32 bits em EAX.

71
Exerccio de fixao 2 e
Variveis em cdigos assembly
Existe representao de tipos de variveis em cdigos assembly?

Variveis
11 No existe representao de tipos de variveis em assembly. q
11 Ento, como diferenciar:

22 Strings de dados brutos?

22 Strings UNICODE de strings ASCII?

22 Inteiros de ponteiros?

22 Inteiros de valores booleanos?

33 Precisamos analisar a varivel atravs das funes que a utilizam.

A identificao de tipos em assembly uma tarefa difcil, porque o assembly no representa


tipos de variveis, dificultando essa tarefa do analista. Para identificar e diferenciar tipos de
variveis, necessrio estudar como esses valores so usados durante a execuo do programa.

A forma indicada de fazer isso estudando os parmetros passados para funes ou operaes
realizadas com valores armazenados em registradores.

Variveis de API
O IDA Pro tem uma excelente identificao de tipos usados em chamadas de funes de API: q
CODE:004056A4 loc_4056A4: ; CODE XREF: sub_405694+C

CODE:004056A4 lea edx, [ebp+TotalNumberOfClusters]

CODE:004056A7 push edx ; lpTotalNumberOfClusters

CODE:004056A8 lea edx, [ebp+NumberOfFreeClusters]

CODE:004056AB push edx ; lpNumberOfFreeClusters

CODE:004056AC lea edx, [ebp+BytesPerSector]

CODE:004056AF push edx ; lpBytesPerSector

CODE:004056B0 lea edx, [ebp+SectorsPerCluster]

CODE:004056B3 push edx ; lpSectorsPerCluster


Engenharia Reversa de Cdigo Malicioso

CODE:004056B4 push eax ; lpRootPathName

CODE:004056B5 call GetDiskFreeSpaceA

Se compararmos com a dificuldade em encontrar os tipos das variveis de funes no inte-


grantes de uma API, para APIs documentadas o procedimento mais fcil.

Para identificar o tipo de uma varivel, preciso descobrir um ponto no cdigo onde essa
varivel seja usada, e ver como ela tratada, isto , se usada em uma soma ou multipli-
cao, se pode ser um inteiro, se usada para indicar uma rea de memria com strings,
se uma varivel de texto, e assim por diante.

72
Para funes presentes em APIs e DLLs do sistema, descobrir essas informaes fcil,
bastando consultar uma referncia sobre essa funo, para descobrir as variveis que ela
recebe como parmetro. Em seguida, basta olhar no cdigo e ver o momento em que essas
variveis so armazenadas no Stack antes de chamar a funo, o que equivale a passar
esses parmetros para ela. Sabendo a ordem em que as variveis esto no Stack, possvel
associ-las aos tipos de variveis que a funo espera como parmetro de entrada, e com
isso descobrir o tipo das variveis no cdigo.

No exemplo, uma chamada funo GetDiskFreeSpaceA() do sistema. De acordo com o IDA,


essa funo est definida na API como:

BOOL _ _stdcall GetDiskFreeSpaceA(LPCSTR lpRootPathName,LPDWORD


lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD
lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters)

Examinando o cdigo que antecede a chamada funo, observamos diversos comandos


PUSH colocando esses parmetros no Stack. Lembre-se sempre de que a ordem de passagem
dos parmetros inversa ordem descrita na chamada da funo na API.

Recuperao de tipos
Inteiros x Ponteiros: q
11 Inteiros nunca so desreferenciados.

11 Inteiros so frequentemente comparados, ponteiros no.

11 Ponteiros so comparados com zero ou com outros ponteiros.

11 Aritmtica com ponteiros geralmente simples, mas com inteiros costuma ser complexa.

No caso especfico de diferenciao de nmeros e ponteiros, importante notar a forma


como as variveis so usadas. Ponteiros costumam ser desreferenciados (dereferenced),
e geralmente so comparados com zero ou com outros ponteiros. A aritmtica realizada
com ponteiros tambm costuma ser simples.

No caso de nmeros, eles costumam ser comparados com outros nmeros e nunca
so desreferenciados. A aritmtica envolvendo nmeros mais complexa. O uso dos
comandos INC e DEC pode indicar a presena de um nmero, j que no teria muito sentido
incrementar ou decrementar o endereo de um ponteiro.

11 Recuperao de tipos: Strings x Dados brutos. q


11 Cpia de strings geralmente precedida por um strlen() ou o equivalente inline, cpia
de dados brutos no.

11 Strings so normalmente comparadas a caracteres legveis ou a outras strings, mas


Captulo 6 - Assembly bsico parte 2

dados brutos normalmente no.

11 Confirme parmetros strings at para as chamadas a APIs.

73
loc_504546: ;CODE XREF: sub_50450E+16j
; sub_50450E+1Aj
cmp byte ptr [edi], 40h ; 40h == @
mov [ebp+esi+String1], bl
jnz short loc_5045C3

cmo ds:off_5090D0, ebx


jz short loc_50457D

mov eax, offset off_5090D0 Figura 6.3


Strings x Dados
mov esi, eax
brutos.

No caso de strings, a identificao se faz atravs de chamadas a funes strlen() e strcpy().


Dados brutos tambm podem ser copiados com strcpy() inline, mas normalmente somente
cpias de strings so precedidas por strlen().

Caso a varivel analisada seja usada como parmetro em uma chamada de funo de API,
confirme na documentao da API se o parmetro equivalente aceita mesmo uma string.

O exemplo compara o valor apontado por EDI com o caracter @, e move o valor em BL
para a posio ESI da varivel String1, passada como parmetro funo. ESI possivel-
mente foi carregado com o tamanho de String1, e o cdigo faz com que o caractere em BL
seja adicionado string.

Cdigo orientado a objetos


11 Cdigo orientado a objeto C++ q
22 O ponteiro this normalmente passado atravs de ECX.

lea ecx, [esp+16]


call rotina_membro
11 Tabelas virtuais, ou VTables, so comuns em C++

mov eax, esi

push 0x100

call dword ptr [eax+50]

11 Procure identificar os construtores/destrutores e rotinas de inicializao ao analisar


programas em C++, pois eles podem ser teis.

A anlise de cdigo orientado a objeto costuma confundir o analista, principalmente ao tentar


identificar as funes a variveis membro de um objeto, e quando o mesmo instanciado.
Engenharia Reversa de Cdigo Malicioso

Como j vimos, o ponteiro this de um objeto geralmente passado uma funo membro
atravs de ECX.

Outra caracterstica, neste caso usada em cdigo C++, o uso de tabelas virtuais, onde o
endereo da funo chamada armazenado em um array, e a chamada feita ao ndice
desejado dentro dessa tabela.

74
Lgica branchless
11 Fluxo lgico do programa no conta com saltos ou desvios condicionais. q
11 Compiladores evitam o uso de desvios condicionais quando possvel.

11 A maioria dos pares CMP/JMP podem ser convertidos em uma sequncia de opera-
es aritmticas.

22 O uso da instruo SBB um indicador tpico.

11 O cdigo resultante roda muito mais rpido, mas no to legvel.

O processo de deciso de fluxo muito custoso em assembly. Por isso, em alguns casos os
compiladores escolhem utilizar uma lgica sem desvios. Neste caso, os flags da CPU so
usados para controlar o fluxo do programa.

O uso da instruo SBB um indicador tpico de que o compilador escolheu usar lgica branchless
no cdigo. Geralmente ela substitui casos simples de estruturas IF/THEN.

cmp eax, 1 q
sbb eax, eax

inc eax

pop esi

pop ebx

retn

11 CMP EAX, 1 vai setar o flag CF se EAX for 0. q


11 SBB EAX, EAX faz EAX= EAX - (EAX+CF).

11 Portanto, se EAX=0, logo EAX = 0 - (0+1) = -1.

11 Se EAX maior que zero, ento EAX = EAX - EAX+0 = 0.

11 INC EAX torna os valores possveis de EAX iguais a 0 ou 1.

Neste exemplo podemos ver o uso da instruo SBB para executar um cdigo que trans-
forma o valor de retorno de uma funo em 0 ou 1.

cmp eax, 1

sbb eax, eax

inc eax

pop esi

pop ebx
Captulo 6 - Assembly bsico parte 2

retn

Inicialmente, EAX comparado com 1.

Se EAX=0, o retorno da funo ser 0.

Se EAX for diferente de 0, o retorno da funo ser sempre 1.

Este cdigo pode ser representado pelo seguinte cdigo de alto nvel:

Function x()

75
If (EAX>0)

return 1

Else

return 0

end

Assembly bsico
Engenharia reversa pode parecer complicada, mas uma questo de treino e familiaridade q
11 Treine os conceitos.

11 Mantenha um guia de referncia mo (opcodes.hlp).

11 Examine alguns programas com o debugger, executando passo a passo com F7.

11 Use um emulador ou mquina virtual.

11 Compile um cdigo simples e tente analis-lo.

11 Sabendo o que o cdigo faz, muito mais fcil entender o assembly.

11 Vale a pena lembrar que somente a experincia vai ajudar o analista na hora de estudar
um cdigo malicioso desconhecido. Portanto, treine sempre que puder e com a maior
variedade possvel de cdigos.

11 Procure manter sempre disposio guias de referncia de linguagem assembly e lingua-


gens de alto nvel, para entender exatamente o que os comandos significam e como as
estruturas funcionam.

11 Executando os programas em um ambiente virtual, passo a passo, voc poder estudar o


comportamento de cada parte do cdigo, sem se preocupar em comprometer o sistema.

Finalmente, para entender estruturas mais simples sem ter que ficar procurando por q
elas no cdigo malicioso, crie alguns programas em linguagem de alto nvel, com a estru-
tura que estiver analisando, e compile o cdigo com diferentes compiladores, para ver
como o cdigo assembly gerado e conhecer as diferenas entre os compiladores.
Engenharia Reversa de Cdigo Malicioso

76
Roteiro de Atividades 6
Atividade 6.1 Assembly bsico
Examine com o IDA Pro o arquivo \Desktop\malware\mal.Down.nopack.worm.exe.

Identifique as estruturas vistas na sesso terica marcando a posio (Alt-M) e inserindo um


comentrio (:) ao lado das que conseguir encontrar. Ao final, grave o arquivo IDB do IDA Pro
(mal.Down.nopack.worm.idb) com as marcaes e comentrios.

Atividade 6.2 Reconhecimento de cdigos


Examine os cdigos de exemplo disponveis no CD do aluno, no diretrio Sesso 6\Exemplos.
Abra os arquivos C em um editor de textos e os executveis correspondentes no IDA Pro.

Para cada arquivo, encontre o cdigo assembly correspondente ao cdigo C apresentado, e


insira os comentrios (:) e marcaes (Alt-M) conforme a atividade anterior.

Captulo 6 - Roteiro de Atividades

77
78
Engenharia Reversa de Cdigo Malicioso
7
Import Address Table
objetivos

Apresentar a tabela de importao e como podemos reconstru-la em caso de


anlise de um arquivo compactado.

conceitos
Tabela de importao, reconstruo da tabela de importao.

Exerccio de fixao 1 e
Tabela de importao
Como as informaes da tabela de importao podem ser teis durante a anlise de um
cdigo malicioso?

Exerccio de nivelamento 1 e
Tabela de importao
Por qual motivo os autores de cdigos maliciosos tentam obfuscar a tabela de importao?

Import Address Table


11 A tabela de endereos de importao (IAT) uma tabela com endereos dos q
smbolos importados.

11 Normalmente executveis escondem estes smbolos utilizando diversos truques para


dificultar a anlise.
Captulo 7 - Import Address Table

11 Geralmente eles resolvem por conta prpria estes smbolos, ou movem a tabela de
smbolos para um local no padro.

11 Depois de mapeadas dinamicamente, estas funes so integradas aos binrios


atravs de tabelas de jumps.

11 Isto dificulta a identificao das DLLs envolvidas, por no passarem mais pelo
entry point delas.

79
Neste captulo, conheceremos uma caracterstica dos programas maliciosos que costuma
dificultar a anlise. Como j foi comentado antes, os autores de programas maliciosos
tentam de toda forma dificultar o trabalho do analista, usando tcnicas de obfuscao de
cdigo, compactao e criptografia, entre outras.

Uma das formas mais comuns de obfuscar o cdigo remover qualquer referncia a
funes e DLLs do sistema. Dessa forma, ao examinar rapidamente o binrio, o analista
no sabe quais funes so usadas por ele, e ter que descobrir isso de outra forma. Isso
conseguido removendo a tabela de endereos de importao (IAT).

Mesmo assim, o binrio ainda precisa acessar essas funes de alguma forma. A soluo
montar essa tabela dinamicamente, durante a execuo do programa, ou ento movendo
essa tabela para locais no padro, como a seo de recursos do binrio, e depois aces-
sando esse dado dinamicamente.

O carregamento das funes feito pelas chamadas LoadLibraryA e GetProcAddress. Isso


evita que as DLLs sejam inicializadas corretamente atravs da chamada a DLLMain(), e difi-
culta tambm a ao do analista.

Mas como em algum momento essas funes estaro mapeadas para uso do programa,
possvel recuperar essa informao. Veremos a seguir exemplos desse tipo de tcnica, e
formas de recuperar a informao de importao de funes.

Para recriar essa tabela, podemos utilizar algumas tcnicas: q


11 Procurar manualmente pela sequncia de comandos LoadLibrary/GetProcAddress

11 Procurar por hashes dos nomes e funes mais comuns

11 Procurar por assinaturas dos cdigos das funes

11 Ou ento podemos utilizar o prprio executvel para isso!

Para recriar essa tabela, podemos usar as tcnicas descritas acima, que normalmente
exigem muito trabalho. Mas conforme comentado, o programa realiza as chamadas a
LoadLibrary/GetProcAddress em algum momento, ento basta esperar que esse momento
ocorra, e recuperar o binrio da memria j com as funes mapeadas.

Reconstruo da IAT
11 Por que reconstruir a IAT? q
11 Analisar um arquivo malicioso sem estes smbolos pode ser muito trabalhoso.

11 Existe um nmero de formas diferentes de se fazer isso.

11 Normalmente, necessrio executar o programa, para que o mapeamento de


funes seja feito por ele.
Engenharia Reversa de Cdigo Malicioso

11 Por isso, importante salvar o estado da sua mquina virtual antes, para no
compromet-la.

11 Existem diversas ferramentas para isso. Veremos duas a seguir:

22 OllyDBG/OllyDump.

22 ImportRec.

Para realizar a primeira atividade, vamos usar o OllyDBG, especificamente o plugin de dump
de memria, para recuperar uma cpia do programa mapeado na memria.

80
A seguir, usaremos a ferramenta ImportRec para percorrer o programa e recuperar as infor-
maes de funes importadas presentes nele.

importante lembrar que a execuo de qualquer tipo de programa malicioso compromete a


mquina. Por isso, neste momento crie um snapshot da sua mquina virtual, para recuperar o
estado sadio aps a execuo do programa.

Figura 7.1
Feramenta
ImportRec.

Neste captulo aprendemos a recuperar informaes ofuscadas em um programa malicioso.


Vimos tambm algumas rotinas de descompresso de executveis, e aprendemos a
encontrar o OEP dos programas. Estas tcnicas servem para recuperar outros tipos de
informao, como arquivos criptografados.

Estude outros arquivos compactados, e os scripts do OllyDBG disponveis em:

\Desktop\install\OllyDbg\OLLYSCRIPTS\

E treine sempre e o mximo que puder!

Captulo 7 -

81
82
Engenharia Reversa de Cdigo Malicioso
Roteiro de Atividades 7
Atividade 7.1 Recuperando a IAT com ferramentas
Primeira parte

1. Faa snapshot da mquina virtual;

2. Abra com o OllyDBG o arquivo:


\Desktop\malware\mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dat

3. Encontre o OEP do cdigo descompactado, e pause a execuo do programa nesta instruo;

4. Faa um dump do processo deixando marcada a opo Rebuild Import. Para cada
mtodo de reconstruo da IAT disponvel, faa um dump diferente;

5. Faa um relatrio descrevendo o que fez at agora, incluindo o processo para encontrar o
OEP e para fazer o dump do programa.

Segunda parte

1. Execute o ImportRec, e depois execute o programa malicioso original (renomeie de


.dat para .exe);

2. Escolha o programa malicioso em execuo no ImportRec, clique em IAT Autosearch,


depois em Get Imports, e finalmente em Fix Dump. Escolha um dos arquivos dump
feito na primeira parte;

3. Abra o arquivo gerado acima e os dois arquivos de dump da primeira parte no IDA Pro e
examine as funes importadas e o cdigo analisado pelo IDA;

4. Verifique os arquivos com o LordPE para comparar as informaes sobre os arquivos gerados;

5. Faa um relatrio destacando as principais diferenas entre os mtodos utilizados e as


funes detectadas:

6. Recupere o snapshot inicial, pois a mquina virtual foi comprometida.

Atividade 7.2 Recuperando a IAT manualmente


Captulo 7 - Roteiro de Atividades

Agora que j vimos como fazer a recuperao automaticamente, vamos entender o procedi-
mento de recuperao manual.

Primeira parte

1. No OllyDBG, abra o arquivo \Desktop\Malware\mal.Banker.Upack.abrir-fotos.scr;

2. Descubra a rea de memria na qual o programa ser descompactado;

83
3. Execute o programa com F7 por um tempo, e monitore a rea de memria em que
sero gravados os dados descompactados na janela de dump, para descobrir a rotina
de descompresso;

4. Encontre o endereo do ltimo byte gravado para descobrir a instruo de sada da rotina
de descompactao;

5. Descubra onde comea e onde termina a rotina de descompresso do Upack;

6. Faa um relatrio descrevendo os passos executados e os mtodos utilizados para a reso-


luo das questes acima.

7. Aps gravar o ltimo byte, o programa realiza uma operao modificando alguns bytes
no cdigo descompactado. Possivelmente trata-se de um ltimo passo de desobfuscao
do cdigo:

0093789E MOV AL,BYTE PTR DS:[EDI] ; Loop fixa cdigo

009378A0 INC EDI

009378A1 ADD AL,18

009378A3 CMP AL,2

009378A5 ^JNB SHORT 0093789E ; mal_Bank.0093789E

009378A7 MOV EAX,DWORD PTR DS:[EDI]

009378A9 CMP AL,16

009378AB ^ JNZ SHORT 0093789E ; mal_Bank.0093789E

009378AD MOV AL,0

009378AF BSWAP EAX

009378B1 ADD EAX,DWORD PTR DS:[ESI+14]

009378B4 SUB EAX,EDI

009378B6 STOS DWORD PTR ES:[EDI]

009378B7 ^ LOOPD SHORT 0093789E ; fim do loop

Analise este cdigo com seus colegas e faa um relatrio com suas concluses.
Engenharia Reversa de Cdigo Malicioso

84
Segunda parte

1. Tente encontrar a posio de memria em que ficam armazenadas as DLLs e as funes


que sero carregadas para recriar a tabela de importao.

2. Qual cdigo utilizado para executar essa operao?

3. O que acontece com o mapa de memria do processo aps carregar todas as DLLs?

4. Faa um dump do processo aps finalizar essa anlise.

5. Faa um relatrio descrevendo todos os passos executados nesta parte e os mtodos


usados para encontrar as informaes. Entregue o dump acima junto com o relatrio.

Terceira parte

1. Voc consegue encontrar a chamada ao OEP do programa? Se encontrar, faa um dump


do processo aps atingir o OEP.

2. Restaure o estado da mquina virtual para o snapshot inicial.

Atividade 7.3 Anlise esttica


Abra o mesmo arquivo da atividade anterior no IDA Pro. Encontre as partes de cdigo res-
ponsveis pela descompresso, reconstruo da IAT e OEP, comente (:) e marque (Alt+M).

Captulo 7 - Roteiro de Atividades

85
86
Engenharia Reversa de Cdigo Malicioso
8
Truques anti-engenharia reversa
objetivos

Apresentar tcnicas anti-debugging normalmente utilizadas e demonstrar tcnicas


para deteco e bypass destas protees.

conceitos
Deteco de debugger, thread local storage, deteco de mquinas virtuais,
structured exception handling.

Exerccio de fixao 1 e
Protetores de cdigo
Qual o objetivo dos protetores de cdigo utilizados em artefatos maliciosos?

Exerccio de nivelamento 1 e
Debugger
Por que alguns cdigos maliciosos utilizam tcnicas de deteco de debugger?

possvel a execuo de um cdigo antes do entry point?

Truques anti-engenharia reversa


Captulo 8 - Truques anti-engenharia reversa

11 Os autores de programas maliciosos utilizam compactadores e encriptadores para q


reduzir o tamanho dos arquivos, embaralhar o cdigo e dificultar a anlise.

22 Cdigo compactado passa a aparecer como dado, confundindo os disassemblers.

11 Algumas ferramentas usam tcnicas anti-debugger.

11 Existem centenas de compactadores.

11 OllyDBG tem dezenas de scripts para descompactar estes arquivos.

Neste captulo, estudaremos algumas tcnicas usadas por autores de programas maliciosos
para tentar impedir a anlise ou dificultar a identificao do programa. Veremos como identificar
essas tcnicas e algumas ferramentas e medidas que podem ser tomadas para contra atacar.

87
Os autores de programas maliciosos utilizam compactadores e encriptadores para reduzir o
tamanho dos arquivos, embaralhar o cdigo e dificultar a anlise.

Algumas ferramentas usam tcnicas anti debugger, como deteco de execuo passo a
passo, modificaes das funes de tratamento de excees ou insero de funes de
callback na tabela TLS.

Existem centenas de compactadores, como UPX, PECompact, Yoda, tElock, ASPack, BurnEye,
entre tantos outros.

Este tipo de tcnica usada justamente porque os autores de programas maliciosos sabem
que empresas de antivrus e de combate ao crime digital utilizam tcnicas de engenharia
reversa para analisar o cdigo e descobrir as caractersticas que identificam o programa, e
as aes tomadas quando um usurio infectado.

Entre as tcnicas mais simples, podemos citar o uso de compactadores de executveis,


ou ento tcnicas mais avanadas como deteco de debugger, modificao de excees,
deteco de ambiente virtual, entre outras tcnicas. Veremos como usar as ferramentas estu-
dadas at agora para reverter essa situao e analisar qualquer tipo de programa malicioso.

Deteco de debugger
11 Kernel32.IsDebuggerPresent() q
11 INT 3 (0xCC)

11 Timers

11 Exemplos:

22 start = GetTickCount();

22 alguma_funcao();

22 if (GetTickCount()-start > valorX)

22 Debugger_detectado();

A primeira tcnica que veremos tambm uma das mais perigosas no uso de mquinas
virtuais para a anlise de programas maliciosos. Alguns programas maliciosos tentam identi-
ficar se esto sendo executados dentro de um debugger, e podem modificar seu comporta-
mento ou mesmo interromper seu funcionamento se conseguem detectar o debugger. Eles
podem realizar essa operao de diversas formas, e implementar verificaes peridicas
para dificultar ainda mais o trabalho do analista.

A biblioteca do sistema Kernel32.dll possui uma funo chamada IsDebuggerPresent()


que retorna verdadeiro caso o programa esteja sendo executado ao mesmo tempo que
um debugger.
Engenharia Reversa de Cdigo Malicioso

Este tipo de proteo pode ser facilmente identificada e evitada. Como uma funo de
uma biblioteca padro que dever ser importada pelo programa, uma simples anlise das
funes importadas permite identificar seu uso. Mesmo que a tabela de importao esteja
modificada ou escondida, possvel recuper-la, conforme foi visto anteriormente.

A segunda forma de detectar um debugger atravs da execuo da instruo assembly INT 3.


Essa instruo usada por debuggers para implementar breakpoints no cdigo analisado.
Ao ser executada na presena de um debugger, esta instruo gera uma exceo no
sistema. Um programa malicioso pode executar essa instruo para gerar a exceo e parar
o funcionamento do programa. Quando o programa for executado sem um debugger, ele
funcionar normalmente.

88
Podemos descrever ainda a tcnica de utilizao de timers para identificar pausas na
execuo de um programa. Quando o programa executado em modo passo a passo
ou pausado por um debugger, o relgio do sistema continua contando os segundos da
mesma forma. Um programa pode usar essa caracterstica para identificar se determinada
parte do cdigo executada em um tempo razovel. Assim, se o cdigo deveria ser exe-
cutado em 1 segundo, mas demorou 5 segundos para rodar, o programa pode achar que
foi executado em modo passo a passo, e parar seu funcionamento. Vimos um exemplo de
como isso poderia ser feito.

Exerccio de fixao 2 e
Entry point
possvel executar um cdigo antes do entry point do arquivo?

Execuo de cdigo antes do Entry Point


11 Existem formas de executar cdigo antes que um debugger assuma a execuo q
do programa.

22 Nunca assuma que um programa malicioso no pode executar cdigo somente


por carregar em um debugger.

11 DLLMain() executado antes do debugger assumir.

22 http://www.insomniasec.com/publications/PreDebug.pdf

11 O cdigo de inicializao da Thread Local Storage (TLS) em arquivos PE executado


antes do debugger.

Quando um programa carregado, o sistema operacional mapeia os dados e o cdigo


na memria, inicializa variveis e passa o controle ao entry point do programa para iniciar
a execuo.

Ao executar este programa dentro de um debugger, a execuo do programa pausada


quando este atinge o entry point. Mas ao atingir esse ponto, uma brecha muito perigosa
aparece. No momento em que o sistema operacional inicializa as variveis do programa,
algumas funes do mesmo podem ser chamadas para realizar essa tarefa. Isto pode per-
mitir que o cdigo do programa seja executado antes que o debugger assuma a execuo do
programa no entry point.

Um exemplo disso o caso de DLLs. Como elas so arquivos PE, ao carreg-las no debugger,
Captulo 8 - Truques anti-engenharia reversa

sua execuo ser paralisada no entry point. Mas em DLLs, a funo DLLMain() chamada antes
disso, permitindo ao programa malicioso executar cdigo antes da parada pelo debugger.

O TLS, como vimos anteriormente, a estrutura responsvel por manter a separao de


dados entre diferentes threads de um mesmo processo. Rotinas de inicializao do TLS so
chamadas antes do entry point, no momento da criao dos threads.

Thread Local Storage


Funcionamento da tcnica do Thread Local Storage (TLS): q
11 Utilizada para alocar informaes sobre threads.

11 A estrutura importante no TLS a IMAGE_TLS_DIRECTORY.

89
11 Dentro dessa estrutura, existe um campo importante: AddressOfCallBacks. q
11 Ele aponta para uma lista de funes de callback.

11 Estas funes podem ser executadas no momento da inicializao do arquivo PE na


memria, antes de executar o entry point.

Inserir cdigo como uma funo de callback no TLS permite executar cdigo antes do entry
point do programa. Isto permite descompactar, decriptografar, ou mesmo modificar o cdigo
de forma a confundir quem tentar analis-lo.

O IDA Pro detecta estas funes de callback e as oferece como entry points alternativos. Para
visualiz-los, pressione Control+E.

Cdigos no alinhados
11 JUMP ou CALL no meio de uma funo. q
11 Criptografia ou compactao de executvel.

11 Otimizaes do compilador.

11 Virtualizao de cdigo.

11 Vulnerabilidades.

Outra tcnica usada pelos autores de malware inclui truques de controle de fluxo do pro-
grama, com JUMPs e CALLs para endereos intermedirios de cdigo. Estas tcnicas no
modificam realmente o fluxo do programa, mas so truques de instrues assembly, que
apenas dificultam a visualizao do cdigo, mas que durante a execuo, permitem ao pro-
grama executar normalmente seu fluxo. No exemplo, vemos uma chamada a um endereo
intermedirio (CALL near ptr loc_AE0007+3), que na verdade equivale a um CALL a um ende-
reo no identificado pelo IDA. Examinando o cdigo da Figura 8.1 percebe-se que o CALL
cairia no meio do comando JMP NEAR PTR 460b04F7h em 0x00AE0007.

Alm desta tcnica, o uso de compressores e protetores de executveis, otimizaes do


compilador, virtualizao de cdigo (como as usadas pelo compactador Themida e pelo
protetor ExeCrypter) e shellcodes que exploram vulnerabilidades, entre outras, dificultam
muito ou tornam impossvel a leitura do cdigo assembly. Nestes casos, o analista vai ter um
trabalho muito grande para identificar os truques usados, e quase sempre o trabalho no
poder ser replicado para outros arquivos.
Engenharia Reversa de Cdigo Malicioso

90
.aspack:00AE0000 _aspack segment para public DATA use32
.aspack:00AE0000 assume cs:_aspack
.aspack:00AE0000 ;org 0AE0000h
.aspack:00AE0000 db 90h ;
.aspack:00AE0001
.aspack:00AE0001 ; ||||||||||||||| S U B R O U T I N E ||||||||||||||||||||||||
.aspack:00AE0001
.aspack:00AE0001
.aspack:00AE0001 public start
.aspack:00AE0001 start proc near
.aspack:00AE0001 pusha
.aspack:00AE0002 call near ptr loc_AE0007+3
.aspack:00AE0007
.aspack:00AE0007 loc_AE0007: ; CODE XREF: start+1p
.aspack:00AE0007 jmp near ptr 460B04F7h
.aspack:00AE0007 start endp
.aspack:00AE0007
.aspack:00AE0007 ; -----------------------------------------------------------
.aspack:00AE000C db 55h ; U
.aspack:00AE000D db 0C3h ; +

Figura 8.1
Truques de Modificaes no cabealho PE
q
controle de fluxo do
programa. 11 Valores invlidos.

11 Valores de ImageBase invlidos.

11 Dados invlidos em LoaderFlags e NumberOfRvaAndSizes.

11 Tamanho excessivo em SizeOfRawDataValues.

11 Tcnicas de realocao:

22 Realocao serve para modificar ponteiros no cdigo, caso a base da imagem seja
realocada na memria.

22 Pode-se usar essa caracterstica para modificar praticamente qualquer dado.

22 Abusando desta tcnica, um autor de programa malicioso pode modificar todo seu
cdigo antes do programa ser carregado.

Outra tcnica de autores de malware utiliza caractersticas dos arquivos PE para dificultar
o carregamento do arquivo em programas de debugger e obfuscar o cdigo. Algumas
entradas no cabealho PE aceitam valores no padronizados, e algumas ferramentas de
Captulo 8 - Truques anti-engenharia reversa

anlise simplesmente no conseguem abrir tais arquivos, apesar de o sistema operacional


abri-los normalmente e ignorar os valores invlidos.

Outra tcnica usada a realocao de cdigo. Esta tabela, presente no cabealho PE,
permite ao programa trocar alguns bytes do seu cdigo, antes do incio da execuo, para
possibilitar a realocao do endereo base do programa. Dessa forma, ele poder trocar os
offsets de algumas chamadas, para refletir o novo endereo base.

Examine o arquivo \Desktop\malware\mal.Down.crypt.winss.jpg no LordPE, e veja a


tabela de realocao nos diretrios do programa. Veja que as realocaes indicam o ende-
reo original do dado (RVA e Offset), e para onde ele vai ser realocado (Far Address).

91
Usando essa tcnica, o autor do programa malicioso consegue modificar cdigo (veja as
realocaes de funes, que comeam com os bytes 55 8B EC A1 0A 5A), dificultando a ao
de anlise automtica do binrio.

Structure Exception Handling


Structured Exception Handling (SEH): q
11 Esta tabela mantm um registro de funes executadas quando coisas ruins acontecem.

11 Por exemplo, podemos registrar uma funo para tratar divises por 0.

11 Quando ocorre uma exceo, a cadeia SEH percorrida para encontrar uma
funo apropriada.

11 Um autor de programa malicioso pode instalar uma funo de tratamento de


exceo, que pode ser usada para modificar o cdigo.

11 Exemplo: PECompact2.

A estrutura SEH permite ao programa executar funes especficas quando ocorre alguma
exceo durante a execuo normal do cdigo. Estas funes podem ser registradas pelo
programa, e sempre que ocorrer uma exceo, a lista de funes registradas ser chamada,
e aquela que puder tratar a exceo em questo, ser executada.

Compiladores visuais como Visual C e Delphi usam essa estrutura para instalar funes de
controle dos formulrios, botes e outros tipos de objetos visuais usados no programa.

Alm disso, ferramentas como o compressor PECompact2 usam esse tipo de estrutura para
obfuscar o cdigo gerado. No exemplo, vemos como ocorre a instalao de uma funo para
tratar excees, que na verdade usada para desviar o controle do fluxo do programa, pois logo
Figura 8.2
aps instalar a funo, o programa gera uma exceo (XOR EAX, EAX; MOV [EAX], ECX), e a Uso da ferramenta
funo instalada chamada. Esta funo na verdade a rotina de descompactao do programa. PECompact2.

CODE:00401000 ; ||||||||||||||| S U B R O U T I N E ||||||||||||||||||||||||||||||||||||


CODE:00401000
CODE:00401000
CODE:00401000 public start
CODE:00401000 start proc near
CODE:00401000 mov eax, offset sub_469830 ; endereco da funcao de excecao
CODE:00401005 push eax
CODE:00401006 push large dword ptr fs:0
CODE:0040100D mov large fs:0, esp ; instala a excecao no SEH
CODE:00401014 xor eax, eax ; EAX == 0
CODE:00401016 mov [eax], ecx ; Segmentation fault! Dispara excecao
Engenharia Reversa de Cdigo Malicioso

CODE:00401016 ; ------------------------------------------------------------------------
CODE:00401018 aPecompact2 db PECompact2,0
CODE:00401023 db 0AFh ; >>
CODE:00401024 db 7Eh ; ~
CODE:00401025 db 0CEh ; +

92
Exerccio de fixao 3 e
Ambiente virtualizado
Um cdigo malicioso pode ter um comportamento diferente dentro de um ambiente virtualizado?

Deteco de mquinas virtuais


Deteco de VMWare: q
11 Alguns programas maliciosos detectam o VMWare e podem modificar seu comportamento.

11 Instrues privilegiadas.

11 Instruo SIDT e Interrupt Descriptor Table Register (IDTR).

22 http://invisiblethings.org/papers/redpill.html

11 Diretrios ou chaves de registro.

11 Algumas tcnicas podem ajudar, como desabilitar a acelerao da VM ou no instalar


o VMWare Tools.

11 Algumas pessoas j chegaram a editar o binrio do VMWare para modificar nomes de


dispositivos tpicos.

Durante este curso, vimos que analisar um binrio dentro de um ambiente virtual pode
facilitar o trabalho, alm de ser uma maneira mais segura do que fazer a anlise em uma
mquina real. Mesmo assim, como j foi comentado antes, o analista precisa estar ciente
de que um ambiente virtual, por mais que parea seguro, pode ser detectado e explorado,
prejudicando a anlise ou at mesmo comprometendo o sistema hospedeiro.

Existem diversos programas maliciosos e ferramentas que exploram vulnerabilidades na forma


como as mquinas virtuais so implementadas. Alguns programas conseguem detectar o
VMWare, por exemplo, e modificar seu funcionamento ou simplesmente terminar a execuo.

A deteco pode ser feita por diversos mecanismos, como os exemplos listados. O problema
com mquinas virtuais criadas pelo VMWare que em algum momento, elas precisam ter
uma interao com o sistema hospedeiro, e essa interao pode ser detectada de dentro do
sistema virtual.

Por isso, existem algumas tcnicas que podem ser usadas para tentar diminuir a ocorrncia
deste tipo de deteco. A instalao do VMWare Tools, por exemplo, instala uma srie de fer-
ramentas e chaves de registro que so facilmente detectadas por um programa malicioso.
Captulo 8 - Truques anti-engenharia reversa

Outra forma de evitar a deteco desabilitar a acelerao do processador da mquina


virtual. Essa acelerao faz com que certas instrues no sejam emuladas pelo VMWare,
e sim passadas diretamente CPU. Para isso, o VMWare instala no sistema virtual uma
interrupo que chamada a cada instruo. Essa interrupo pode ser detectada por um
programa que esteja rodando no sistema virtual. Ao desabilitar a acelerao, todas as ins-
trues passam a ser emuladas, tornando o sistema mais lento, mas dificultando a deteco.

Em casos mais extremos, onde o programa malicioso detecta o VMWare atravs da enu-
merao de dispositivos, algumas pessoas chegaram a editar o binrio do VMWare para
modificar o nome destes dispositivos, e impedir o uso desse mtodo de deteco.

93
Tcnicas anti-engenharia reversa
11 Apesar de todas as dificuldades apresentadas, as ferramentas apresentadas tm q
capacidade de combater tcnicas anti-engenharia reversa.

11 O IDA Pro, por carregar o binrio para um banco de dados, e no execut-lo, permite
o carregamento de quase todos os binrios que for analisar.

11 Lembre-se: para cada tcnica usada pelos autores de programas maliciosos, sempre
ser possvel desenvolver uma tcnica contrria!

Lembramos que mesmo com todas as dificuldades, a escolha correta das ferramentas
permite a anlise de praticamente qualquer binrio.

Os plugins do OllyDBG so de grande ajuda para analisar alguns arquivos protegidos por
tcnicas de obfuscao, valores invlidos em estruturas, tcnicas de identificao de debugger
etc. Habilite todas as opes do plugin Olly Advanced, Hide Debugger e do IsDebuggerPresent
e Hide Caption, para que voc possa analisar at os programas mais problemticos.

Um plugin alternativo do Olly o Phant0m. Com algumas protees a mais, esse plugin
permite analisar binrios compactados com Themida ou ExeCryptor.

Para utilizar o plugin Phant0m (com um zero), necessrio marcar a opo Expand plugin
limit to 127 plugins no Olly Advanced. Depois disso, basta renomear o arquivo Phant0m.dl_
no diretrio do Olly e reinici-lo.

Finalmente, importante lembrar que toda tcnica de obfuscao de cdigo pode ser que-
brada e revertida de algum modo, dependendo da capacidade do analista e das ferramentas
que utiliza, e do tempo que se quer investir nessa tarefa.
Engenharia Reversa de Cdigo Malicioso

94
Roteiro de Atividades 8
Atividade 8.1 Deteco de debugger
1. Execute o arquivo \Desktop\malware\IsDebuggerPresent.exe. O que acontece?

2. Abra o arquivo no IDA Pro, e execute novamente. Alguma coisa mudou?

3. Procure pela funo que detecta o debugger;

4. Remova esta proteo usando o OllyDBG;

5. Faa um relatrio explicando o que aconteceu nas duas execues, e como voc fez para
remover a proteo, com a parte do cdigo relevante comentada;

6. Faa um dump do programa corrigido.

No OllyDBG, basta digitar qualquer caractere na linha que deseja mudar, e ele
insere estes caracteres nessa linha.

Atividade 8.2 Thread Local Storage


1. Abra o arquivo \Desktop\malware\tls.exe no IDA Pro.

2. Marque um breakpoint na funo Start e execute. O que aconteceu?

3. Encontre a funo executada antes do entry point;

4. Marque um breakpoint e execute novamente. E agora?

5. Comente e marque o cdigo relevante no IDA, incluindo o local onde essa funo chamada.

6. Discuta com seus colegas como combater este tipo de tcnica. Escreva um relatrio com
o resultado das execues acima e suas concluses sobre a discusso.
Captulo 8 - Roteiro de Atividades

Atividade 8.3 Cdigos no alinhados


1. Abra o arquivo \Desktop\malware\mal.Banker.aspack.ActiveX.exe no IDA Pro;

2. Identifique as partes do cdigo que usam tcnicas anti-debugger (comentrios no IDA);

3. Modifique o banco de dados do IDA para mostrar o fluxo correto do programa;

4. Procure na internet por uma anlise sobre o compressor usado, e comente no IDA os
pontos do cdigo que fazem a descompactao do arquivo;

95
5. Com o OllyDBG, encontre o entry point original e descompacte o programa (como vimos
no Captulo 7). Faa um dump do binrio.

6. Faa um relatrio descrevendo os passos executados neste exerccio, o arquivo .IDB


gerado pelo IDA e o binrio extrado com o Olly, com uma descrio das informaes
importantes encontradas no binrio.

Atividade 8.4 Structured Exception Handling


1. Abra o arquivo \Desktop\malware\mal.Down.PECompact.WindowsUpdate.exe no OllyDBG;

2. Identifique as partes do cdigo que usam a tcnica de SEH (comentrios no Olly);

3. Procure na internet por uma anlise sobre o compressor usado. Comente no Olly os
pontos do cdigo que fazem a descompactao do arquivo;

4. Encontre o entry point original e descompacte o programa (como visto no Captulo 7).
Faa um dump do binrio;

5. Faa um relatrio com os passos executados nesta atividade, o binrio extrado com o
Olly, e com uma descrio das informaes importantes encontradas no binrio.
Engenharia Reversa de Cdigo Malicioso

96
9
Anlise de um worm
objetivos

Apresentar um roteiro de anlise e pontos importantes durante a anlise de um


cdigo malicioso, assim como tcnicas de deteco das principais funcionalidades.

conceitos
Emulao, anlise de strings, anlise da tabela de importao, visualizao grfica,
anlise de backtrace.

Exerccio de nivelamento 1 e
Anlise de strings
Por que a anlise das strings encontradas no executvel pode facilitar o processo de identifi-
cao de funes de um cdigo malicioso?

A aplicao de assinaturas de cdigo ao IDB pode facilitar a anlise? Por qu?

Descobrindo o bsico
Roteiro de engenharia reversa: q
11 Comece sempre pelo mais simples:

22 Strings.

22 Funes importadas.

22 Aplicao de assinaturas.

11 Examine o grfico de chamadas e nomes de estruturas identificadas automaticamente.


Captulo 9 - Anlise de um worm

11 Passe rapidamente pelo binrio nomeando as funes mais bvias.

11 Se necessrio, identifique strings obfuscadas.

11 Examine o backtrace de funes importadas.

22 Quem as utiliza?

22 Quais parmetros so passados?

97
Nos Captulos 9 e 10, veremos como realizar uma anlise detalhada de um programa mali-
cioso real, identificando suas funcionalidades e capacidades. Neste ponto, o aluno j tem a
base terica necessria para comear a se aventurar, porque as atividades anteriores deram
um bom exemplo de como usar as ferramentas para analisar programas.

A partir de agora, podemos ento comear a usar um mtodo durante nossa anlise, para
facilitar o trabalho e permitir a reproduo dos resultados, caso necessrio.

Como a engenharia reversa pode ser uma tarefa demorada e complexa, a melhor estratgia
comear a anlise do programa pelas ferramentas mais fceis, procurando as informaes
mais prontamente disponveis. Por isso, comece pelo mais simples:

11 Extraia as strings do arquivo, para ver se elas do alguma dica do que o programa faz,
e para us-las como ponto de partida em sua anlise. muito mais fcil identificar uma
funo que usa a string HKLM\Software\Microsoft\Windows\CurrentVersion\Run, do
que uma que no utilize nenhuma string visvel.

11 Examine as funes importadas. Uma chamada CreateFileA() ou LoadLibraryA() deve


conter alguma informao importante sobre o funcionamento do programa.

11 Aplique as assinaturas apropriadas. Use a funcionalidade do IDA de detectar cdigo


padro, e evite o trabalho de analisar cdigo de bibliotecas do sistema.

11 Examine os nomes de estruturas detectadas automaticamente e o grfico de chamadas


de funes. Elas podem dar indicaes das operaes que aquela funo executa.

11 Examine as funes mais bvias e d nomes claros. Ao analisar os grficos de funes que
chamam essas funes mais simples, o funcionamento delas pode se tornar mais claro.

11 Se o cdigo contiver strings obfuscadas, identifique-as e tente desobfusc-las usando


os plugins do IDA.

11 Examine chamadas a funes importadas. Quais funes as utilizam? Quais parmetros so


passados? Isso pode ajud-lo a identificar funcionalidades e descobrir os tipos de variveis.

Veremos neste captulo um pouco mais sobre essas tcnicas mais simples.

Responda s perguntas especficas: q


11 Como ele se espalha?

22 Por e-mail? Como so enviados?

22 Por rede? Compartilhamentos ou redes P2P?

22 Ele explora alguma vulnerabilidade?

11 Ele contm um backdoor?

22 Qual porta aberta?


Engenharia Reversa de Cdigo Malicioso

22 Ele conecta em algum lugar?

11 Que modificaes so feitas no sistema?

22 Quais arquivos so criados?

22 Quais chaves de registro so criadas?

11 Existe alguma data especial?

22 Existe alguma data para ativar uma atividade especfica?

Analisar o binrio simplesmente por analisar no eficiente. Tenha em mente perguntas


especficas que queira responder. Existem tpicos mais genricos com os quais devemos nos
preocupar ao analisar um programa malicioso. Pense nessas perguntas, escolha a melhor
sequncia de aes para respond-las, e fique focado em seu objetivo.
98
Analisar um binrio desconhecido pode ser to complexo que o analista poderia levar
meses realizando essa tarefa. Se seu objetivo somente identificar formas de se proteger
contra tal praga, no necessrio analisar todo o cdigo, funo por funo.

Exerccio de fixao 1 e
Identificao do cdigo
Quando no for possvel identificar o cdigo, como podemos proceder?

Emulao
11 Plugin X86Emu para IDA Pro Free disponvel em: q
22 http://www.idabook.com/ida-x86emu/

11 Para us-lo, copie para o diretrio Plugins do IDA e:

22 Carregue o malware no IDA.

22 Execute o plugin IDA-x86-meu.

22 Clique em push data.

22 Entre com 0 0 0 0 0 0 0 .... para criar um espao no Stack.

22 D duplo clique em ESP e copie o valor para EBP.

22 Pronto, basta executar o programa com Run ou Step.

11 Com ele, possvel emular apenas partes do cdigo.

22 Coloque os valores apropriados no Stack.

22 Modifique os registradores, se necessrio.

22 Posicione o cursor na primeira instruo a emular.

22 Execute com Run ou Step.

Em ltimo caso, se no for possvel identificar uma parte do cdigo, seja por ele estar obfus-
cado ou simplesmente por ser muito complexo, tente execut-lo em um ambiente emulado.

O IDA Pro tem um plugin para emular uma CPU X86. Com ele, possvel executar o programa
malicioso sem correr o risco de comprometer a mquina, pois as instrues sero execu-
tadas por um processador virtual.

Os passos descritos acima ensinam a usar o emulador. Uma das vantagens de executar o cdigo
emulado que no necessrio executar todo o cdigo para chegar a um ponto especfico.

Por exemplo, se o analista descobrir uma funo que faz a descompactao de um cdigo
ou criptografia de um dado, pode executar somente aquela parte do cdigo. Basta iden-
tificar corretamente os registradores utilizados pelo cdigo, os parmetros que a funo
Captulo 9 - Anlise de um worm

precisa ter no Stack, e criar esses dados de acordo. Ento, ao executar aquelas linhas de
cdigo, o programa vai pensar que est sendo executado normalmente.

Strings
11 Quais funes usam essas strings? q
11 Procure e tente identificar suas funcionalidades.

11 Lembre-se de usar os comentrios e de renomear as funes e variveis que identificar.

99
Durante estes dois captulos, usaremos um arquivo criado no Roteiro de Atividades 7, em
que vimos como descompactar um arquivo UPX e realizar o dump do processo em memria
para um arquivo. este arquivo descompactado que iremos usar em nossos exemplos.
Se voc no guardou o resultado daquela sesso, deve faz-lo agora, e guardar o arquivo
em um diretrio fora da mquina virtual, para poder restaur-la a um estado sadio.

Ao abrir o arquivo no IDA Pro, perceba que o programa realiza uma anlise prvia do arquivo
e identifica uma parte de cdigo (em azul) e muitas reas de dados (em cinza). Utilizando o
navegador para examinar essas regies em cinza, voc poder ver que estas reas quase
sempre correspondem a strings usadas pelo programa. Ao examinar a aba de strings do
IDA, possvel identificar diversos textos caractersticos de mensagens de e-mail, nomes de
usurios, comandos de comunicao com o servidor SMTP, entre outras mensagens.

Address Length Type String


....UPX0:0... 00000007 C %s.zip
....UPX0:0... 00000005 C html
....UPX0:0... 0000000C C %d%d%d%d
....UPX0:0... 00000041 C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345...
....UPX0:0... 0000009B C X-Pririty: Normal\r\nX-Mailed: Microsoft Outlook Expr...
....UPX0:0... 00000031 C Content-Type: multipart/mixed;\r\n\tboundary=\%s\\r\n
....UPX0:0... 00000016 C \r\nMINE-Version: 1.0\r\n
....UPX0:0... 0000000 C Date:
....UPX0:0... 0000000E C Subject:%s\r\n
....UPX0:0... 00000009 C To:%s\r\n
....UPX0:0... 0000000B C From:%s\r\n
....UPX0:0... 0000001D C ----=_%s_%.3u_%.4u_%8.X.%8.X
....UPX0:0... 00000009 C NextPart
....UPX0:0... 0000000F C \r\n\r\n--%s--\r\n\r\n
....UPX0:0... 0000008B C --%s\r\nContent-Type: application/octet-stream;\r\n\tname=\%s\\\r\nCont...
....UPX0:0... 00000007 C inline
....UPX0:0... 00000007 C \r\n\r\n\r\n
....UPX0:0... 00000058 C --%s\r\nContent-Type: text/plain;\r\n\tcharset=us-ascii\r\nContent-Transfer-...
....UPX0:0... 00000031 C This is a multi-part message in MINE format \r\n\r\n
....UPX0:0... 00000007 C QUIT\r\n
....UPX0:0... 00000006 C \r\n.\r\n
....UPX0:0... 00000007 C DATA\r\n
....UPX0:0... 0000000D C RC%s0:<%s>\r\n
....UPX0:0... 00000005 C PT T

Funes importadas
q
Figura 9.1
Engenharia Reversa de Cdigo Malicioso

11 Quais funes usam essas chamadas? Aba de strings


do IDA.
11 Tente identificar a funcionalidade delas.

11 Voc consegue encontrar os parmetros passados?

Outra forma de descobrir rapidamente os objetivos de uma funo examinando as


chamadas a bibliotecas importadas. Estas chamadas geralmente permitem identificar os
parmetros passados e a operao que as funes tentam executar.

Uma maneira simples de realizar essa operao no IDA examinar a aba de funes impor-
tadas e acessar a rea do disassembly onde elas esto localizadas. A partir de cada funo,
basta usar os comandos de referncias cruzadas e identificar as funes que fazem chamadas
a essas funes importadas.
100
Procure identificar todas as funes chamadas, pois elas fornecem uma tima indicao do
funcionamento do programa.

Address Name Library


00501004 RegOpenKeyExA ADVAPI32
00501008 RegSetValueExA ADVAPI32
0050100C RegQueryValueExA ADVAPI32
00501010 RegEnumKeyA ADVAPI32
00501014 RegCreateKeyExA ADVAPI32
0050101C FindClose kernel32
00501020 GetFileSize kernel32
00501024 FindNextFileA kernel32
00501028 MapViewOfFile kernel32
0050102C UnmapViewOfFile kernel32
00501030 FileFirstFileA kernel32
00501034 GetEnvironmentVariableA kernel32
00501038 GetDriveTypeA kernel32
0050103C GetSystemTime kernel32
00501040 WriteFile kernel32
00501044 CreateFileMappingA kernel32
00501048 LoadLibraryA kernel32
0050104C CreateProcessA kernel32
00501050 GlobalAlloc kernel32
00501054 GetLastError kernel32
00501058 CreateMutexA kernel32
0050105C IstrcatA kernel32
Figura 9.2 00501060 GetFileAttributesA kernel32
Aba funes 00501064 CopyFileA kernel32
importadas do IDA.
00501068 DeleteFileA kernel32

Assinaturas de cdigo
Aplicao de assinaturas: q
11 Use assinaturas para identificar automaticamente funes de bibliotecas padro.

11 Compiladores visuais costumam inserir muitas funes de controle de objetos que


no precisam ser analisadas. Infelizmente, nem sempre elas so teis.

Alm de funes importadas de DLLs do sistema, um programa pode conter cdigo padro
inserido pelos compiladores, ou pode ter sido compilado estaticamente com suas bibliotecas.
Neste caso, essas funes estaro misturadas ao cdigo inserido pelo autor do programa.
Exemplos desse tipo de cdigo so inseridos por compiladores visuais (Visual C, C++ Builder,
Delphi). Eles inserem funes de manuteno dos controles usados no formulrio.

Para distingui-las do cdigo inserido pelo autor, e evitar o trabalho de analis-las, usaremos as
Captulo 9 - Anlise de um worm

assinaturas do IDA. Normalmente essas assinaturas esto associadas a um compilador especfico.

Descobrir no cdigo qual foi o compilador usado pode ser muito til. Por exemplo, programas
compilados com compiladores visuais da Borland tendem a apresentar diversas strings refe-
renciando chaves de registro com o nome Borland. Isto pode ser uma indicao de que este
compilador foi usado. Mesmo assim, s vezes difcil identificar o compilador, como o caso
do programa analisado. Neste caso, o analista dever inserir todas as assinaturas que achar
provveis, e ver quais delas identificam cdigo.

101
File State Library name
d3vcl Applied 7 Delphi 3 Visual Component Library
b32vcl Applied 3 Borland Visual Component Library & Packages
bcb5rt Applied 3 CBuilder 5 runtime
bds8vcl Applied 3 BDS2008 Component Library & Packages
bcb5rt Applied 3 CBuilder 5 runtime
c4vcl Applied 2 CBuilder 4 and Delphi 4 VCL
d4vcl Applied 2 Delphi 4 Visual Component Library
d5vcl Applied 2 Delphi 5 Visual Component Library
bds2006 Applied 2 Delphi2006/BDS2006 Visual Component Library
bds2007 Applied 2 Codegear Rad Studio 2007 Visual Component Library
bds40 Applied 2 BDS 4.0 RTL and VCL
msmfc2 Applied 1 MFC32 WinMain detector
bds Applied 1 BDS 2005-2007 and Delphi6-7 Visual Component Library
bds Applied 1 BDS 2005-2007 and Delphi6-7 Visual Component Library
exe Applied 1 Startups of EXE/COM files
bh32ocf Applied 0 Borland OCF 32 bit
bh32dbe Applied 0 Borland DBE 32 bit
bh32rw32 Applied 0 BCC v4.x/5.x & BCB v1.0/v7.0 BDS2006 win32 runtime
bp32_2 Applied 0 Borland Delphi/C++Builder VCL
msddk32 Applied 0 DDK Windows 32bit
pe Applied 0 Startups of PE files

Visualizao grfica Figura 9.3

q
Uso das assinaturas
Verificar estrutura do entry point: do IDA.

11 Use a opo View g Graphs g User xref chart, mudando os valores de Recursion Depth.

11 Tente identificar funes que distribuem o fluxo do programa, ou aquelas que con-
centram as chamadas, nas pontas do grfico.

Aps identificar algumas funes usando os mtodos descritos at agora, o analista comea
a ter uma ideia das funcionalidades do programa. Ele j pode tentar visualizar as referncias
cruzadas e descobrir quais funes chamam ou so chamadas pelas que foram identificadas
at o momento.

Para isso, os grficos de chamada podem ser teis. Por exemplo, se o analista optar por usar
uma metodologia de pesquisa top-down, poder usar os grficos de referncias cruzadas
editveis para criar grficos mais especficos.

Por exemplo, para gerar um grfico com as funes chamadas a partir da funo Start,
com dois nveis de recurso, o analista pode mudar a opo Recursion Depth para 2,
desmarcar a opo Cross Reference To e, se quiser, desmarcar a opo Ignore Data e
Engenharia Reversa de Cdigo Malicioso

marcar a opo Print Comments.

No grfico, duas funes de bibliotecas e duas funes desconhecidas so chamadas a partir


do entry point, sendo que uma dessas ltimas chama diversas outras funes desconhecidas.
Voc pode escolher analisar a mais simples primeiro, ou partir para a identificao da funo
que chama as demais funes do programa.

102
public start
start proc near ; CODE XREF:

var_298 = dword ptr -298h


ThreadId = dword ptr -108h

push ebp
mov ebp, esp
sub esp, 298h
lea eax, [ebp+var_298]
push eax
push 101h
call dword_50116C
call sub_5033A8
push 108h
lea eax, [ebp+ThreadId]
push 0 ; int
push eax ; void *
call memset
push eax ; ThreadId
call sub_5031E4
add esp, 10h
push 0 ; uExitCode
call ExitProcess

start

sub_5033AB ExitProcess sub_5031E4

GetTickCount sub_503384 sub_50511C Create Thread sub_504C09 Sleep

sub_502C90 sub_505658 sub_502E50 sub_502D8E StartAddress sub_502F80 sub_50315C sub_504C18 sub_5075E5

... ... ... ... ... ... ... ... ...

memset
Captulo 9 - Anlise de um worm

__imp_memset

103
Exerccio de fixao 2 e Figura 9.4
Identificao do cdigo II Chamada de
funes de
Muitas vezes partir do entry point do arquivo para descobrir um funcionamento muito biblioteca e funes
desconhecidas.
trabalhoso. Conhecendo algum comportamento do artefato em questo, o que podemos
utilizar para facilitar este processo de identificao do cdigo?

Anlise de backtrace
Verificar backtrace de funes importadas: q
11 Navegue at a rea de funes importadas.

11 CTRL-X abre janela de referncias para uma funo.

11 Identifique como o cdigo faz a chamada funo importada.

A anlise do cdigo atravs de backtrace (anlise reversa) das funes importadas permite
ao analista descobrir rapidamente funes que fazem uso das funes importadas de DLLs.

Para encontrar o cdigo que faz referncia s funes importadas, voc deve procurar pela
regio onde estas funes esto armazenadas no cdigo, e usando o atalho Control+X, des-
cobrir os cdigos que fazem referncia quela funo. Esta tcnica vale tambm para tentar
descobrir as partes do cdigo que usam a funo analisada.

No exemplo, observamos que uma referncia funo RegOpenKeyExA() usada para criar
uma chave no registro. O texto passado como parmetro funo no aparece na lista de
strings, pois cada caractere foi passado individualmente para o Stack, e dessa forma a string
nunca aparece inteira no cdigo. Esta uma tcnica que os autores de programas maliciosos
usam para dificultar a identificao de caractersticas do cdigo.

No exemplo, os caracteres referentes chave de registro criada so normalmente apresen-


tados em bytes hexadecimais. Para transformar bytes em caracteres, selecione o byte e
pressione R.
Engenharia Reversa de Cdigo Malicioso

104
mov [ebp+var_20], u
mov [ebp+var_1F], r
mov [ebp+var_1E], r
mov [ebp+var_1D], e
mov [ebp+var_1C], n
mov [ebp+var_1B], t
mov [ebp+var_1A], V
mov [ebp+var_19], e
mov [ebp+var_18], r
mov [ebp+var_17], s
mov [ebp+var_16], i
mov [ebp+var_15], o
mov [ebp+var_14], n
mov [ebp+var_13], \
mov [ebp+var_12], R
mov [ebp+var_11], u
mov [ebp+var_10], n
mov [ebp+var_f], bl
mov [ebp+ValueName], J
mov byte ptr [ebp-0Bh], a
mov [ebp+var_A], v
mov [ebp+var_9], a
mov [ebp+var_8], V
mov [ebp+var_7], M
mov [ebp+var_6], bl
call esi ; RegOpenKeyExA
test eax, eax
jz short loc_5030C2
lea eax, [ebp+hkey]

Figura 9.5 Funes bsicas


q
Referncia funo
RegOpenKeyExA. Para identificar funes bsicas:

11 Comece pelas funes do entry point e por aquelas que utilizam funes importadas.

11 Lembre-se de comentar o cdigo e renomear funes e variveis (selecione o nome e


use N).

11 Use F12, CTRL-SHIFT-F e CTRL-SHIFT-T para examinar o grfico de fluxo e o grfico de


chamadas das funes que analisar.

11 Algumas vezes este procedimento ajuda a entender o funcionamento do cdigo.


Captulo 9 - Anlise de um worm

105
SaveCurrentTime proc near ; CODE XREF: start+1Bp
call GetTickCount
mov ds:nSavedCurrentTime, eax ; EAX contem o valor de retorno de GetTickCount()
retn
SaveCurrentTime endp

; ||||||||||||||| S U B R O U T I N E ||||||||||||||||||||||||||||||||||||||

RandomNumberGenerator proc near ; CODE XREF: sub_5031E4+57p


mov eax, ds:nSavedCurrentTime ; Usa SavedCurrentTime
imul eax, 343FDh ; Multiplica por um numero grande
add eax, 269EC3h ; adiciona a outro numero grande
mov ds:CurrentSavedTime, eax ; Salva em uma variavel
mov ax, word ptr ds:nSavedCurrentTime+2 ; Copia 2 bytes do SavedCurrentTime
;para AX (parte de EAX)
retn
RandomNumberGenerator endp

Figura 9.6
Anlise de cdigo Identificao de
funes bsicas.
Agora a sua vez! Consegue chegar at aqui?

Function Segment Length R F L S B T =


CheckfPunctuation UPX0 00000022 R . . . . . .
CompareStringsWithTable UPX0 00000036 R . . . . . .
CompareTwoStrings UPX0 00000030 R . . . B . .
CreateRegKeyMutex UPX0 000000FE R . . . B . .
CreateRegKeyRun UPX0 00000140 R . . . B . .
CreateSystemMutex UPX0 000000C2 R . . . B . .
CreateTempFile UPX0 00000160 R . . . B . .
FindOutlookIEWindow UPX0 0000003F . . . . . T .
FindOutlookAddressBook UPX0 00000124 R . . . B . .
GenerateRandomEmailID UPX0 00000016 R . . . . . .
GenerateTimestamp UPX0 000000DD R . . . B T .
GetInternetConnectionState UPX0 00000077 R . . . B . .
MainThread UPX0 0000009C R . . . B T .
MaybeConvertStringToLowercase UPX0 0000004A R . . . B . .
RandomNumberGenerator UPX0 0000001C R . . . . . .
RegisterProcessAsService UPX0 00000088 R . . . B . .
Engenharia Reversa de Cdigo Malicioso

SaveCurrentTime UPX0 0000000C R . . . . . .


SendMsgToOutLookAndIE UPX0 0000002C R . . . . T .
memcpy UPX0 00000006 R . . . . T .
memset UPX0 00000006 R . . . . T .
start UPX0 0000004A . . . . B . .
sub_5034BB UPX0 00000168 R . . . B T .
sub_503697 UPX0 000000E6 R . . . B T .
sub_50377D UPX0 0000009C R . . . . . .

Figura 9.7
Anlise de cdigo.

106
No prximo captulo, comearemos a descrever as caractersticas gerais do programa,
seus mtodos de ao, as informaes que podem ser usadas para identificar pragas na
rede e as caractersticas do programa que permitem a criao de mtodos de proteo
contra novas infeces.

Captulo 9 - Anlise de um worm

107
Engenharia Reversa de Cdigo Malicioso

108
Roteiro de Atividades 9
Atividade 9.1 Strings
1. Abra o arquivo mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dumped.dat criado no
Roteiro de Atividades do Captulo 7;

2. Examine as strings contidas no executvel;

3. Encontre e analise pelo menos trs funes que usem estas strings;

4. Examine as funes que utilizam essas strings, e tente identificar como elas funcionam;

5. Use os comentrios no cdigo e renomeie as variveis e nomes de funo de acordo com


o que encontrar.

Atividade 9.2 Funes importadas


1. Examine as funes importadas pelo programa;

2. Encontre e analise pelo menos trs funes que utilizem estas chamadas a bibliotecas.

Atividade 9.3 Assinatura de cdigo


1. Aplique as assinaturas que achar relevantes ao cdigo;

2. Identifique aquelas que foram teis, e determine quantas funes de biblioteca foram
reconhecidas;

3. Faa um breve relatrio com suas concluses sobre a aplicao de assinaturas neste
caso especfico.

Captulo 9 - Roteiro de Atividades

Atividade 9.4 Visualizao grfica


1. Tente identificar e analisar as funes bsicas a partir do incio (top-down); observe que
uma nica funo chama diversas outras. Ateno para ela!

2. Identifique as funes chamadas a partir do entry point e pelo menos trs chamadas a
partir de sub_5031E4;

3. Se ainda houver tempo, identifique mais funes.

109
Atividade 9.5 Anlise de backtrace
1. Navegue at a rea de funes importadas (em rosa no navegador);

2. D CTRL-X para abrir a janela de referncias para uma funo;

3. Identifique como o cdigo faz a chamada funo importada, para identificar e analisar
pelo menos cinco funes do programa.

Atividade 9.6 Funes bsicas


1. Comece pelas funes do entry point e por aquelas que utilizam funes importadas;

2. Lembre-se de comentar o cdigo e renomear funes e variveis (selecione o nome e use N);

3. Use F12, CTRL-SHIFT-F e CTRL-SHIFT-T para examinar o grfico de fluxo e grfico de chamadas
das funes que analisar. Algumas vezes isso ajuda a entender o funcionamento do cdigo;

4. Identifique pelo menos trs funes bsicas nas pontas do grfico de chamada do programa.
Engenharia Reversa de Cdigo Malicioso

110
10
Anlise do worm MyDoom
objetivos

Aplicar o conhecimento adquirido durante em uma anlise de uma ameaa real,


descobrindo suas principais funcionalidades, assim como detectar funes
escondidas dentro do cdigo.

conceitos
Worm MyDoom, formas de propagao, infeco do sistema, deteco de backdoor,
script IDC.

Exerccio de nivelamento 1 e
Anlise de backtrace
Como podemos identificar a funo de criao de mutex de sistema utilizando anlise de
backtrace? Por onde comear?

Que forma este worm utiliza para se manter ativo no sistema aps o boot?

Anlise do MyDoom
O malware que estamos analisando uma variante do MyDoom. Temos que responder q
a algumas perguntas:

11 Como ele se propaga?

11 Que dados ele acessa ou modifica?


Captulo 10 - Anlise do worm MyDoom

11 Como ele se mantm no sistema?

11 Existe algum backdoor escondido?

11 Que aes ele toma aps invadir o sistema?

11 Qual o impacto da presena do programa malicioso no computador do usurio?

Neste captulo, vamos finalizar a anlise do programa malicioso que iniciamos no captulo
anterior. Como voc j deve ter identificado diversas funes nas atividades do Captulo 9,
usaremos esse conhecimento para identificar as caractersticas mais genricas do programa.

111
O programa que analisamos uma variante do worm MyDoom. Precisamos agora responder as
perguntas propostas, identificando funes especficas que possam nos ajudar a respond-las.

Como adotamos uma abordagem de analisar primeiramente as funes mais bvias, temos
agora uma parte das funes identificadas e uma viso geral de como esto distribudos os
dados e cdigos do programa. O prximo passo juntar todas essas funes em mdulos
maiores que descrevam o funcionamento completo do programa.

Para criar uma marca no IDA Pro, posicione o cursor na posio desejada e pressione Alt+M.
Para navegar pelos marcadores, use Control+M.

Exerccio de fixao 1 e
Aplicando os conhecimentos
Como poderamos aplicar os conhecimentos adquiridos em uma anlise completa de um
artefato malicioso? Por onde comear?

Como ele se propaga?


11 Procure por funes de acesso rede ou de envio de e-mail. q
11 Procure funes de criao e leitura de arquivo.

11 Veja nas strings se existe alguma dica e descubra funes para criar um spam.

11 Existe algum acesso rede?

Para responder a primeira pergunta, devemos primeiro pensar nos mtodos de propagao
que o programa poderia usar para se propagar: acesso a diretrios compartilhados, explo-
rao de vulnerabilidades remotas, spam com o programa malicioso anexado, entre outros.

Depois de ter em mente possveis mtodos de propagao, o analista deve procurar pelas
funes importadas que permitem acesso rede ou criao e acesso a arquivos. Normal-
mente, procurar na lista de strings pode dar uma dica de quais arquivos so acessados, se o
programa cria algum e-mail ou se acessa algum diretrio ou compartilhamento remoto.

Examinando as strings do programa, podemos perceber que diversas delas indicam textos
que provavelmente so usados em um e-mail. Fazendo o backtrace das chamadas a essas
strings, voc poder encontrar as funes que criam o spam.

Para enviar o spam, o programa deve utilizar algum mtodo de comunicao com a rede.
Alternativas possveis seriam o uso de um cliente SMTP interno ao programa, o uso do ser-
vidor de e-mail configurado no sistema ou de algum servidor aberto para relay.
Engenharia Reversa de Cdigo Malicioso

112
CreateMIMEHeader

IstrcatA CreateFileAttachment GenerateSubjectAndAttachmentName

memset CreateFileA GenerateSomeString ReadFile Closehandle GeneratePartOfHeader

__imp_memset GenerateIPAddressOrTimeStamp IstrlenA

RandomNumberGenerator GenerateTimestamp IstrcpyA

GetTimeZoneInformation FileTimeToSystemTime wsprintfA FileTimeToLocalFileTime GetLocalTime

Figura 10.1 A figura anterior mostra o mdulo que cria o cabealho da mensagem MIME que ser
Mdulo que cria enviada com o worm em anexo. As chamadas s funes importadas esto em cinza no
o cabealho da
mensagem MIME. grfico. Neste grfico podemos perceber duas partes principais, a que cria o arquivo
anexado e a que gera o timestamp e os IPs que sero usados na criao do cabealho falso.
Alm disso, podemos ver que ambas as partes usam a funo de gerao de nmeros
randmicos que vimos anteriormente.

Como a comunicao com o servidor de e-mail?

SendSpam

RandomNumberGenerator FindConguredMailServer IstrcatA

RegEnumKeyA RegOpenKeyExA memset RegQueryValueExA wsprintfA MaybeTalkToMailServer TalkToMailServer Captulo 10 - Anlise do worm MyDoom

__imp_memset DeobfuscateString MaybeCreateRandomEmail IstrcpyA PrintEmailAddress

wnsprintfA sub_506AB8 IstrlenA CharlowerA IstrcmpiA

Figura 10.2 No caso do MyDoom, a propagao ocorre atravs do envio de e-mails para o servidor SMTP
Funes no configurado no sistema. Inicialmente ele pesquisa o registro procurando pelas configuraes
identificadas ou no
compreendidas. de e-mail do Outlook, e depois se conecta ao servidor, enviando os comandos necessrios.

Observe na figura que algumas funes no foram identificadas ou no foram compreendidas


corretamente. Sugerimos o exerccio de tentar corrigir essas funes e identific-las corretamente.

113
Quais dados so acessados ou modificados?
11 Verifique os arquivos que so criados. q
11 Quais chaves de registro so lidas/escritas/modificadas?

11 O programa acessa mais algum arquivo no sistema?

22 FindFirstFileA()

22 FindNextFileA()

22 MapViewOfFile()

22 GetDriveType()

22 GetEnvironmentVariableA()

22 Entre outros.

Outra pergunta importante a responder, principalmente para auxiliar na recuperao da


mquina invadida, saber quais arquivos ou dados do sistema so modificados quando a
mquina infectada.

Para descobrir isso, analise as chamadas s funes de criao/acesso a arquivos, acesso ao


registro, e outras funes de acesso a arquivos e diretrios.

As funes sugeridas acima mostram apenas uma parte das possveis funes de acesso a
arquivo que podem ser encontradas no programa.

11 Outra pergunta importante a responder, principalmente para auxiliar na recuperao q


da mquina invadida, saber quais arquivos ou dados do sistema so modificados
quando a mquina infectada.

11 Para descobrir isso, analise as chamadas s funes de criao/acesso a arquivos,


acesso ao registro, e outras funes de acesso a arquivos e diretrios.

11 As funes sugeridas mostram apenas uma parte das possveis funes de acesso a
arquivo que podem ser encontradas no programa.
Engenharia Reversa de Cdigo Malicioso

114
; sub_504AE2+D9p
; SearchforEmailinFiles+C5p
; CreateMapViewOfFile+EBp ---
; CloseHandle (import by name)
; HANDLE __stdcall CreateFileA(LPCSTR 1pFileName,DWORD dwDesiredAccess, DWORD dwShareMode, LPSE
extrn CreateFileA:dword ;
;
;
;
;
; BOOL __stdcall SetFileAttributesA(LPCST
extrn SetFileAttributesA;
;
;
;
; int __stdcall lstrlenA(LPCSTR ipString)
extrn lstrlenA:dword ;
;
;
;
;
; DWORD __stdcall GetTempPathA(DWORD nBuf
extrn GetTempPathA:dword
;
;
;
;
; UINT __stdcall GetWindowsDirectoryA(LPS
extrn GetWindowsDirectory

Figura 10.3 Lembre-se de utilizar a funcionalidade de referncias cruzadas do IDA para examinar as
Chamadas funo funes que fazem chamadas s funes importadas que podem ser usadas para criar ou
CreateFileA.
modificar arquivos.

Veja no exemplo que existem muitas chamadas CreateFileA(), o que pode ser uma indicao
de que o programa tenta criar algum arquivo no sistema. Examinando as funes que fazem
chamadas CreateFile(), pode-se encontrar os arquivos que so criados.

Verifique chamadas a RegOpenKeyExA(), RegSetValueExA() e RegQueryValueExA():

FindOutlookAddressBook Captulo 10 - Anlise do worm MyDoom

RegOpenKeyExA RegQueryValueExA CreateMapViewOfFile memset


CreateRegKeyRun

... ...
RegOpenKeyExA IstrlenA RegSetValueExA

Figura 10.4 Aqui temos alguns exemplos de chamada a funes que acessam ou modificam dados no
Funo de registro. Lembre-se de que as caixas mostradas em rosa nos grficos de chamada so
pesquisa.
funes importadas de bibliotecas, e as em preto so funes do programa.

115
Podemos ver acima uma funo que pesquisa o registro tentando encontrar o diretrio
onde o Outlook armazena a lista de contatos do usurio, e outra que cria uma chave de
registro para executar automaticamente o programa malicioso no incio do sistema.

Verifique os parmetros passados para chamadas a FindFirstFileA() para saber quais


arquivos e diretrios so pesquisados.

A funo FindFirstFileA() usada quando um programa precisa listar os arquivos de um dire-


trio. Aps uma chamada a essa funo, o programa geralmente realiza uma chamada em
um loop FindNextFileA() para encontrar os outros arquivos do diretrio. Estas funes so
geralmente chamadas quando o programa tenta procurar por algum arquivo especfico.

No caso do nosso exemplo, o MyDoom tenta encontrar arquivos de catlogo de endereos,


arquivos HTML e documentos de texto que possam conter endereos de e-mail que ele
usar para enviar o binrio anexado. Veja no exemplo uma parte do mdulo que faz a pes-
quisa de catlogo de endereos e arquivos.

A seguir, precisamos descobrir como o programa analisado faz para se manter no sistema.

Como ele se mantm no sistema?


11 O programa sobrevive ao boot? q
11 Quais processos so iniciados?

11 Ele cria algum mutex?

11 Como ele usa os recursos do sistema?

Na maioria dos casos, os programa maliciosos tentam instalar algum tipo de mecanismo
para serem reiniciados caso o computador seja desligado.

Outra informao importante descobrir se apenas o programa malicioso executado no


sistema, ou se ele de algum modo inicia outros processos tambm. comum que programas
maliciosos baixem e instalem outras ferramentas para comprometer ainda mais o sistema.
Esta inclusive uma fonte de renda para os autores dos programas, pois eles costumam
vender essa funcionalidade para outros invasores que desejam instalar suas ferramentas no
maior nmero possvel de mquinas.

Para evitar que o mesmo programa infecte mais de uma vez a mesma mquina, alguns
programas maliciosos costumam usar algum tipo de semforo, ou mutex, para indicar que a
mquina j foi comprometida. Se o mutex existir, significa que a mquina j foi comprome-
tida e no precisa mais ser infectada.
Engenharia Reversa de Cdigo Malicioso

E finalmente, veremos como identificar o tipo de impacto que o programa tem no sistema
como um todo. Alguns vrus costumam sobrecarregar a mquina com um processamento
muito agressivo, como ao executar um ataque de negao de servios, ou enviar spam
indiscriminadamente.

11 O programa sobrevive ao boot? q


22 Vimos que existe uma funo que cria uma chave de registro em:

33 \Software\Microsoft\Windows\CurrentVersion\Run

116
11 Outras formas de sobreviver ao boot seriam: q
33 Instalar um servio.

33 Salvar o executvel em um diretrio de inicializao.

33 Instalar uma extenso do shell do Explorer.

Vimos que o programa cria uma chave de registro para se reiniciar quando o sistema for
desligado. Alm desse mtodo, um programa pode usar outras formas para se manter ativo
aps um reboot. Existem diversas chaves de registro que podem ser usadas para isso, con-
forme os exemplos seguintes:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
Winlogon

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
RunOnce

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\
RunService

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
RunService

HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run

HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\

Mais informaes sobre essas chaves podem ser encontradas nos links:

11 http://antivirus.about.com/od/windowsbasics/tp/autostartkeys.htm

11 http://technet.microsoft.com/en-us/sysinternals/bb963902.aspx

Lembre-se de que um programa pode instalar um servio ou usar um diretrio de iniciali-


zao do Windows, como o diretrio Startup.

CreateRegKeyRun Captulo 10 - Anlise do worm MyDoom

Figura 10.5
Criando uma chave RegOpenKeyExA IstrlenA RegSetValueExA
de registro.

11 Quais processos so iniciados? q


11 Examinando a funo CreateProcessA() possvel encontrar o processo iniciado pelo
programa.

11 Verifique tambm possveis ocorrncias de LoadLibraryA() e GetProcAddress(), pois eles


podem ser utilizados para iniciar processos utilizando DLLs.

117
Alm da possibilidade de baixar outras ferramentas de ataque, alguns programas maliciosos
podem tambm trazer embutidos outros programas ou DLLs que possam usar durante o
comprometimento da mquina, como por exemplo um programa que instala um backdoor e
seja independente do primeiro.

Para iniciar esses processos alternativos, o programa precisa executar uma chamada a
alguma funo como CreateProcessA() ou LoadLibraryA(), que permitem a execuo de
programas externos.

push 44h
lea eax, [ebp+Dst]
pop esi
push esi ; Size
push ebx ; Val
push eax ; Dst
call memset

add esp, 18h


lea eax, [ebp+ProcessInformation]
mov [ebp+Dst], esi
mov [ebp+var_1C], 81h
push eax ; 1pProcessInformation
lea eax, [ebp+Dst]
push eax ; 1pStartupInfo
push ebx ; 1pCurrentDirectory
push ebx ; 1pEnvironment
push ebx ; dwCreationFlags
push 1 ; bInheritHandles
push ebx ; 1pThreadAttributes
push eax, [ebp+CommandLine]
push ebx ; 1pProcessAttributes
push eax ; 1pCommandLine
push ebx ; 1pApplicationName
mov [ebp+var_18], bx Figura 10.6
call CreateProcessA ; Chamada funo
CreateProcessA.

11 Ele cria algum mutex? q


22 Um mutex um tipo de semforo criado pelo programa para evitar infeces
mltiplas.

22 Existem diversos tipos de mutex:


Engenharia Reversa de Cdigo Malicioso

33 Arquivos.

33 Semforos no kernel.

33 Chaves no registro.

11 Procure por:

22 Ocorrncias de CreateMutexA().

22 Arquivos com tamanho nulo.

22 Chaves de registro incuas.

118
Como vimos, um programa pode usar um mutex para evitar infectar um computador mais
de uma vez. Existem basicamente trs tipos de mutex que podem ser criados:

11 Mutex no kernel: atravs de uma chamada CreateMutexA() o programa cria um sem-


foro no sistema operacional. Este semforo fica ativo enquanto o sistema no for reini-
ciado. Ao iniciar, o processo pode fazer uma tentativa de criar o mutex e, se o processo
falhar, significa que j existe uma cpia do processo em memria.

11 Mutex por arquivo: o programa cria um arquivo especfico que indica que ele j foi exe-
cutado no sistema. Se este arquivo existir, a mquina j foi comprometida. Normalmente
estes arquivos no tm nenhum contedo e so criados em locais escondidos para evitar
que sejam descobertos e apagados.

11 Mutex por chaves de registro: alm de criar um arquivo no sistema de arquivos, um


processo pode criar chaves de registro para indicar sua execuo prvia. Estas chaves
costumam no ter nenhum efeito no funcionamento do sistema. Se o analista encontra
a criao de uma chave de registro que aparentemente no tem nenhum impacto no
sistema, esta pode estar sendo usada como mutex.

CreateSystemMutex

GetLastError CreateMutexA IstrcatA memset CreateRegKeyMutex

Figura 10.7
Mutex por chaves __imp_memset RegCreateKeyExA RegOpenKeyExA
de registro.

Como ele usa os recursos do sistema? q


11 Alguns programas maliciosos costumam abusar dos recursos do sistema.

11 Uma indicao est em chamadas a CreateThread(), principalmente se estiver dentro


de loops.

Podemos ver no exemplo que o programa cria diversos threads no sistema dentro de um
loop infinito, com um intervalo de um segundo entre cada criao. Isto pode no ser muito
prejudicial ao sistema, mas se examinarmos a funo chamada em cada thread, veremos
que o sistema pode se tornar inutilizvel dentro de pouco tempo.

A funo em questo faz a procura de endereos de e-mail no sistema usando diversas


tcnicas, entre elas a pesquisa em arquivos de documentos. Isto pode causar uma grande
Captulo 10 - Anlise do worm MyDoom

sobrecarga no sistema pelas constantes leituras a disco.

119
StartHarvestEmailThreads

GetCurrentThread HarvestEmailInFiles FindTempUserDir SetThreadPriority FindOutLookAddressBook

GetDriveTypeA SearchAddressBookFile GetWindowsDirectoryA GetEnvironmentVariableA RagOpenKeyExA RegQueryValueExA

CheckValidFileExtension FindFirstFileA FindClose FindNextFileA LstrCatA

Sleep CharLowerA LstrcpynA SearchForEmailInFiles RandomNumberGenerator CreateMapViewOfFile

HeapFree ReadSomeData ReadFile CloseHandle CreateFileA CreateFileMappingA MapViewOfFile UnMapViewOfFile GetFileSize

MaybeMapFileToMemory memset MaybeCheckForSpeacialChars FindSomething

HeapAlloc GetProcessHeap GetTickCount GatherEmailAddressInFiles LstrcmpiA isdigit WideCharToMultiByte memcpy

ChooseUsernameForEmail ChooseDomainNameForEmail __imp_memset CheckForValidEmailAddress MaybeConvertStringToLowercase

LstrcnpA CompareStringsWithTable CompareTwoStrings LstrLenA SearchForEmailAddress __imp_memcpy

MaybeCheckSizeOfStrings LstrcpyA SearchForAtOrSpace ToLower CheckIfPunctuation isalnum strchr

isspace

Figura 10.8
Criao de threads
no sistema dentro
de um loop infinito.
Engenharia Reversa de Cdigo Malicioso

120
StartHarvestEmailThreads

GetCurrentThread HarvestEmailInFiles FindTempUserDir SetThreadPriority FindOutLookAddressBook

GetDriveTypeA SearchAddressBookFile GetWindowsDirectoryA GetEnvironmentVariableA RagOpenKeyExA RegQueryValueExA

CheckValidFileExtension FindFirstFileA FindClose FindNextFileA LstrCatA

Sleep CharLowerA LstrcpynA SearchForEmailInFiles RandomNumberGenerator CreateMapViewOfFile

HeapFree ReadSomeData ReadFile CloseHandle CreateFileA CreateFileMappingA MapViewOfFile UnMapViewOfFile GetFileSize

MaybeMapFileToMemory memset MaybeCheckForSpeacialChars FindSomething

HeapAlloc GetProcessHeap GetTickCount GatherEmailAddressInFiles LstrcmpiA isdigit WideCharToMultiByte memcpy

ChooseUsernameForEmail ChooseDomainNameForEmail __imp_memset CheckForValidEmailAddress MaybeConvertStringToLowercase

LstrcnpA CompareStringsWithTable CompareTwoStrings LstrLenA SearchForEmailAddress __imp_memcpy


Captulo 10 - Anlise do worm MyDoom

MaybeCheckSizeOfStrings LstrcpyA SearchForAtOrSpace ToLower CheckIfPunctuation isalnum strchr

isspace

Figura 10.9
Criao de threads
no sistema dentro
de um loop infinito.

121
Exerccio de fixao 2 e
Executvel escondido
H possibilidade de existir outro executvel escondido dentro do cdigo de um artefato
malicioso? Como identificar este tipo de comportamento?

Existe algum backdoor escondido?


11 O MyDoom se mantm ativo atravs de diversas tcnicas, incluindo um backdoor. q
11 Procure por dados no identificados que sejam referenciados por cdigo.

11 Procure por uma funo de decriptografia (XOR).

11 Procure por chamadas a CreateFile()/WriteFile() e a CreateProcessA().

muito comum que um programa malicioso traga junto consigo outros programas embu-
tidos, que so extrados e salvos no sistema infectado. Estes programas podem realizar
funes diversas do programa original.

No caso do MyDoom, existe um programa embutido que usado para abrir um backdoor
na mquina para permitir o acesso remoto pelo autor da ferramenta aps a mquina ter
sido comprometida.

Para encontrar este tipo de informao, lembre-se de que um programa tem um tamanho
razovel. Procure por uma grande quantidade de dados referenciados por um cdigo que
faa chamadas CreateFileA() e WriteFileA(), usado para gravar o arquivo no disco.

CreateServiceExeProcess

wsprintfA memset DropDLLBackdoor CopyFileToTemp CreateProcessA GetWindowsDirectoryA

__imp_memset writeFile ReadSomeFile CreateZinciteLogFilename GetModuleFileNameA CreateFileA CloseHandle

SetFilePointer ReadFile IstrcpyA IstrlenA IstrcatA GetTempPathA


Engenharia Reversa de Cdigo Malicioso

Concluso Figura 10.10

q
Abertura de um
11 Mesmo depois de tudo isso, ainda existem muitos dados no identificados no programa. backdoor.

11 Como ltima alternativa, possvel executar o programa dentro da mquina virtual e


analisar o tratamento desses dados.

11 Ainda existe outro binrio embutido neste programa! Voc consegue ach-lo?

11 Estude as solues sugeridas nas atividades e treine o mximo que puder.

122
O objetivo deste curso foi oferecer o conhecimento mnimo para analisar programas mali-
ciosos. importante lembrar sempre que somente o treino constante vai trazer a proficincia,
e quanto mais variados forem os exemplos utilizados, melhor.

Mesmo no exemplo usado nos dois ltimos captulos, ainda existem muitas informaes a
serem identificadas, incluindo outro binrio embutido.

11 A proficincia em engenharia reversa s vem com a experincia. q


11 Treine sempre, com o maior nmero possvel de executveis.

11 Procure nas referncias e na internet por tutoriais em engenharia reversa e anlises


de programas maliciosos. Eles so uma boa fonte de treinamento.

Treinar os conceitos apresentados nesse curso e as solues para as atividades sugeridas


um bom comeo, mas o aluno deve procurar mais informaes em outras fontes, como nos
sites indicados na bibliografia.

Captulo 10 - Anlise do worm MyDoom

123
Engenharia Reversa de Cdigo Malicioso

124
Roteiro de Atividades 10
Atividade 10.1 Como ele se propaga?
Aps a identificao de funes do programa, usaremos essas informaes para descrever
as suas caractersticas mais gerais e seus mtodos de ao, auxiliando na identificao da
praga na rede e na criao de mtodos de proteo contra novas infeces.

1. Procure por funes de acesso rede ou de envio de e-mail;

2. Procure por funes de criao e leitura de arquivos;

3. Verifique nas strings se existe alguma dica;

4. Descubra funes para criar o spam;

5. Existe algum acesso rede?

6. Como a comunicao com o servidor de e-mail?

7. Tente agora identificar as funes que fazem a criao e o envio dos e-mails com o worm
anexado. Tente identificar e analisar um mnimo de cinco funes e variveis possveis.

8. Use os comentrios no cdigo para marcar reas importantes e identificar a lgica de


criao do spam. Informaes que podem ser muito teis para o combate a essa praga
em uma rede so os possveis nomes dos arquivos anexados ou nomes de usurios para
os quais o worm ser enviado.

Atividade 10.2 Que dados ele acessa ou modifica?


Analisando o cdigo do programa:

1. Verifique os arquivos que so criados;

2. Quais chaves de registro so lidas/escritas/modificadas?

3. O programa acessa mais algum arquivo no sistema?


Captulo 10 - Roteiro de Atividades

4. Examine as referncias cruzadas s funes de acesso a arquivo, e analise as funes


que as utilizam.

5. Que dados so acessados nos arquivos lidos pelo programa malicioso? Identifique as
funes e analise o cdigo de acordo com o que foi visto na sesso terica.

125
Atividade 10.3 Como ele se mantm no sistema?
Analisando o cdigo do programa, responda:

1. O programa sobrevive ao boot?

2. Quais processos so iniciados? Tente identificar o nome dos processos.

3. Ele cria algum mutex? Quais semforos so criados pelo programa malicioso?

4. Como ele usa os recursos do sistema? Identifique as funes que so chamadas dentro
dos threads criados.

Atividade 10.4 Existe algum backdoor escondido?


1. Descubra a rea do programa que armazena o arquivo de backdoor.

2. Descubra e analise a funo que faz a decriptografia dos dados.

3. Descubra como o processo iniciado e onde ele gravado.

Atividade 10.5 Script IDC


Para essa atividade final, o aluno deve usar um programa em IDC para decriptografar a
regio do programa que contm o binrio embutido, sem precisar executar o programa.

O IDC uma ferramenta poderosa para auxiliar nesse tipo de situao. Como ensinar pro-
gramao IDC no o objetivo desse curso, e por si s j seria matria para um curso com-
pleto. Um script para realizar essa converso fornecido no diretrio de scripts IDC do IDA.

1. Utilizando o script IDC xor.idc, decodifique o binrio embutido. Leia o script para entender
seu funcionamento.

2. Modifique o script para salvar o cdigo embutido em um arquivo, j decodificado.

3. Examine o script, entenda seu funcionamento e use-o para decriptografar o


programa embutido.

Se voc se sentir confortvel, pode tentar modificar o programa para salvar o arquivo em disco
aps decodific-lo. Veja os outros arquivos IDC para ter um exemplo de como salvar arquivos.

Aps a decodificao, voc poder conferir a validade da operao examinando os dados


decodificados para verificar se realmente trata-se de um executvel.
Engenharia Reversa de Cdigo Malicioso

126
Bibliografia

11 Cartoon Hackers: http://hackerschool.org/DefconCTF/17/B300.html

11 EAGLE, Chris. The IDA Pro Book The Unofficial Guide to the Worlds Most
Popular Disassembler.

11 Free IDA Pro Binary Auditing Training Material for University Lectures:
http://www.binary-auditing.com/

11 GUILFANOV, Ilfak. TLS callbacks: http://www.hexblog.com/

11 HINES, Eric S. MyDoom.B Worm Analysis de Applied Watch Technologies:


http://isc.sans.org/presentations/MyDoom_B_Analysis.pdf

11 Malware Analysis System: https://mwanalysis.org/ (antigo CWSandbox).

11 Microsoft PE and COFF Specification: http://msdn.microsoft.com

11 OpenRCE Open Reverse Code Engineering community:


http://www.openrce.org/

11 OS X ABI Mach-O File Format Reference. Mac Developer Library, 2009.

11 PC Assembly Language Tutorial: http://www.drpaulcarter.com/cs/

11 PIETREK, Matt. A Crash Course on the Depths of Win32 Structured Exception


Handling. Microsoft Systems Journal, 1997.

11 . An In-Depth Look into the Win32 Portable Executable File


Format, 2002.

11 PORRAS et al. An Analysis of Confickers Logic and Rendezvous Points, 2009.

11 ROBERTS, Wesley. New Conficker B++ Worm Variant on the Prowl, 2009.

11 Securith-forum.net: http://forums.security-forum.net/

11 Threat Analyses de Secure Works: http://www.secureworks.com/


cyber-threat-intelligence/threats/

11 Vulnerabilities on Sophos: http://www.sophos.com/


Bibliografia

127
O curso apresenta tcnicas de anlise de malware para
apoiar a investigao forense digital e a resposta a in-
cidentes envolvendo programas mal-intencionados.
LIVRO DE APOIO AO CURSO

O objetivo fornecer aos administradores de TI habi-


lidades prticas para a anlise destes programas. So
abordados os conceitos, procedimentos e ferramentas
para a anlise de um cdigo malicioso, com o uso de
uma ferramenta para a realizao das atividades prti-
cas, que consolidam o conhecimento terico. So apre-
sentados os comandos bsicos de Assembly para que o
aluno execute a engenharia reversa de worms que afe-
taram milhares de computadores. O aluno aprender as
melhores prticas antiengenharia reversa, desenvolven-
-
zes contra cdigos maliciosos.
Este livro inclui os roteiros das atividades prticas e o
contedo dos slides apresentados em sala de aula,
-
mento em suas organizaes ou localidades de origem.

ISBN 978-85-63630-26-1

9 788563 630261

Você também pode gostar