Escolar Documentos
Profissional Documentos
Cultura Documentos
Engenharia Reversa de Código Malicioso
Engenharia Reversa de Código Malicioso
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
Edio
Pedro Sangirardi
Reviso
Lincoln da Mata
Reviso Tcnica
Thiago Oliveira Marques
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
Bibliografia: p. 127.
ISBN 978-85-63630-26-1
CDD 005.12
Sumrio
A metodologia da ESRix
Sobre o curso x
A quem se destinax
Permisses de usoxi
Sobre os autoresxii
Definio2
Formas de ataque4
Como a propagao?5
iii
Ambiente de anlise7
Virtualizao x Emulao 8
Roteiro de Atividades 19
2. Ferramentas
Montagem do ambiente de anlise11
VMWare12
Debugger13
Decompilador14
Manipuladores de binrios15
Disassembler15
IDA Pro22
Funcionalidades 23
Atalhos 24
Algoritmo de autoanlise 25
Grficos 25
Introduo ao OllyDBG28
Conhecendo o OllyDBG29
iv
Exerccio de fixao 2 OllyDGB30
Funcionalidades do OllyDBG30
Plugins31
Atalhos32
Formato PE38
Tabela de importao43
Cabealho de seo44
Assembly bsico47
Registradores49
Stack51
Layout de memria51
v
Instrues assembly: Chamada de funo57
Ramificaes63
Blocos condicionais64
Loops65
Switch66
Memcpy()/Strcpy()68
Strlen()/Strstr()68
Estruturas69
Operaes matemticas70
Nmeros randmicos71
Variveis72
Variveis de API72
Recuperao de tipos73
Lgica branchless75
Assembly bsico76
vi
Import Address Table79
Reconstruo da IAT80
Deteco de debugger88
Cdigos no alinhados90
9. Anlise de um worm
Exerccio de nivelamento 1 Anlise de strings97
Descobrindo o bsico97
Emulao99
Strings99
Funes importadas100
vii
Assinaturas de cdigo101
Visualizao grfica102
Anlise de backtrace104
Funes bsicas105
Anlise de cdigo106
Anlise do MyDoom111
Concluso122
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 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.
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.
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.
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.
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.
De acordo com a literatura existente, a engenharia reversa pode ser descrita como o pro-
Captulo 1 - Introduo engenharia reversa
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:
Exerccio de nivelamento 1 e
Arquivos maliciosos
Todos os arquivos maliciosos podem ser classificados como vrus? Qual a principal caracte-
rstica de um vrus?
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 Possveis ameaas.
Engenharia Reversa de Cdigo Malicioso
2
Exerccio de fixao 2 e
Diferena entre vrus e trojan
Qual a diferena entre um vrus e um trojan?
11 Worm.
11 Spyware.
11 Rootkit.
11 Vrus: software que infecta outras aplicaes e as usa como vetor de infeco de
outros arquivos.
11 Spyware: aplicao maliciosa usada para coletar informaes pessoais sobre o usurio
de um computador.
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.
11 Infeco de arquivos. q
11 Explorao de vulnerabilidades.
11 Engenharia social.
11 Destruio de dados.
11 Roubo de informaes.
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 Engenharia social.
11 E-mails em massa.
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.
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)?
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.
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 as modificaes causadas pelo programa pode ajudar a recuperar o estado sadio
do sistema, ou identificar possveis maneiras de combater novas infeces.
11 Roubo de informaes?
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.
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.
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 Gasta muito tempo e recurso, pois a cada execuo do programa malicioso, preci-
samos recuperar o estado inicial do sistema.
11 Ambiente virtual:
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
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 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.
A emulao tem algumas vantagens sobre a virtualizao simples, pois permite controlar a
forma como o cdigo binrio vai ser executado pelo processador.
Engenharia reversa:
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.
6. C:\Windows;C:\Docume~1\
9. Clique em 2nd Shot e depois em Shot, e quando terminar, clique em Compare para
gerar a diferena entre as execues.
9
Ao final do exerccio, o RegShot abrir uma janela do Internet Explorer com o contedo das
modificaes identificadas por ele.
Perguntas:
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
conceitos
Ambiente de anlise, virtualizao, debuggers, decompiladores e disassemblers.
11 Debuggers.
11 Decompiladores.
11 Disassemblers.
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 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 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 Execuo passo-a-passo.
11 Visualizao de threads.
11 Visualizar threads;
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.
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.
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:
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
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.
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
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;
22 D:\Windows_XPSP2_Malware\winXPPro.vmx
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.
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
17
Atividade 2.2 Ferramentas de decompilao
1. Execute Rec/RecStudio;
3. Qual a sua opinio sobre o resultado obtido? Discuta com seus colegas situaes onde
este tipo de ferramenta pode ser til.
18
3
Introduo ao IDA Pro e OllyDBG
objetivos
conceitos
IDA Pro, OllyDbg.
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.
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.
11 Interativo, pois possvel interagir com seu banco de dados, corrigindo o que ele no
conseguir identificar automaticamente.
FLIRT:
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.
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
Durante o curso: q
11 Ser utilizado IDA Pro 5.0 Free.
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).
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.
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.
Exerccio de fixao 1 e
Conhecendo o IDA Pro
O IDA Pro um decompilador ou um disassembler?
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.
22
Funcionalidades
11 Viso hexadecimal. q
11 Lista de funes.
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 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.
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.
Atalhos
Atalhos e navegao: q
11 R: transforma valor hexa em caractere.
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.
24
Algoritmo de autoanlise
Algoritmo de autoanlise do IDA: q
1. Carregue o arquivo e crie os segmentos.
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.
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.
Grficos
Captulo 3 - Introduo ao IDA Pro e OllyDBG
Grficos de chamadas: q
11 Os programas analisados podem ser visualizados como grficos.
25
sub_4055E4
Figura 3.2
__imp_GetLastError __imp_SetFileAttributesA Grficos de
chamadas
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.
11 Abra o arquivo: q
\Desktop\Exemplos\Sessao3\mal.Down.nopack.worm.exe
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.
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.
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.
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.
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.
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.
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.
Introduo ao OllyDBG
11 Freeware. q
11 Contm diversas funcionalidades cracker friendly.
28
11 Controlvel atravs de scripts OllyScript. q
11 Contm um disassembler poderoso.
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.
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.
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.
11 Endereo da instruo;
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.
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 mapa de memria, que mostra a estrutura das sees do programa na memria, pode ser
acessado com o boto M.
Expresses monitoradas podem ser visualizadas na janela de log da tela principal, ou na tela
de watches acessvel pelo menu View g Watches.
Os plugins instalados nesta verso do Olly incluem no somente os padres, mas tambm
Captulo 3 - Introduo ao IDA Pro e OllyDBG
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 Hide Debugger: implementa diversas funes para esconder o OllyDBG do programa analisado;
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 F12: pausa.
11 CTRL+F7: animate.
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.
2. Abra a janela Type Libraries (View g Open Subviews g Type Libraries), observando que
o compilador identificado vc6win.
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.
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?
3. Encontre o endereo de memria onde o binrio vai ser descompactado, e v para este
endereo no dump de memria (Control+g);
6. Clique no boto de Pause (||) para parar ou no boto << para restaurar o programa para
o estado inicial.
34
De acordo com o arquivo TXT indicado acima, um arquivo compactado com UPX tem no seu
entry point o seguinte contedo:
60 PUSHAD
57 PUSH EDI
90 NOP
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.
35
36
Engenharia Reversa de Cdigo Malicioso
4
Formato de arquivos executveis
objetivos
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?
11 Dessa forma, o sistema sabe onde encontrar o cdigo, recursos, bibliotecas, e como
mapear tudo isso no espao de memria reservado ao programa.
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.
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?
Formato PE
11 Formato de arquivos Portable Executable (PE): q
22 A Microsoft baseou o formato PE no antigo formato COFF do Unix.
11 Arquivos PE:
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
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 seguir, temos o stub DOS, que o cdigo responsvel por imprimir a mensagem This
program cannot be run in DOS mode.
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 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:
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.
11 .data, .rdata ou .bss dados; normalmente BSS usado para armazenar dados dinmicos
durante a execuo, por exemplo na descompactao do binrio.
22 TimeDateStamp: no crtico, mas pode indicar a data em que o arquivo foi criado.
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.
11 ImageBase: endereo usado como base para todos os endereos relativos no cdigo.
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
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.
Abaixo esto descritas algumas das principais tabelas existentes no cabealho PE. Essas
tabelas so as mais importantes durante a anlise de um binrio malicioso:
Tabela de importao
Captulo 4 - Formato de arquivos executveis
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.
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.
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.
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
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;
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;
45
Para mais informaes sobre o formato PE, consulte os arquivos:
46
5
Assembly bsico parte 1
objetivos
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?
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:
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.
11 As instrues podem: q
22 Referenciar ou manipular posies de memria.
22 Fazer clculos.
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.
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.
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.
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.
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.
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.
11 EDI
11 ESP/EBP
11 EIP
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 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).
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:
Layout de memria
Captulo 5 - Assembly bsico parte 1
Separao de memria: q
11 Sistemas baseados em Windows dividem estes 4 GB em duas partes: memria do
kernel e do usurio.
51
11 Os endereos virtuais so divididos em pginas de 4096 bytes. q
11 O acesso memria feito no nvel de pginas.
0x00030000 Heap
0x00150000 Heap
0x71ab0000 WS2_32.DLL
0x7c800000 KERNEL32.DLL
0x7c900000 NTDLL.DLL
Figura 5.4
Mapeamento de
0x7f000000
um processo na
Engenharia Reversa de Cdigo Malicioso
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.
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.
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?
22 Podemos registrar uma funo para tratar erros de E/S ou divises por zero,
por exemplo.
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.
54
11 Ponteiros so indicados por [] q
22 Ex: [EAX] = *EAX = Contedo do endereo apontado por EAX.
A seguir faremos uma rpida reviso de alguns comandos mais usados em assembly.
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.
22 Ex: PUSHF.
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 Manipulao de registradores:
22 MOV, LEA.
11 Comparao de valores:
22 CMP, TEST.
11 Controle de fluxo:
11 Manipulao de Stack:
22 PUSH, POP.
11 Operao binria:
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.
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.
11 Endereamento indireto.
56
11 Endereamento indexado. q
11 Endereamento indexado escalado.
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];
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.
11 stdcall
11 fastcall
11 thiscall
Captulo 5 - Assembly bsico parte 1
33 Microsoft: ECX.
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.
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).
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.
stdcall
funcao(arg1, arg2);
push arg2
push arg1
call funcao
cdecl
funcao(arg1, arg2);
push arg2
push arg1
Engenharia Reversa de Cdigo Malicioso
call funcao
add esp, 8
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.
11 Modo tradicional:
push ebp
mov ebp, esp
sub esp, 0x100
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.
11 [EBP + valor]
11 [EBP - valor]
Captulo 5 - Assembly bsico parte 1
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);
59
60
Engenharia Reversa de Cdigo Malicioso
Roteiro de Atividades 5
Atividade 5.1 Structured Exception Handling
00401000 MOV EAX,4BA070
\Desktop\Malware\mal.Banker-Down.PECompact.worm.scr
4. Ao executar 0x00401016, ser gerada uma exceo, que deve ser passada ao programa
com Shift-F7;
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
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?
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 EBX:
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:
Blocos condicionais
if (var > 128) q
var = 128;
jbe skip
skip:
uma comparao e um nico desvio de fluxo. No cdigo existem diversos exemplos desse
tipo de estrutura.
var = 128;
jbe skip
64
mov eax, 0x80
skip:
Loops
for (i = 0; i < 100; i++) q
do_something();
start:
jge exit
call do_something
inc eax
jmp start
exit:
do_something();
start:
jge exit
call do_something
inc eax
jmp start
Captulo 6 - Assembly bsico parte 2
exit:
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) {
jmp switch_table[eax*4]
case_0:
jmp end
case_1:
66
jmp end q
end:
switch (var) {
jmp switch_table[eax*4]
case_0:
jmp end
case_1:
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]
MOV EAX, 3h
JMP off_407F8C[EAX*4]
Captulo 6 - Assembly bsico parte 2
dd offset loc_404394
dd offset loc_4045FC
dd offset loc_4046E4
67
Memcpy()/Strcpy()
memcpy() / strcpy() inline q
mov esi, origem
shr ecx, 2
rep movsd
and ecx, 3
rep movsb
Este tipo de estrutura pode ser encontrada em qualquer programa que trabalhe com strings.
shr ecx, 2
rep movsd
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
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 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).
or ecx, 0xFFFFFFFF
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
push esi
ja short loc_12345678
; tem 8 bytes
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
push esi
ja short loc_12345678
; tem 8 bytes
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.
33 SHR EAX, 2.
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
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
Nmeros randmicos
Pseudo geradores de nmeros randmicos.
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||
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 Inteiros de ponteiros?
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
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.
Recuperao de tipos
Inteiros x Ponteiros: q
11 Inteiros nunca so desreferenciados.
11 Aritmtica com ponteiros geralmente simples, mas com inteiros costuma ser complexa.
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.
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
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.
push 0x100
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.
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
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
inc eax
pop esi
pop ebx
Captulo 6 - Assembly bsico parte 2
retn
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 Examine alguns programas com o debugger, executando passo a passo com F7.
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.
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.
77
78
Engenharia Reversa de Cdigo Malicioso
7
Import Address Table
objetivos
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?
11 Geralmente eles resolvem por conta prpria estes smbolos, ou movem a tabela de
smbolos para um local no padro.
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.
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 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 Por isso, importante salvar o estado da sua mquina virtual antes, para no
compromet-la.
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.
Figura 7.1
Feramenta
ImportRec.
\Desktop\install\OllyDbg\OLLYSCRIPTS\
Captulo 7 -
81
82
Engenharia Reversa de Cdigo Malicioso
Roteiro de Atividades 7
Atividade 7.1 Recuperando a IAT com ferramentas
Primeira parte
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
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;
Agora que j vimos como fazer a recuperao automaticamente, vamos entender o procedi-
mento de recuperao manual.
Primeira parte
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;
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:
Analise este cdigo com seus colegas e faa um relatrio com suas concluses.
Engenharia Reversa de Cdigo Malicioso
84
Segunda parte
3. O que acontece com o mapa de memria do processo aps carregar todas as DLLs?
Terceira parte
85
86
Engenharia Reversa de Cdigo Malicioso
8
Truques anti-engenharia reversa
objetivos
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?
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.
Deteco de debugger
11 Kernel32.IsDebuggerPresent() q
11 INT 3 (0xCC)
11 Timers
11 Exemplos:
22 start = GetTickCount();
22 alguma_funcao();
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.
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.
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?
22 http://www.insomniasec.com/publications/PreDebug.pdf
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.
89
11 Dentro dessa estrutura, existe um campo importante: AddressOfCallBacks. q
11 Ele aponta para uma lista de funes de callback.
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.
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 Tcnicas de realocao:
22 Realocao serve para modificar ponteiros no cdigo, caso a base da imagem seja
realocada na memria.
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
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.
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.
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 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: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?
11 Instrues privilegiadas.
22 http://invisiblethings.org/papers/redpill.html
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.
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
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?
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;
No OllyDBG, basta digitar qualquer caractere na linha que deseja mudar, e ele
insere estes caracteres nessa linha.
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
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.
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
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?
Descobrindo o bsico
Roteiro de engenharia reversa: q
11 Comece sempre pelo mais simples:
22 Strings.
22 Funes importadas.
22 Aplicao de assinaturas.
22 Quem as utiliza?
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 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.
Veremos neste captulo um pouco mais sobre essas tcnicas mais simples.
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/
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.
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.
Funes importadas
q
Figura 9.1
Engenharia Reversa de Cdigo Malicioso
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.
Assinaturas de cdigo
Aplicao de assinaturas: q
11 Use assinaturas para identificar automaticamente funes de bibliotecas padro.
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
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
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
102
public start
start proc near ; CODE XREF:
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
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.
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.
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]
11 Comece pelas funes do entry point e por aquelas que utilizam funes importadas.
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 ||||||||||||||||||||||||||||||||||||||
Figura 9.6
Anlise de cdigo Identificao de
funes bsicas.
Agora a sua vez! Consegue chegar at aqui?
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.
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;
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;
2. Encontre e analise pelo menos trs funes que utilizem estas chamadas a bibliotecas.
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.
2. Identifique as funes chamadas a partir do entry point e pelo menos trs chamadas a
partir de sub_5031E4;
109
Atividade 9.5 Anlise de backtrace
1. Navegue at a rea de funes importadas (em rosa no navegador);
3. Identifique como o cdigo faz a chamada funo importada, para identificar e analisar
pelo menos cinco funes do programa.
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
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:
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?
11 Veja nas strings se existe alguma dica e descubra funes para criar um spam.
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
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.
SendSpam
RegEnumKeyA RegOpenKeyExA memset RegQueryValueExA wsprintfA MaybeTalkToMailServer TalkToMailServer Captulo 10 - Anlise do worm MyDoom
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.
113
Quais dados so acessados ou modificados?
11 Verifique os arquivos que so criados. q
11 Quais chaves de registro so lidas/escritas/modificadas?
22 FindFirstFileA()
22 FindNextFileA()
22 MapViewOfFile()
22 GetDriveType()
22 GetEnvironmentVariableA()
22 Entre outros.
As funes sugeridas acima mostram apenas uma parte das possveis funes de acesso a
arquivo que podem ser encontradas no programa.
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.
... ...
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.
A seguir, precisamos descobrir como o programa analisado faz para se manter no sistema.
Na maioria dos casos, os programa maliciosos tentam instalar algum tipo de mecanismo
para serem reiniciados caso o computador seja desligado.
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.
33 \Software\Microsoft\Windows\CurrentVersion\Run
116
11 Outras formas de sobreviver ao boot seriam: q
33 Instalar um servio.
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
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
Figura 10.5
Criando uma chave RegOpenKeyExA IstrlenA RegSetValueExA
de registro.
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
33 Arquivos.
33 Semforos no kernel.
33 Chaves no registro.
11 Procure por:
22 Ocorrncias de CreateMutexA().
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 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.
CreateSystemMutex
Figura 10.7
Mutex por chaves __imp_memset RegCreateKeyExA RegOpenKeyExA
de registro.
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.
119
StartHarvestEmailThreads
isspace
Figura 10.8
Criao de threads
no sistema dentro
de um loop infinito.
Engenharia Reversa de Cdigo Malicioso
120
StartHarvestEmailThreads
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?
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
q
Abertura de um
11 Mesmo depois de tudo isso, ainda existem muitos dados no identificados no programa. backdoor.
11 Ainda existe outro binrio embutido neste programa! Voc consegue ach-lo?
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.
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.
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.
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:
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.
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.
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.
126
Bibliografia
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 ROBERTS, Wesley. New Conficker B++ Worm Variant on the Prowl, 2009.
11 Securith-forum.net: http://forums.security-forum.net/
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
ISBN 978-85-63630-26-1
9 788563 630261