Escolar Documentos
Profissional Documentos
Cultura Documentos
Engenharia Reversa de Código Malicioso PDF
Engenharia Reversa de Código Malicioso PDF
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
Diretor Geral
Nelson Simes
Diretor de Servios e Solues
Jos Luiz Ribeiro Filho
Bibliografia: p. 127.
ISBN 978-85-63630-26-1
1. Engenharia de software. 2. Assembly (Linguagem de programao). 3. Segurana
de software. 4. IDA Pro (software). 5. OllyDBG (software). I. Ttulo.
CDD 005.12
Sumrio
Escola Superior de Redes
A metodologia da ESRix
Sobre o curso x
A quem se destinax
Convenes utilizadas neste livrox
Permisses de usoxi
Sobre os autoresxii
Ambiente de anlise7
Virtualizao x Emulao 8
Anlise ao vivo x Engenharia reversa 8
Roteiro de Atividades 19
Atividade 1.1 Anlise dinmica de binrio desconhecido9
2. Ferramentas
Montagem do ambiente de anlise11
Exerccio de nivelamento 1 Ferramentas11
VMWare12
Exerccio de fixao 1 VMWare13
Debugger13
Debuggers para Windows13
Exerccio de fixao 1 Decompilador e disassembler14
Decompilador14
Exerccio de fixao 2 Arquivos binrios14
Manipuladores de binrios15
Disassembler15
Roteiro de Atividades 217
Atividade 2.1 Configurao do VMWare17
Atividade 2.2 Ferramentas de decompilao18
Atividade 2.3 Ferramentas de manipulao de binrios18
iv
vi
9. Anlise de um worm
Exerccio de nivelamento 1 Anlise de strings97
Descobrindo o bsico97
Exerccio de fixao 1 Identificao do cdigo 99
Emulao99
Strings99
Funes importadas100
vii
Assinaturas de cdigo101
Visualizao grfica102
Exerccio de fixao 2 Identificao do cdigo II104
Anlise de backtrace104
Funes bsicas105
Anlise de cdigo106
Roteiro de Atividades 9109
Atividade 9.1 Strings109
Atividade 9.2 Funes importadas109
Atividade 9.3 Assinatura de cdigo109
Atividade 9.4 Visualizao grfica109
Atividade 9.5 Anlise de backtrace110
Atividade 9.6 Funes bsicas110
Bibliografia 127
viii
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 tpicos da realidade do profissional em formao. Os resultados obtidos nos cursos de natureza
terico-prtica so otimizados, pois o instrutor, auxiliado pelo material didtico, atua no
apenas como expositor de conceitos e informaes, mas principalmente como orientador do
aluno na execuo de atividades contextualizadas nas situaes do cotidiano profissional.
A aprendizagem entendida como a resposta do aluno ao desafio de situaes-problema
semelhantes s encontradas na prtica profissional, que so superadas por meio de anlise,
sntese, julgamento, pensamento crtico e construo de hipteses para a resoluo do problema, em abordagem orientada ao desenvolvimento de competncias.
Dessa forma, o instrutor tem participao ativa e dialgica como orientador do aluno para as
atividades em laboratrio. At mesmo a apresentao da teoria no incio da sesso de aprendizagem no considerada uma simples exposio de conceitos e informaes. O instrutor
busca incentivar a participao dos alunos continuamente.
ix
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.
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 anlise forense pelo Instituto SANS.
Thiago Oliveira Marques formado em Cincias da Computao pelo Centro Universitrio de Barra Mansa. Trabalha com engenharia reversa desde 2007, desenvolvendo
protees e ministrando treinamentos e palestras relacionadas anlise de malware,
no Brasil e no exterior.
Edson Kowask Bezerra profissional da rea de segurana da informao e governana
h mais de quinze anos, atuando como auditor lder, pesquisador, gerente de projeto
e gerente tcnico, em inmeros projetos de gesto de riscos, gesto de segurana da
informao, continuidade de negcios, PCI, auditoria e recuperao de desastres em
empresas de grande porte do setor de telecomunicaes, financeiro, energia, indstria
e governo. Com vasta experincia nos temas de segurana e governana, tem atuado
tambm como palestrante nos principais eventos do Brasil e ainda como instrutor de
treinamentos focados em segurana e governana. professor e coordenador de cursos
de ps-graduao na rea de segurana da informao, gesto integrada, de inovao e
tecnologias web. Hoje atua como Coordenador Acadmico de Segurana e Governana
de TI da Escola Superior de Redes.
xii
1
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
Introduo
Engenharia reversa:
objetivos
Alguns exemplos de situaes onde a engenharia reversa pode auxiliar, alm da anlise de
programas maliciosos:
11 Desenvolvimento de driver para um dispositivo;
11 Entendimento do funcionamento de um programa proprietrio, para desenvolvimento de
verso livre que no use o mesmo cdigo do programa proprietrio;
11 Entendimento de protocolos para permitir compatibilidade entre produtos existentes e
futuros produtos desenvolvidos;
11 Documentao de cdigo legado, para o qual no exista mais o cdigo-fonte.
Exerccio de nivelamento 1 e
Arquivos maliciosos
Todos os arquivos maliciosos podem ser classificados como vrus? Qual a principal caracterstica 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
11 Possveis ameaas.
A engenharia reversa de arquivos maliciosos envolve no somente a anlise de cdigo
executvel, mas em muitos casos, de protocolos de comunicao, criptografia de dados,
entre outros. Este estudo permite identificar as funes executadas por determinado cdigo
malicioso, permitindo assim sua identificao em dispositivos infectados, e em muitos casos
a remoo dos mesmos do sistema.
Outro objetivo na anlise de programas maliciosos permitir aos times de tratamento de
incidentes a identificao e o combate ao destes programas em redes e sistemas on-line.
Exerccio de fixao 2 e
Diferena entre vrus e trojan
Qual a diferena entre um vrus e um trojan?
11 Trojan.
11 Worm.
11 Spyware.
11 Rootkit.
muito difcil catalogar todos os tipos de programas maliciosos existentes atualmente.
Apresentamos abaixo uma lista com exemplos de possveis pragas que podem ser encontradas ao analisar um programa desconhecido. Muitas vezes, o programa vai se encaixar em
mais de uma classificao:
11 Vrus: software que infecta outras aplicaes e as usa como vetor de infeco de
outros arquivos.
11 Trojan: aplicao que tem um funcionamento malicioso baseado na diferena daquilo
que se espera que ela faa.
11 Worm: cdigo malicioso com capacidade de se espalhar de um computador para outro
atravs de diversos protocolos de rede.
11 Spyware: aplicao maliciosa usada para coletar informaes pessoais sobre o usurio
de um computador.
11 Rootkit: ferramenta capaz de esconder a presena de programas, usurios ou
servios maliciosos.
Hoje em dia os programas maliciosos utilizam tcnicas diversas para descobrir e infectar
sistemas vulnerveis, e para se esconder de possveis mecanismos de deteco. Ao infectar
um sistema, eles costumam instalar diversos outros programas maliciosos, comprometendo
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:
C/C++, onde um parmetro para uma funo de string (printf por exemplo) no verificado,
permitindo a manipulao da memria escrita no Stack e consequentemente a execuo do
cdigo malicioso.
Finalmente, ataques de engenharia social so difceis de combater, pois dependem exclusivamente da ingenuidade do usurio do computador. Estes ataques induzem o usurio a executar o programa malicioso ou divulgar inconscientemente informaes pessoais ou sigilosas.
hoje em dia um dos principais vetores de ataque utilizados por programas maliciosos.
Exemplo disso so os milhares de spams enviados diariamente, com fotos ou relatrios
falsos anexados, ou links para pginas e arquivos maliciosos para serem executados.
Como a propagao?
11 Se por rede, qual a velocidade de propagao?
11 Servidor IRC?
11 Abre alguma porta de servio?
11 Busca dados em alguma pgina web?
11 Recebe algum tipo de comando remoto?
11 Tem algum temporizador para executar funes programadas?
A lista de funcionalidades de um programa malicioso atual, como os bots, pode ser gigantesca. Um programa desse tipo pode dar controle total ao invasor sobre a mquina invadida,
e permitir que ele execute praticamente qualquer funo remotamente.
Descobrir estas funes pode ajudar na identificao de comportamentos estranhos em um
sistema, ou a deteco de informaes que possam estar sendo coletadas pelo invasor.
Exerccio de fixao 4 e
Ambiente virtualizado
Qual a finalidade de um ambiente virtualizado?
Ambiente de anlise
Como analisar estes programas?
Virtualizao x Emulao
11 Tecnologias de virtualizao tais como VMWare capturam todo o acesso a hardware,
Mas ela no permite descobrir facilmente as funcionalidades que sejam ativadas por uma
Roteiro de Atividades 1
Atividade 1.1 Anlise dinmica de binrio desconhecido
Esta atividade demonstra uma possvel anlise dinmica de um binrio desconhecido, em
um ambiente virtual. O objetivo identificar mudanas no sistema causadas pela execuo
de um programa desconhecido. Para isso, utilizamos a ferramenta RegShot, um utilitrio
livre que permite monitorar mudanas em arquivos e no registro, e comparar dois estados
do sistema, para identificar mudanas.
O aluno deve abrir a mquina virtual disponibilizada para o curso, que contm um sistema
operacional Windows XP Pro com Service Pack 2.
Para garantir que todos os alunos tenham um ambiente igual, foi gerado um snapshot
chamado Incio das aulas.
1. Inicie o VMWare e abra a imagem D:\Windows_XPSP2_Malware\WinXPPro.vmx.
2. Restaure o snapshot Incio das aulas.
3. Execute o Process Explorer, o atalho encontra-se no desktop, e mantenha-o aberto
durante o exerccio, para examinar os processos em execuo.
4. Execute a ferramenta RegShot no desktop;
5. Marque a opo HTML Document e Scan Dir, acrescentando a linha abaixo:
6. C:\Windows;C:\Docume~1\
7. Clique em 1st Shot e escolha Shot;
8. Execute o cone acer.jpg.exe no desktop;
9. Clique em 2nd Shot e depois em Shot, e quando terminar, clique em Compare para
Ao final do exerccio, o RegShot abrir uma janela do Internet Explorer com o contedo das
modificaes identificadas por ele.
Perguntas:
1. Que modificaes o programa causou no sistema?
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.
10
2
Criar um ambiente de anlise e utilizar as ferramentas para auxiliar a anlise
do cdigo e entender as diferenas entre elas, identificando a melhor utilizao
de cada uma.
conceitos
11 Mquinas virtuais.
11 Ferramentas de anlise dinmica.
11 Debuggers.
11 Decompiladores.
11 Disassemblers.
11 Ferramentas de manipulao de arquivos executveis.
A anlise de binrios suspeitos pode envolver diversas tcnicas, e por isso recomenda-se
que o ambiente usado pelo analista atenda a todas essas necessidades. O uso de mquinas
virtuais facilita muito esse tipo de anlise, pois permite ao analista no somente ter as ferramentas 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
Ferramentas
O que um debugger?
Captulo 2 - Ferramentas
objetivos
Ferramentas
11
VMWare
11 Salvamento de estado em background.
l
Marcando a opo
disable acceleration
nas configuraes da
mquina virtual, alguns
programas maliciosos
deixam de detectar o
VMWare.
Figura 2.1
Snapshot Manager.
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-
Captulo 2 - Ferramentas
13
Entre os exemplos de debugger para Windows, o SoftIce foi durante muito tempo conside-
rado o melhor debbuger existente, pois era extremamente poderoso. Ele foi descontinuado
em 2006, mas continua sendo uma referncia.
Exerccio de fixao 1 e
Decompilador e disassembler
Qual a diferena entre um decompilador e um disassembler?
Decompilador
Ferramenta que tenta traduzir dados binrios em uma linguagem de alto nvel, geralmente
plugins para o IDA Pro. As demais so ferramentas stand-alone, sendo que o REC Studio
14
a mais estvel.
Exerccio de fixao 2 e
Arquivos binrios
O que so arquivos binrios?5
Muitos compiladores
vm com suas prprias
verses de debugger.
Em http://www.
thefreecountry.com/
compilers/cpp.shtml
podem ser encontrados diversos
compiladores gratuitos,
muitos dos quais
possuem debugger
interno e outras
ferramentas de
debugging.
Manipuladores de binrios
Ferramentas de manipulao de binrios:
11 LordPE
22 http://www.woodmann.net/collaborative/tools/index.php/LordPE
11 PEiD
22 http://www.peid.info/
11 ImportREC
22 http://vault.reversers.org/ImpRECDef
11 PE Explorer (comercial)
22 http://www.heaventools.com/overview.htm
Durante o curso veremos exemplos de ferramentas para manipulao de binrios. O ltimo link
Disassembler
11 O que um disassembler?
22 uma ferramenta de anlise esttica que transforma bytes em linguagem assembly.
11 Praticamente todos os debuggers podem realizar o disassembly de um executvel.
11 O aspecto mais difcil em relao ao disassembly diferenciar o que cdigo
executvel do que apenas dado.
Captulo 2 - Ferramentas
15
11 IDA Pro
22 http://www.hex-rays.com/idapro/
11 OllyDBG
22 http://www.ollydbg.de/
11 Fenris
22 http://lcamtuf.coredump.cx/fenris
11 PE Browser
22 http://www.smidgeonsoft.prohosting.com/pebrowse-pro-file-viewer.html
Entre as ferramentas de disassembly, a mais conhecida e considerada a melhor o IDA Pro.
Apesar disso, outra boa ferramenta que pode ser usada em conjunto com o IDA Pro o
OllyDBG. Com essas duas ferramentas, possvel analisar praticamente qualquer tipo de
arquivo suspeito, mesmo aqueles que tentam se proteger de anlises.
No link abaixo h uma lista com diversas ferramentas de disassembly para download:
16
11 http://www.woodmann.net/collaborative/tools/index.php/Category:Disassemblers
Roteiro de Atividades 2
Atividade 2.1 Configurao do VMWare
Esta atividade instrui o aluno a iniciar o sistema e prepar-lo para as prximas sesses. Por
isso, este roteiro descreve todas as aes que o aluno dever executar risca, para ter um
sistema pronto para as prximas sesses.
Ser utilizado o sistema operacional Windows XP Pro com Service Pack 2, com uma licena
temporria de 60 dias.
Para modificar as configuraes do sistema operacional, ele deve estar parado, isto , o
aluno deve fazer o shutdown do sistema operacional se ele ainda estiver ativo desde a
ltima sesso, ou se estiver em estado de pausa.
11 Execute o VMWare;
11 Abra a mquina virtual fornecida:
22 D:\Windows_XPSP2_Malware\winXPPro.vmx
11 Desabilite a acelerao nas configuraes da VM;
11 Compartilhe um diretrio para ser acessado pela mquina virtual;
11 Inicie o sistema, faa um snapshot e salve como Incio das atividades.
Na aba Hardware, o aluno deve confirmar que a configurao da interface de rede ethernet
est como Host-only, pois assim a mquina virtual no ter acesso internet.
Na aba Options, opo Shared Folders, o aluno dever verificar se existe um compartilhamento ativo, apontando para o diretrio malware presente no CD do aluno ou no disco da
mquina host.
Apenas como exemplo, est configurado na mquina virtual disponvel no CD do aluno um
diretrio compartilhado apontando para um diretrio em meu sistema. Este compartilhamento dever ser removido ou modificado para apontar para um diretrio existente.
Repare que o aluno poder acessar esse compartilhamento depois atravs do Explorer,
indicando no lugar do IP da mquina host, o endereo \\vmware-host\ e o nome do compartilhamento, 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.
sero executadas todas as atividades daqui para a frente. Ao executar uma atividade que
exija a execuo de cdigo malicioso e o consequente comprometimento da mquina, o
aluno poder retornar a este snapshot para ter novamente um sistema limpo.
Finalmente, o aluno dever ligar o sistema operacional e fazer um snapshot, a partir do qual
17
funcionalidades que voc considera mais teis e as situaes em que elas podem ajudar.
18
3
Apresentar as ferramentas de disassembly mais utilizadas para engenharia reversa,
mostrando suas diferenas e principais funcionalidades.
conceitos
objetivos
com que suas possibilidades de anlise sejam praticamente ilimitadas. Os scripts podem
19
ser desenvolvidos tanto em sua prpria linguagem, o IDC, como em Python, C e Perl, entre
outras. Justamente por isso, existem na internet centenas de ferramentas escritas para
integrao com o IDA Pro.
Interactive Disassembler Pro:
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.
20
Durante o curso:
11 Ser utilizado IDA Pro 5.0 Free.
11 Os arquivos de exemplo esto nas pastas Exemplos e Malware no desktop.
11 Sempre que houver comprometimento da mquina, restaurar o ltimo snapshot sadio.
11 Por isso, evite executar os arquivos maliciosos durante o curso, a no ser quando indicado
11 Para comear, vamos configurar o IDA Pro Free para facilitar o uso.
Neste curso vamos utilizar o IDA Pro Free. Esta verso distribuda livremente atravs do
site do IDA Pro, mas no conta com uma srie de funcionalidades da verso atual (6.x).
A principal caracterstica faltante a visualizao da listagem assembly em forma de grfico,
que facilita a identificao de estruturas e fluxo. Na verso Free no possvel usar os
plugins compilados para as verses comerciais, o que mais um incentivo para a compra da
verso comercial.
Os arquivos de exemplo vo estar disponveis dentro da mquina virtual, nos diretrios
Exemplos e Malware no desktop. Estes arquivos so realmente maliciosos, coletados
pelo CAIS atravs do projeto de banco de dados de malwares. Estes arquivos devem ser
manipulados em observncia aos preceitos de segurana e tica.
Durante o curso ser necessrio, em alguns casos, executar o arquivo malicioso de forma
a auxiliar a anlise. Nestes casos, onde ocorre o comprometimento da mquina virtual,
deve-se recuperar o ltimo estado salvo do VMWare, para retornar a mquina virtual a um
estado sadio.
Por isso importante relembrar a criao de um diretrio compartilhado entre a mquina
virtual e a mquina host, para que ele sempre grave qualquer arquivo que deseja manter
neste diretrio, pois ao recuperar o estado salvo, os arquivos armazenados dentro da
mquina virtual sero perdidos.
Salve o estado da mquina logo no incio desse captulo, para ter um ponto de
retorno mais atualizado para recuperar a mquina aps uma infeco.
Exerccio de fixao 1 e
Conhecendo o IDA Pro
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
Endereamento
Highlight
de sintaxe
rea de
disassembly
Jumps e uxo
do cdigo
rea de
mensagens
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 informao, 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.
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 vermelho para reas com problemas na identificao. O IDA permite navegar no cdigo dando
um duplo clique em algum objeto nomeado.
Por ltimo, na parte mais direita, o IDA mostra as referncias e comentrios.
Na parte inferior da tela so mostradas as mensagens do programa e de sada dos plugins e
scripts. Essa rea deve ser examinada para descobrir se a funo executada teve sucesso ou no.
22
Figura 3.1
IDA Pro.
Funcionalidades
11 Viso hexadecimal.
11 Lista de funes.
11 Lista de nomes e smbolos.
11 Lista de funes importadas.
11 Lista de funes exportadas.
11 Lista de strings.
11 Estruturas e enumeraes.
11 Debugger.
11 Referncias cruzadas.
11 Scripts IDA.
11 Viso hexadecimal: mostra o contedo dos bytes do programa. Pode ser sincronizada
com a listagem disassembly, de forma a sempre exibir o mesmo local que est sendo
mostrado na listagem. Isto pode ser muito til para identificar partes do cdigo que no
foram identificadas automaticamente pelo IDA, ou que foram identificadas erroneamente.
Por exemplo, o analista pode com o IDA identificar uma string de texto como cdigo, e
observando a viso hexadecimal fazer a correo no banco de dados.
11 Lista de funes: mostra todas as funes identificadas pelo IDA, tanto as pertencentes
a bibliotecas, quanto aquelas nomeadas automaticamente. Um duplo clique em qualquer
uma delas leva funo na listagem disassembly; clicando com o boto direito possvel
visualizar e modificar informaes sobre as flags da funo.
11 Lista de nomes: mostra todos os nomes identificados e criados automaticamente pelo
IDA ou criados pelo analista. Atravs dessa lista voc pode chegar rapidamente a qualquer dado identificado dentro do programa.
11 Lista de funes importadas: mostra a lista de funes que o IDA identifica como sendo
importadas de DLLs externas, que so representadas no cdigo apenas por suas declaraes.
11 Lista de funes exportadas: as funes que o programa exporta. Para uma DLL,
conter todas as funes exportadas, mas para um binrio, ela normalmente contm
todos os entry points do programa.
11 Lista de strings: mostra todos os textos reconhecidos pelo IDA. Essa lista gerada dinamicamente, e normalmente o IDA reconhece somente um tipo especfico e bsico de string
com o boto direito na janela de string, e escolher Setup. Nesta tela tambm possvel
escolher a opo Ignore instruction/data definition, que far com que o IDA procure por
strings at dentro de funes. Isto pode aumentar os falsos positivos, mas tambm pode
resolver o problema do IDA no encontrar certas strings misturadas com cdigo.
11 Estruturas e enumeraes: nas janelas Structures e Enums so encontradas as estruturas e enumeraes identificadas automaticamente pelo IDA. Estas estruturas so
identificadas atravs da anlise do cdigo, biblioteca de assinaturas, ou pelo uso de
determinadas variveis em chamadas a funes de bibliotecas. possvel tambm criar
novas estruturas ou enumeraes conforme a necessidade.
11 Debugger: permite executar de forma controlada o programa analisado, mas no esquea
de que ao executar um programa malicioso, a mquina poder ser comprometida.
(estilo C, 7 bit ASCII null terminated). Para configurar outros tipos de string, deve-se clicar
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 correspondente. Ao executar um script, o output dele ser enviado para a rea de mensagens.
Algumas vezes, o script pode pedir a interveno do usurio, outras vezes, ele adicionar
uma funo ao IDA Pro.
Como exemplo, a execuo do script C:\Program Files\Ida Free\IDC\call_count_prefixer.
idc o far escanear todo o banco de dados do programa analisado, e renomear as funes
colocando como prefixo o nmero de vezes que a funo chamada; desta forma se pode
saber as funes mais importantes e que devem ser analisadas primeiro.
Atalhos
Atalhos e navegao:
24
Algoritmo de autoanlise
Algoritmo de autoanlise do IDA:
Grficos
Grficos de chamadas:
11 Os programas analisados podem ser visualizados como grficos.
11 A funo so os ns, e as chamadas da funo so as arestas.
11 til para visualizar relaes entre funes.
25
sub_4055E4
sub_403A9C
GetLastError
__imp_GetLastError
SetFileAttributesA
Figura 3.2
Grficos de
chamadas
__imp_SetFileAttributesA
\Desktop\Exemplos\Sessao3\mal.Down.nopack.worm.exe
11 D duplo clique em uma funo na lista de funes.
11 Pressione Control-Shift-T para grficos at a funo atual.
11 Control-Shift-F para grficos a partir da funo atual.
Para visualizar um grfico de chamada de funes, abra o arquivo indicado e escolha uma
das funes identificadas pelo IDA, na janela Funes, de preferncia alguma identificada
pelo nome como sub_xxxxxx, sendo xxxxxx qualquer nmero. Clique uma vez sobre o
nome da funo na listagem disassembly.
Aps isso, basta pressionar Control+Shift+T para gerar um grfico de chamadas a partir
do entry point at a funo atual. Se o atalho no estiver configurado, basta clicar no cone
identificado ao lado do texto acima.
Para gerar um grfico de chamada a partir da funo atual, basta pressionar Control+Shift+F
ou pressionar o cone correspondente.
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
00000052 xor ebx, ebx
...
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 verdadeira, e linhas vermelhas quando a condio for falsa.
Um bloco bsico a maior sequncia de instrues executadas antes de um salto condicional.
Como um pequeno exerccio, voc pode usar um atalho para procurar na lista de funes
pela funo sub_403D70. Pressionando Control+P, uma janela aberta com as funes reconhecidas. 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.
Figura 3.3
Grficos de fluxo
de controle.
Muitas vezes, ao compilar um programa, o autor pode optar por embutir nele as DLLs necessrias para seu funcionamento. Ou seja, ele compila estaticamente as bibliotecas necessrias.
Alm disso, dependendo do compilador usado, diversos mdulos caractersticos desse compilador tambm podem ser embutidos no programa. Por exemplo, em linguagens visuais
como Visual C++ ou Delphi, as funes para tratamento dos objetos visuais, como formulrios e botes, so padronizadas.
Ao analisar um programa suspeito, identificar corretamente o compilador usado pode oferecer um grande auxlio ao analista, que pode ento procurar por funes padronizadas e
elimin-las da lista a ser analisada.
O IDA Pro tem duas funcionalidades muito importantes para auxiliar o analista nesta tarefa.
A primeira delas a biblioteca de tipos. Uma biblioteca de tipos um conjunto de assinaturas que auxiliam o IDA a identificar o compilador usado no programa, e na identificao de
variveis padro, mtodos de chamada, funes padro etc.
Signatures (ou assinaturas de funo) so bibliotecas de assinaturas que auxiliam o IDA a
reconhecer funes padro de bibliotecas. Ele realiza essa tarefa atravs da pesquisa por
hash de funes existentes. Se uma funo desconhecida tem o mesmo hash de uma funo
de uma biblioteca do sistema, ento elas possivelmente so a mesma funo.
Dessa forma, o IDA consegue reconhecer automaticamente partes do cdigo que de outro
modo permaneceriam desconhecidas, e caberia ento ao analista identificar a funcionalidade daquela funo. Algumas vezes, porm, o IDA reconhece erroneamente o compilador,
e no aplica corretamente as assinaturas. Veremos a seguir um exemplo disso.
Veja como a barra de navegao muda, quando as assinaturas so aplicadas:
Figura 3.4
Mudanas na barra
de navegao.
Finalmente, aps todas as assinaturas aplicadas, voc vai perceber que muitas funes que antes
28
estavam marcadas como desconhecidas, agora esto marcadas como pertencendo s bibliotecas
do Borland. Isto facilita a anlise, pois agora no mais preciso analisar essas funes.
Demonstraremos a seguir a utilidade das funes de reconhecimento automtico de
padres no IDA. As assinaturas podem ser encontradas em diversas fontes pela internet ou
desenvolvidas pelo prprio analista, permitindo assim expandir a funcionalidade do IDA.
Introduo ao OllyDBG
11 Freeware.
11 Contm diversas funcionalidades cracker friendly.
11 Expansvel atravs de diversas linguagens.
Veremos a partir de agora outra ferramenta muito til na anlise de programas maliciosos.
O OllyDBG um debugger e disassembler, distribudo livremente, que contm uma grande
quantidade de funcionalidades teis para a anlise.
O Olly uma ferramenta cracker friendly, pois suas funcionalidades so especialmente
desenvolvidas para facilitar a engenharia reversa de programas protegidos. Com a possibilidade de expandir seu funcionamento atravs de scripts e plugins, assim como o IDA, o Olly
complementa as caractersticas do IDA. O conjunto das duas ferramentas atende a praticamente qualquer necessidade que o analista possa ter durante uma anlise.
Uma caracterstica do Olly que a maioria das funes no so acessveis pelo menu do
programa. Menus contextuais no boto direto contm muitas outras funcionalidades, assim
como atalhos de teclado acessam outras tantas funcionalidades inacessveis de outro modo.
Felizmente, a documentao existente excelente e o analista poder aprender muito com ela.
Um ponto a ser destacado que o Olly, ao abrir um executvel para anlise, diferentemente
do IDA, coloca o programa em execuo e pausa a execuo na primeira instruo a ser
executada. Isto significa que o programa vai estar carregado em memria, pronto para ser
executado. Qualquer ao errada por parte do analista pode colocar o programa em execuo, 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). Basicamente nessa tela esto as principais informaes que o analista precisa saber durante a
anlise. Outras janelas podem ser abertas atravs do menu View.
Janela principal da CPU:
Janela de
Disassembly
Janela de
registradores
Janela de
mensagens
Janela de
memria
Figura 3.5
OllyDBG.
Janela de
Stack de
chamadas
Toolbar
29
Na parte superior, h uma pequena toolbar, com botes para abrir novas janelas e para a
execuo controlada do programa.
Abaixo, esquerda, temos a janela de disassembly, dividida em colunas. Da esquerda
para a direita:
11 Endereo da instruo;
11 Bytes relativos instruo;
11 Instrues assembly e parmetros;
11 Comentrios, referncias, tipos de parmetros etc.
direita da janela de disassembly, temos a primeira mudana em relao ao IDA. Nesta tela,
pelo fato do programa ser colocado em modo de execuo pelo Olly, ele pode mostrar o
estado atual dos registradores e flags da CPU. Isto s possvel durante a execuo. recomendada 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 importante 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:
11 Disassembly comentvel.
11 Enumerao de argumentos.
11 Registradores de CPU.
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.
11 Expresses monitoradas.
11 Handles.
11 Plugins.
11 Call Stack Graph.
Abra o arquivo \Desktop\Exemplos\Sessao 3\mal.Down.nopack.worm.exe novamente,
para usar como exemplo.
Os sete primeiros itens da lista acima so as janelas padro mostradas na tela principal.
Aqui, como no IDA, o disassembly pode ser comentado, tanto automaticamente pelo Olly,
como manualmente pelo usurio.
Sempre que possvel, o Olly tenta tambm identificar parmetros e anot-los no disassembly,
como pode ser visto nas chamadas ao WinExec no incio do programa.
O log pode ser acessado clicando-se no boto L na toolbar.
Os mdulos executveis so todas as DLLs e demais executveis usados pelo programa.
Podem ser acessados clicando no boto E na toolbar.
O mapa de memria, que mostra a estrutura das sees do programa na memria, pode ser
acessado com o boto M.
Os threads criados pelo programa podem ser vistos com o boto T.
Os breakpoints marcados no programa, para controlar a execuo do mesmo, podem ser
vistos clicando-se no boto B.
Os bookmarks so marcaes feitas pelo analista para relembrar de posies importantes
no cdigo. Eles podem ser acessados atravs do plugin Bookmarks (Plugins g Bookmarks
g Bookmarks).
A cadeia de Exception Handling pode ser vista clicando-se em View->SEH chain.
Expresses monitoradas podem ser visualizadas na janela de log da tela principal, ou na tela
de watches acessvel pelo menu View g Watches.
Os handles mostram os arquivos mantidos abertos pelo programa, incluindo arquivos
normais, diretrios, pipes, sockets, conexes de rede etc. Eles podem ser acessados pelo
Os plugins instalados nesta verso do Olly incluem no somente os padres, mas tambm
um grande conjunto de plugins encontrados na internet em sites especializados no Olly.
Um plugin interessante o plugin OllyFlow, capaz de gerar diversos grficos, como no IDA.
Mas alm dos tipos de grfico do IDA, um tipo especial que o Olly disponibiliza o Call Stack
Graph. Este grfico mostra as modificaes feitas no Stack de uma funo para enviar parmetros 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:
11 OllyDump
boto H na toolbar.
31
11 OllyScript
11 OllyFlow
11 Hide Debugger
11 Heap Vis
11 Breakpoint Manager
O suporte a plugins do Olly muito bom, sendo que diversos esto instalados na verso
distribuda na mquina virtual:
11 OllyDump: exporta o processo atual para disco, reconstruindo a IAT;
11 OllyScript: permite a execuo de scripts externos;
11 OllyFlow: gera grficos de funes, como no IDA Pro;
11 Hide Debugger: implementa diversas funes para esconder o OllyDBG do programa analisado;
11 Heap Vis: enumera e procura por heaps do processo atual;
11 Breakpoint Manager: importa e exporta marcaes de breakpoint.
A lista acima mostra apenas alguns dos plugins disponveis. O OllyDump um plugin importante, 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 controlado, 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 funcionalidade 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.
Roteiro de Atividades 3
Atividade 3.1 Signatures e Type Library
O objetivo desta atividade verificar como o reconhecimento correto do compilador usado
pode auxiliar na anlise. Como exemplo, utilizaremos o mesmo programa malicioso dos
exemplos anteriores: \Desktop\Exemplos\Sessao 3\mal.Down.nopack.worm.exe.
1. Com o arquivo \Desktop\Exemplos\Sessao 3\mal.Down.nopack.worm.exe aberto,
examine a barra de navegao para verificar o que foi reconhecido. Examinando as
strings, podemos ver algumas referncias ao Borland Delphi no cdigo do programa.
2. Abra a janela Type Libraries (View g Open Subviews g Type Libraries), observando que
o compilador identificado vc6win.
3. Abra a janela Signatures (View g Open Subviews g Signatures) e adicione as assinaturas
que julgar pertinentes, observando aquelas que identificam funes de bibliotecas.
Observe que as partes azuis representam quase a totalidade do cdigo, e devem ser analisadas, pois representam funes desconhecidas.
Ao adicionar as assinaturas, perceba que enquanto elas forem aplicadas ao cdigo, a janela
vai indicar quantas funes so reconhecidas pelas assinaturas. Ao mesmo tempo, a barra
de navegao vai mostrar as funes identificadas como pertencendo a uma biblioteca,
mudando as cores de azul escuro para azul claro.
Pesquise na internet o modo como essas assinaturas so criadas, e outras vantagens
existentes no uso de assinaturas. Faa um relatrio descrevendo as pginas que encontrar
33
34
De acordo com o arquivo TXT indicado acima, um arquivo compactado com UPX tem no seu
entry point o seguinte contedo:
60 PUSHAD
BE
[4 Bytes]
8DBE [4 bytes]
57
83CD FF
OR EBP, FFFFFFFF
EB 10
90
PUSH EDI
NOP
executadas em um loop.
35
36
4
Apresentar o formato PE e mostrar como extrair informaes relevantes das sees,
tabela de importao e cabealhos para a anlise esttica do arquivo.
conceitos
Exerccio de fixao 1 e
Arquivos executveis
Todo arquivo binrio um arquivo executvel? E todo arquivo executvel um arquivo binrio?
objetivos
37
ser carregadas junto com o programa, o endereo inicial de execuo (entry point) e a quantidade 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):
usurios mais leigos, que ele reconhecido pelo sistema operacional pela sua extenso,
38
que pode ser .EXE ou .DLL. Muitas vezes, um usurio malicioso disfara o fato de um programa 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:
22 E_magic=4D5Ah MZ
11 Cabealho NT compreende o cabealho FILE e o OPTIONAL
22 Assinatura = 5045h PE
DOS MZ header
DOS stub
PE header
Section table
Section 1
Section 2
Section ...
Section n
Figura 4.1
Formato de
arquivos Portable
Executable (PE).
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 ................
40
Figura 4.2
Arquivo PE quando
visto em um editor
hexadecimal.
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:
41
conferir isso, examinando no Olly o valor indicado em ImageBase e depois procurando pelo
42
Tabela de importao
11 A funo primria da Tabela de Endereos de Importao (IAT) prover informaes
para o loader do sistema localizar as funes de API e outros smbolos utilizados por
um executvel.
11 Pode tambm prover informaes sobre as aes que um executvel pode tomar.
11 Ocultar ou obfuscar a IAT uma tcnica comumente utilizada por arquivos maliciosos.
11 A IAT pode ser reconstruda por diversas ferramentas.
A Tabela de Endereos de Importao (Instruction Address Table, ou IAT), usada pelo
sistema para saber as DLLs que o programa precisa para funcionar, e as funes dessas
DLLs que sero utilizadas.
43
Estas informaes podem ser teis para a identificao do tipo de comportamento que o
programa pode ter. Por isso, normalmente a IAT modificada ou obfuscada pelos autores
de programas maliciosos, dificultando o trabalho de anlise do programa, mas no o impede
de funcionar corretamente. Em alguns casos, o prprio cdigo do programa carrega dinamicamente 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 endereo 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.
22 Pode ser maior que SizeOfRawData, e neste caso ser preenchida com zeros.
11 VirtualAddress: endereo da seo na memria, relativo a ImageBase.
11 SizeOfRawData: tamanho da seo no disco.
11 PointerToRawData: offset no arquivo do contedo da seo a ser carregado na memria.
11 Characteristics: contm flags como execuo, leitura e escrita, entre outras.
A ltima parte do cabealho de um executvel descreve as sees existentes, onde ficam
armazenados os cdigos e dados do programa. Existem dois estados para uma seo:
11 Estado fsico: modo da seo no arquivo fsico gravado no disco.
11 Estado virtual: modo como a seo vai ser mapeada em memria.
Existem casos em que o tamanho da seo em disco nulo, e quando a seo carregada
em memria, fica com um tamanho maior. Isto pode ser usado, por exemplo, para indicar
uma seo onde sero armazenados dados dinmicos do programa.
11 VirtualSize e VirtualAddress campos que indicam o tamanho e o offset em que ser
carregada a seo a partir do ImageBase.
11 SizeOfRawData indica o tamanho real da seo em disco.
11 PointerToRawData define o offset onde a seo est armazenada a partir do incio
do arquivo.
44
Roteiro de Atividades 4
Atividade 4.1 Navegando pela estrutura de um arquivo PE
1. Execute o OllyDBG;
2. Abra o arquivo:
\Desktop\Exemplos\Sessao 4\mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dat
3. Abra a Janela de Memria (Alt-M ou boto M na barra de ferramentas);
4. Identifique a rea de memria do programa, e clique duas vezes sobre o item PE Header;
5. Examine as estruturas dos cabealhos DOS e NT. Voc pode alternar entre visualizao no
formato de cabealho e no formato hexadecimal, clicando com o boto direito e escolhendo
Special->PE Header ou Hex->Hex/ASCII (16 bytes);
6. Faa uma lista dos campos que considera mais importantes durante a anlise;
7. Mantenha o Olly DBG aberto para acompanhar o mdulo terico, acompanhando no
arquivo os campos explicados pelo instrutor.
45
46
5
Apresentar a linguagem assembly e seus pontos principais, como anlise de stack
e anlise de memria, para extrair o mximo de informaes em uma anlise
de cdigo malicioso.
exception handling.
conceitos
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
assembly. No tem como escapar. Vamos comear pelo bsico:
11 Os componentes principais da arquitetura x86 so CPU, memria, registradores e disco.
11 A CPU recupera uma instruo, decodifica e executa.
11 Uma aplicao implementada como uma sequncia de instrues assembly.
objetivos
47
No est no escopo deste curso ensinar tudo sobre a linguagem; o conhecimento mnimo
dela pr-requisito para o curso, mas somente relembraremos alguns conceitos teis
durante a anlise de programas maliciosos.
Primeiro, devemos relembrar os componentes macro de um processador: CPU, memria,
registradores e disco.
A CPU processa as instrues de um programa, lendo cada instruo a partir da memria
principal para uma memria interna CPU (cache), decodificando-a e executando-a. Para
isso, utiliza registradores, que so reas de memria internas CPU, para armazenar dados
necessrios execuo da instruo. Os programas so armazenados em disco, e dele so
lidos atravs de instrues de acesso a dispositivos fsicos do sistema operacional.
Um programa implementado como uma sequncia de instrues assembly. Mas como
veremos daqui para a frente, essa sequncia nem sempre muito clara.
11 As instrues podem:
int main () {
printf("Hello World");
}
push
ebp
mov
ebp, esp
sub
esp, 8
and
esp, 0FFFFFFF0h
mov
eax, 0
add
eax, 0Fh
add
eax, 0Fh
shr
eax, 4
shl
eax, 4
mov
mov
[ebp+var_4], eax
eax, [ebp+var_4]
call
sub_401088
call
__main
mov
call
leave
retn
HelloWorld endp
48
Figura 5.1
Comparao de
linha de cdigo em
linguagem de alto
nvel com assembly.
Este cdigo foi complicado com o Cygwin GCC, com diversas funes extras de inicializao
inseridas pelo compilador. Outros compiladores poderiam adicionar outros tipos de
cdigo. Esta uma caracterstica importante durante a anlise, pois possvel reconhecer
o tipo de compilador usado apenas estudando as funes de inicializao adicionadas ao
cdigo do usurio.
No exemplo, vemos que um simples cdigo Hello World pode se transformar em funes e
instrues diversas.
O arquivo no IDA Pro est disponvel no diretrio \Desktop\Sessao 5\HelloWorld.exe.
Registradores
11 Registradores so reas de memria reservadas para uso pela CPU.
Como esses registradores esto localizados dentro da CPU, o acesso a eles muito rpido.
Devido ao fato de estarem em nmero restrito, o uso dos compiladores precisa ser otimizado. Dessa forma, ao analisar um programa, poderemos entender o que se passa quando
um registrador usado para realizar operaes distintas, e como a CPU faz para no perder
as informaes armazenadas em um registrador quando precisar us-lo para outro fim.
Registradores de uso geral na arquitetura x86:
11 EAX: acumulador, voltil, utilizado para retorno de valores de funes.
11 EBX: no voltil, utilizado para endereamento indireto.
11 ECX: utilizado em contadores e funes de loop, voltil.
8 bits
8 bits
8 bits
8 bits
8 bits
8 bits
8 bits
8 bits
RAX
EAX
AX
AH
Tabela 5.2
Organizao de um
registrador.
AL
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 significativos 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 registrador EAX ter seu valor modificado para 0x09ABCD00, pois AL se refere a uma posio do
registrador EAX.
Tendo isso em mente, veremos que normalmente os compiladores usam determinados
registradores para algumas funes comuns. Por exemplo, EAX geralmente usado como
acumulador para instrues, ou para retorno de funes.
EBX costuma ser usado para endereamento indireto de dados, ECX em contadores e
funes de loop, e EDX um registrador de uso geral.
Mesmo assim, em alguns casos o compilador pode precisar de mais de um registrador para
executar uma instruo, e pode us-los de forma diferente da descrita acima.
Registradores de uso geral:
11 ESI
22 Armazena dados de origem em operaes com strings (no voltil).
11 EDI
22 Armazena dados de destino em operaes com strings (no voltil).
11 ESP/EBP
22 Ponteiro do Stack (voltil) / ponteiro de frame (no voltil).
11 EIP
50
Stack
11 Estrutura de dados abstrata baseada em uma combinao de hardware e software.
11 Utilizado para armazenar dados, em uma estrutura LIFO (Last In First Out).
22 Passagem de parmetros para funes.
22 Armazena endereos de retorno de chamadas.
22 No Windows, serve tambm para armazenar a Structured Exception Handling (SEH).
11 A instruo PUSH utilizada para colocar um valor de 32 bits no Stack.
11 A instruo POP remove um valor de 32 bits do Stack.
11 Dados podem ser acessados no Stack atravs de referncia indireta usando o
registrador EBP.
Entender o funcionamento do Stack fundamental para realizar uma anlise de qualquer
tipo de programa em nvel de cdigo de mquina. O Stack usado pela CPU para passar
parmetros a funes, armazenar endereos de retorno de chamadas, e outras estruturas
mais complexas como a Structured Exception Handling (SEH).
Ele funciona como uma estrutura LIFO, isto , o ltimo dado a ser colocado no Stack vai ser o
primeiro a sair. O Stack comparado a uma pilha de pratos, que cresce de baixo para cima.
O registrador ESP utilizado para apontar para o topo da pilha, e normalmente, quando um
programa precisa reservar espao de memria para um parmetro de funo, ele subtrai o
tamanho necessrio de ESP. Essa subtrao adiciona espao ao Stack. Para limpar o Stack,
deve-se somar o tamanho desejado a ESP, o que remover este tamanho do Stack.
Para gravar um dado de 32 bits na pilha, usamos a funo PUSH, e para remover esse dado,
usamos a funo POP.
Os dados tambm podem ser acessados atravs de referncia indireta usando o registrador
EBP, como mostrado no exemplo abaixo:
Layout de memria
Tabela 5.3
Layout de memria
no Microsoft
Windows.
Espao na memria
232 = 4.294.967.296 bytes = 4 gigabytes disponveis
Separao de memria:
11 Sistemas baseados em Windows dividem estes 4 GB em duas partes: memria do
kernel e do usurio.
11 Cada processo v apenas seu prprio bloco de 2 GB.
0x00000000
USER SPACE
0x00010000
Environment Variables
0x00030000
Heap
0x0012f000
0x00150000
Heap
0x00400000
Main Executable
0x00d8d0000
0x71ab0000
WS2_32.DLL
0x7c800000
KERNEL32.DLL
0x7c900000
NTDLL.DLL
0x7f000000
0x80000000
KERVEL SPACE
52
Figura 5.4
Mapeamento de
um processo na
memria.
Durante o carregamento, essas estruturas so mapeadas em memria, as DLLs so carregadas, as pilhas iniciadas e o programa comea sua execuo, com o controle passado ao
entry point.
Conhecer essa estrutura importante, principalmente se o analista se deparar com alguma
vulnerabilidade em um programa. Um tipo de vulnerabilidade muito explorada o estouro
de pilha, onde o atacante cria uma varivel com valor muito grande, que estoura o espao
reservado para o Stack, e acaba sobrescrevendo reas importantes de memria. Isto pode
causar o trmino inesperado do programa, ou a execuo de cdigo malicioso.
Size
Section
Owner
Contains
Access
Type
Initial Mapped as
00010000 00001000
Priv 00021004 RW
RW
00020000 00001000
Priv 00021004 RW
RW
0022D000 00001000
0022E000 00002000
00041002 R
00230000 00003000
Map
00240000 00006000
Priv 00021004 RW
RW
00340000 00006000
Priv 00021004 RW
RW
00350000 00003000
Map
00041004 RW
RW
00360000 00016000
Map
00041002 R
\Device\Harddi
00380000 0003D000
Map
00041002 R
\Device\Harddi
003C0000 00006000
Map
00041002 R
\Device\Harddi
003D0000 00001000
RWE
RWE
PE header
Imag 01001002 R
RWE
SFX
Imag 01001002 R
RWE
Imag 01001002 R
RWE
003E0000 00001000
00400000 00001000 HelloWo:
00401000 00001000 HelloWo: .text
00402000 00001000 HelloWo: .rdata
00403000 00001000 HelloWo: .bss
data
Imag 01001002 R
RWE
imports
Imag 01001002 R
RWE
00041002 R
00410000 00041000
Map
0065B000 00001000
0065C000 00004000
60000000 00005000
Map
00041004 RW
RW
60010000 0000B000
Map
00041004 RW
RW
60040000 00003000
Map
00041004 RW
RW
.text
PE header
Imag 01001002 R
RWE
code
Imag 01001002 R
RWE
Imag 01001002 R
RWE
Imag 01001002 R
RWE
/4
.rdata
Imag 01001002 R
RWE
.bss
Imag 01001002 R
RWE
.edata
exports
Imag 01001002 R
RWE
.rsrc
resources
Imag 01001002 R
RWE
.reloc
relocations
Imag 01001002 R
RWE
/19
Imag 01001002 R
RWE
/38
Imag 01001002 R
RWE
Imag 01001002 R
RWE
.cygheap
Imag 01001002 R
61170000 00090000 cygwin1
PE header
Imag 01001002 R
77DD0000 00001000 ADVAPI3;
code, imports, exports Imag 01001002 R
77DD1000 00075000 ADVAPI3; .text
RWE
Figura 5.5
Layout da memria
de processo.
.data
.idata
data
imports
\Device\Harddi
RWE
RWE
Podemos ver no Olly como fica esse mapeamento de memria de um programa real. Basta
abrir o arquivo \Desktop\Sessao 5\HelloWorld.exe, e examinar o mapa de memria com o
comando Alt-M ou clicando no boto M da barra de ferramentas.
Podemos ver acima os endereos da memria do processo, a regio reservada ao Stack, a
regio reservada ao executvel (cada seo carregada em uma regio), seguida do Stack do
thread adicional, e finalmente a rea das DLLs.
Address
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 informaes 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?
O endereo dessas funes fica armazenado no Stack, em uma lista encadeada. Existe
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
0050ED00 PUSHAD
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
56
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 considerar 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 indexado.
11 cdecl
22 Quem chama limpa o Stack.
11 stdcall
22 Funo chamada limpa o Stack.
11 fastcall
11 thiscall
22 Cdigo gerado por C++, ponteiro para objetos passado em registrador.
33 Microsoft: ECX.
33 Borland / Watcom: EAX.
11 naked
As chamadas a funes podem indicar o tipo de compilador usado no programa, pois cada
compilador tem uma preferncia por um tipo diferente de chamada.
As chamadas mais comuns so cdecl e stdcall. Normalmente os parmetros para essas
funes so passados atravs do Stack, por meio de instrues PUSH que precedem
57
a chamada, na ordem inversa dos parmetros esperados. A diferena entre as duas que
nas chamadas cdecl a funo que chamou limpa o Stack aps a finalizao da funo, e no
padro stdcall a funo chamada que deve limpar o Stack.
Os outros tipos de chamada so usados em casos especiais, como por exemplo as chamadas
thiscall que so usadas em cdigo orientado a objetos para passagem nos registradores de
ponteiros para objetos.
Tanto o IDA Pro quanto o OllyDBG tentam reconhecer o padro de chamada utilizado em um
programa e nomeiam automaticamente as variveis passadas como parmetro quando a
funo for conhecida (por exemplo, chamadas a funes de bibliotecas do sistema).
Argumentos de funo so empilhados na ordem inversa:
stdcall
cdecl
funcao(arg1, arg2);
funcao(arg1, arg2);
push arg2
push arg2
push arg1
push arg1
call funcao
call funcao
add esp, 8
mov [ebp-0xc], eax
stdcall
funcao(arg1, arg2);
push arg2
push arg1
call funcao
mov [ebp-0xc], eax
cdecl
funcao(arg1, arg2);
push arg2
push arg1
58
call funcao
add esp, 8
mov [ebp-0xc], eax
Podemos observar que no caso da funo cdecl o Stack limpo aps a chamada funo
com o comando ADD ESP, 8. Como vimos anteriormente, esse comando remove 8 bytes
do Stack, removendo efetivamente os dois parmetros passados anteriormente com o
comando PUSH. No caso da chamada stdcall, isso feito dentro da prpria funo.
Figura 5.6
Argumentos
de funo so
empilhados na
ordem inversa.
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.
push ebp
mov ebp, esp
sub esp, 0x100
11 DLLs mais recentes:
11 [EBP - valor]
22 Indica variveis locais.
11 O retorno de funes normalmente feito em EAX quando o valor 32 bits.
Finalmente, para diferenciar o uso de variveis locais e variveis passadas como parmetros,
os compiladores geralmente usam valores positivos ou negativos referentes a EBP.
Vimos o uso de [EBP-0xC], que indica uma varivel local. Lembrando dos exemplos de
chamada cdecl e stdcall, poderamos escrever aquele cdigo em assembly da seguinte forma:
localvar=funcao(arg1,arg2);
60
Roteiro de Atividades 5
Atividade 5.1 Structured Exception Handling
00401000 MOV EAX,4BA070
00401005 PUSH EAX
00401006 PUSH DWORD PTR FS:[0]
0040100D MOV DWORD PTR FS:[0],ESP
00401014
XOR EAX,EAX
00401016
00401018
PUSH EAX
\Desktop\Malware\mal.Banker-Down.PECompact.worm.scr
2. Examine o Stack quando executar 0x0040100D;
3. Execute com F7 cada instruo acima, at chegar em 0x00401016;
4. Ao executar 0x00401016, ser gerada uma exceo, que deve ser passada ao programa
com Shift-F7;
5. Descreva o que aconteceu com o fluxo do programa e os possveis efeitos na anlise
do programa.
61
o padro de cdigo e de mapeamento de memria usado por pelo menos trs deles.
62
6
Identificar blocos de cdigo que so normalmente encontrados em cdigos analisados,
visando facilitar a anlise do cdigo e a identificao de funcionalidades.
conceitos
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.
11 Em uma instruo CMP, o operando da esquerda o parmetro de comparao:
22 CMP EBX, [EAX+20h]
22 EBX:
33 > [EAX+20h]? JA endereo
objetivos
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 apontado por EAX+20h. A seguir, existem trs pulos condicionais, que vo depender do valor dos
flags configurados por CMP.
Existem outras maneiras de realizar tais comparaes, como por exemplo o cdigo abaixo,
encontrado no endereo 0x00407354 do programa malicioso em anlise:
CODE:00407354
call
sub_40729C
CODE:00407359
sub
al, 1
jb
jz
short loc_407361 ; = 0? Va
jmp
; Se
(sub_40729C()-1)
CODE:0040735B
para location1
CODE:0040735D
para location2
CODE:0040735F
outro valor? Va para location3
Neste cdigo, o valor de retorno da funo sub_40729C diminudo em 1, e o resultado
testado. Se for menor que 0, o controle passa para loc_407372, se for 0, passa para
loc_407361, e qualquer outro valor faz o programa pular para loc_40736.
Blocos condicionais
if (var > 128)
var = 128;
mov eax, [ebp+8]
cmp eax, 0x80
jbe skip
mov eax, 0x80
skip:
11 Jump Below or Equal (JBE) uma comparao sem sinal.
11 Jump if Less than or Equal (JLE) uma comparao com sinal.
64
uma comparao e um nico desvio de fluxo. No cdigo existem diversos exemplos desse
tipo de estrutura.
Loops
for (i = 0; i < 100; i++)
do_something();
xor eax, eax
start:
cmp eax, 0x64
jge exit
call do_something
inc eax
jmp start
exit:
11 Loops so fceis de visualizar em grficos.
11 No IDA Pro 5, o modo normal de visualizao j em forma grfica.
11 Pode-se usar F12 para visualizar o fluxo de uma funo.
Loops so estruturas de cdigo executadas um certo nmero de vezes, normalmente
com uma condio de sada. Por exemplo, a funo FOR executa a sequncia de cdigo
do_something() cem vezes.
jmp start
exit:
Um loop facilmente identificado em um grfico de controle de fluxo. No IDA, basta posicionar o cursor dentro da funo desejada e pressionar F12 para gerar um grfico como mostrado na Figura 6.1, onde possvel facilmente identificar o loop e as suas condies de sada.
inc eax
65
Figura 6.1
Grfico gerado no
IDA para identificar
um loop.
sub_407338:
push
ebx
push
esi
push
edi
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
sub
mov
call
sub
jb
edx, edi
: Do {
edx, esi
eax, esi
ub_40729C
al, 1
; Se (sub_40729C( ) -1)
sort loc_407372; < 0? va para location1
0040735D:
jz
short loc_407361; = 0? va para location2
loc_407361:
inc
edi
loc_407372:
mov
eax, edi
pop
edi
pop
esi
pop
ebx
retn
004073F:
jmp
short oc_407362; qualquer outro valor va para location3
loc_407362:
inc
edi
mov
edx, ebx
mov
eax, edi
call
sub_4057AB
mov
edi, eax
test
edi, edi
jnz
short loop
Switch
Switch Statements:
switch (var) {
66
legenda:
; } while (EDI ! = 0)
Verdadeiro
Falso
jmp end
end:
IDA Pro e OllyDBG tm excelente identificao de switch/case.
Estruturas Switch so muito comuns para controlar o fluxo de execuo de um programa
quando necessrio testar uma varivel para comparar com diversos valores. Existem basicamente duas maneiras de se fazer isso em assembly, e o formato que o analista encontrar
depende muito do compilador usado.
switch (var) {
case 0: var = 100; break;
case 1: var = 200; break;
jmp switch_table[eax*4]
case_0:
mov [ebp-4], 100
jmp end
case_1:
mov [ebp-4], 200
jmp end
end:
No exemplo acima, a estrutura switch criada atravs de uma tabela de JMP. Neste caso, o
JMP executado de acordo com o valor de EAX*4 (4 o tamanho do endereo armazenado
na tabela switch_table, e EAX o ndice da localizao que ser chamada). Por exemplo, se
quisermos passar o controle para o sexto valor da tabela de switch, faremos o seguinte:
MOV EAX,6h
JMP switch_table[EAX*4]
No IDA, uma tabela de switch pode ser reconhecida pela sequncia de
offsets, seguindo a definio de uma varivel:
MOV EAX, 3h
off_407F8C
CODE:00407F88
dd offset loc_404394
dd offset loc_4045FC
dd offset loc_4046E4
JMP off_407F8C[EAX*4]
67
Memcpy()/Strcpy()
memcpy() / strcpy() inline
68
Strlen()/Strstr()
strlen()/strstr() inline
Estruturas
Acesso a estruturas:
push ebp
amov ebp, esp
mov eax, off_struct
mov ebx, [ebp+arg_0]
; tem 8 bytes
push esi
69
O acesso a estruturas geralmente feito atravs de endereamento indireto usando o registrador EAX ou EBP. No cdigo abaixo podemos ver alguns exemplos de uso de estruturas:
push ebp
mov ebp, esp
mov eax, off_struct
mov ebx, [ebp+arg_0]
push esi
cmp ebx, [eax+14h]
; tem 8 bytes
Operaes matemticas
11 A diviso usando a instruo DIV extremamente lenta.
70
EAX=10001001
SHL EAX, 2 => 00100100
SHR EAX=3 => 00000100
Nmeros randmicos
Pseudo geradores de nmeros randmicos.
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||
GetTickCount
mov
ds:CurrentSavedTime, eax
retn
SaveCurrentTime endp
; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||
eax, ds:CurrentSavedTime
imul
eax, 343FDh
add
eax, 269EC3h
mov
ds:CurrentSavedTime, eax
mov
retn
RandomNumberGenerator
Figura 6.2
Pseudo geradores
de nmeros
randmicos.
endp
Muitas vezes, um programa pode precisar gerar nmeros randmicos para usar em suas
funes. Como o Windows no prov um gerador de nmeros randmicos real, os programas 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).
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 reservado 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.
Variveis de API
O IDA Pro tem uma excelente identificao de tipos usados em chamadas de funes de API:
CODE:004056A4 loc_4056A4:
CODE:004056A4
lea
edx, [ebp+TotalNumberOfClusters]
CODE:004056A7
push
edx
CODE:004056A8
lea
edx, [ebp+NumberOfFreeClusters]
CODE:004056AB
push
edx
CODE:004056AC
lea
edx, [ebp+BytesPerSector]
CODE:004056AF
push
edx
CODE:004056B0
lea
edx, [ebp+SectorsPerCluster]
CODE:004056B3
push
edx
; lpSectorsPerCluster
CODE:004056B4
push
eax
; lpRootPathName
CODE:004056B5
call
GetDiskFreeSpaceA
; lpTotalNumberOfClusters
; lpNumberOfFreeClusters
; lpBytesPerSector
Se compararmos com a dificuldade em encontrar os tipos das variveis de funes no integrantes de uma API, para APIs documentadas o procedimento mais fcil.
Para identificar o tipo de uma varivel, preciso descobrir um ponto no cdigo onde essa
varivel seja usada, e ver como ela tratada, isto , se usada em uma soma ou multiplicao, se pode ser um inteiro, se usada para indicar uma rea de memria com strings,
se uma varivel de texto, e assim por diante.
72
Para funes presentes em APIs e DLLs do sistema, descobrir essas informaes fcil,
bastando consultar uma referncia sobre essa funo, para descobrir as variveis que ela
recebe como parmetro. Em seguida, basta olhar no cdigo e ver o momento em que essas
variveis so armazenadas no Stack antes de chamar a funo, o que equivale a passar
esses parmetros para ela. Sabendo a ordem em que as variveis esto no Stack, possvel
associ-las aos tipos de variveis que a funo espera como parmetro de entrada, e com
isso descobrir o tipo das variveis no cdigo.
No exemplo, uma chamada funo GetDiskFreeSpaceA() do sistema. De acordo com o IDA,
essa funo est definida na API como:
Recuperao de tipos
Inteiros x Ponteiros:
73
loc_504546:
mov
[ebp+esi+String1], bl
jnz
short loc_5045C3
cmo
ds:off_5090D0, ebx
jz
short loc_50457D
mov
mov
esi, eax
Figura 6.3
Strings x Dados
brutos.
74
Lgica branchless
11 Fluxo lgico do programa no conta com saltos ou desvios condicionais.
cmp eax, 1
cmp eax, 1
sbb eax, eax
inc eax
pop esi
retn
Inicialmente, EAX comparado com 1.
Se EAX=0, o retorno da funo ser 0.
Se EAX for diferente de 0, o retorno da funo ser sempre 1.
Este cdigo pode ser representado pelo seguinte cdigo de alto nvel:
Function x()
pop ebx
75
If (EAX>0)
return 1
Else
return 0
end
Assembly bsico
Engenharia reversa pode parecer complicada, mas uma questo de treino e familiaridade
11 Treine os conceitos.
11 Mantenha um guia de referncia mo (opcodes.hlp).
11 Examine alguns programas com o debugger, executando passo a passo com F7.
11 Use um emulador ou mquina virtual.
11 Compile um cdigo simples e tente analis-lo.
11 Sabendo o que o cdigo faz, muito mais fcil entender o assembly.
11 Vale a pena lembrar que somente a experincia vai ajudar o analista na hora de estudar
um cdigo malicioso desconhecido. Portanto, treine sempre que puder e com a maior
variedade possvel de cdigos.
11 Procure manter sempre disposio guias de referncia de linguagem assembly e linguagens de alto nvel, para entender exatamente o que os comandos significam e como as
estruturas funcionam.
11 Executando os programas em um ambiente virtual, passo a passo, voc poder estudar o
comportamento de cada parte do cdigo, sem se preocupar em comprometer o sistema.
Finalmente, para entender estruturas mais simples sem ter que ficar procurando por
elas no cdigo malicioso, crie alguns programas em linguagem de alto nvel, com a estrutura que estiver analisando, e compile o cdigo com diferentes compiladores, para ver
76
Roteiro de Atividades 6
Atividade 6.1 Assembly bsico
Examine com o IDA Pro o arquivo \Desktop\malware\mal.Down.nopack.worm.exe.
Identifique as estruturas vistas na sesso terica marcando a posio (Alt-M) e inserindo um
comentrio (:) ao lado das que conseguir encontrar. Ao final, grave o arquivo IDB do IDA Pro
(mal.Down.nopack.worm.idb) com as marcaes e comentrios.
77
78
7
Apresentar a tabela de importao e como podemos reconstru-la em caso de
anlise de um arquivo compactado.
conceitos
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?
smbolos importados.
11 Normalmente executveis escondem estes smbolos utilizando diversos truques para
dificultar a anlise.
11 Geralmente eles resolvem por conta prpria estes smbolos, ou movem a tabela de
smbolos para um local no padro.
11 Depois de mapeadas dinamicamente, estas funes so integradas aos binrios
atravs de tabelas de jumps.
11 Isto dificulta a identificao das DLLs envolvidas, por no passarem mais pelo
entry point delas.
objetivos
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 acessando esse dado dinamicamente.
O carregamento das funes feito pelas chamadas LoadLibraryA e GetProcAddress. Isso
evita que as DLLs sejam inicializadas corretamente atravs da chamada a DLLMain(), e dificulta tambm a ao do analista.
Mas como em algum momento essas funes estaro mapeadas para uso do programa,
possvel recuperar essa informao. Veremos a seguir exemplos desse tipo de tcnica, e
formas de recuperar a informao de importao de funes.
Para recriar essa tabela, podemos utilizar algumas tcnicas:
Reconstruo da IAT
11 Por que reconstruir a IAT?
11 Analisar um arquivo malicioso sem estes smbolos pode ser muito trabalhoso.
11 Existe um nmero de formas diferentes de se fazer isso.
80
A seguir, usaremos a ferramenta ImportRec para percorrer o programa e recuperar as informaes de funes importadas presentes nele.
importante lembrar que a execuo de qualquer tipo de programa malicioso compromete a
mquina. Por isso, neste momento crie um snapshot da sua mquina virtual, para recuperar o
estado sadio aps a execuo do programa.
Figura 7.1
Feramenta
ImportRec.
Captulo 7 -
81
82
Roteiro de Atividades 7
Atividade 7.1 Recuperando a IAT com ferramentas
Primeira parte
1. Faa snapshot da mquina virtual;
2. Abra com o OllyDBG o arquivo:
\Desktop\malware\mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dat
3. Encontre o OEP do cdigo descompactado, e pause a execuo do programa nesta instruo;
4. Faa um dump do processo deixando marcada a opo Rebuild Import. Para cada
mtodo de reconstruo da IAT disponvel, faa um dump diferente;
5. Faa um relatrio descrevendo o que fez at agora, incluindo o processo para encontrar o
OEP e para fazer o dump do programa.
Segunda parte
1. Execute o ImportRec, e depois execute o programa malicioso original (renomeie de
.dat para .exe);
2. Escolha o programa malicioso em execuo no ImportRec, clique em IAT Autosearch,
depois em Get Imports, e finalmente em Fix Dump. Escolha um dos arquivos dump
feito na primeira parte;
3. Abra o arquivo gerado acima e os dois arquivos de dump da primeira parte no IDA Pro e
examine as funes importadas e o cdigo analisado pelo IDA;
4. Verifique os arquivos com o LordPE para comparar as informaes sobre os arquivos gerados;
5. Faa um relatrio destacando as principais diferenas entre os mtodos utilizados e as
funes detectadas:
Primeira parte
1. No OllyDBG, abra o arquivo \Desktop\Malware\mal.Banker.Upack.abrir-fotos.scr;
2. Descubra a rea de memria na qual o programa ser descompactado;
83
0093789E
009378A0
INC EDI
009378A1
ADD AL,18
009378A3
CMP AL,2
009378A5
009378A7
009378A9
CMP AL,16
009378AB
009378AD
MOV AL,0
009378AF
BSWAP EAX
009378B1
009378B4
SUB EAX,EDI
009378B6
009378B7
; mal_Bank.0093789E
; mal_Bank.0093789E
; fim do loop
Analise este cdigo com seus colegas e faa um relatrio com suas concluses.
84
Segunda parte
1. Tente encontrar a posio de memria em que ficam armazenadas as DLLs e as funes
que sero carregadas para recriar a tabela de importao.
2. Qual cdigo utilizado para executar essa operao?
3. O que acontece com o mapa de memria do processo aps carregar todas as DLLs?
Terceira parte
1. Voc consegue encontrar a chamada ao OEP do programa? Se encontrar, faa um dump
do processo aps atingir o OEP.
2. Restaure o estado da mquina virtual para o snapshot inicial.
ponsveis pela descompresso, reconstruo da IAT e OEP, comente (:) e marque (Alt+M).
85
86
8
Apresentar tcnicas anti-debugging normalmente utilizadas e demonstrar tcnicas
para deteco e bypass destas protees.
conceitos
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?
objetivos
essas tcnicas e algumas ferramentas e medidas que podem ser tomadas para contra atacar.
87
Deteco de debugger
11 Kernel32.IsDebuggerPresent()
11 INT 3 (0xCC)
11 Timers
11 Exemplos:
22 start = GetTickCount();
22 alguma_funcao();
22 if (GetTickCount()-start > valorX)
22 Debugger_detectado();
A primeira tcnica que veremos tambm uma das mais perigosas no uso de mquinas
virtuais para a anlise de programas maliciosos. Alguns programas maliciosos tentam identificar se esto sendo executados dentro de um debugger, e podem modificar seu comportamento ou mesmo interromper seu funcionamento se conseguem detectar o debugger. Eles
podem realizar essa operao de diversas formas, e implementar verificaes peridicas
para dificultar ainda mais o trabalho do analista.
A biblioteca do sistema Kernel32.dll possui uma funo chamada IsDebuggerPresent()
que retorna verdadeiro caso o programa esteja sendo executado ao mesmo tempo que
um debugger.
Este tipo de proteo pode ser facilmente identificada e evitada. Como uma funo de
uma biblioteca padro que dever ser importada pelo programa, uma simples anlise das
funes importadas permite identificar seu uso. Mesmo que a tabela de importao esteja
modificada ou escondida, possvel recuper-la, conforme foi visto anteriormente.
A segunda forma de detectar um debugger atravs da execuo da instruo assembly INT 3.
Essa instruo usada por debuggers para implementar breakpoints no cdigo analisado.
Ao ser executada na presena de um debugger, esta instruo gera uma exceo no
sistema. Um programa malicioso pode executar essa instruo para gerar a exceo e parar
o funcionamento do programa. Quando o programa for executado sem um debugger, ele
funcionar normalmente.
88
Exerccio de fixao 2 e
Entry point
possvel executar um cdigo antes do entry point do arquivo?
do programa.
22 Nunca assuma que um programa malicioso no pode executar cdigo somente
por carregar em um debugger.
11 DLLMain() executado antes do debugger assumir.
22 http://www.insomniasec.com/publications/PreDebug.pdf
11 O cdigo de inicializao da Thread Local Storage (TLS) em arquivos PE executado
antes do debugger.
Quando um programa carregado, o sistema operacional mapeia os dados e o cdigo
na memria, inicializa variveis e passa o controle ao entry point do programa para iniciar
a execuo.
Ao executar este programa dentro de um debugger, a execuo do programa pausada
quando este atinge o entry point. Mas ao atingir esse ponto, uma brecha muito perigosa
aparece. No momento em que o sistema operacional inicializa as variveis do programa,
algumas funes do mesmo podem ser chamadas para realizar essa tarefa. Isto pode permitir que o cdigo do programa seja executado antes que o debugger assuma a execuo do
Um exemplo disso o caso de DLLs. Como elas so arquivos PE, ao carreg-las no debugger,
sua execuo ser paralisada no entry point. Mas em DLLs, a funo DLLMain() chamada antes
disso, permitindo ao programa malicioso executar cdigo antes da parada pelo debugger.
O TLS, como vimos anteriormente, a estrutura responsvel por manter a separao de
dados entre diferentes threads de um mesmo processo. Rotinas de inicializao do TLS so
chamadas antes do entry point, no momento da criao dos threads.
89
Cdigos no alinhados
11 JUMP ou CALL no meio de uma funo.
90
.aspack:00AE0000 _aspack
.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
.aspack:00AE0007
.aspack:00AE0007 loc_AE0007:
.aspack:00AE0007
jmp
.aspack:00AE0007 start
endp
.aspack:00AE0007
.aspack:00AE0007 ; ----------------------------------------------------------.aspack:00AE000C
db
.aspack:00AE000D
db 0C3h ; +
Modificaes no cabealho PE
11 Valores invlidos.
Figura 8.1
Truques de
controle de fluxo do
programa.
55h ; U
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.
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
aps instalar a funo, o programa gera uma exceo (XOR EAX, EAX; MOV [EAX], ECX), e a
funo instalada chamada. Esta funo na verdade a rotina de descompactao do programa.
Figura 8.2
Uso da ferramenta
PECompact2.
92
CODE:00401000
public start
CODE:00401000 start
proc near
CODE:00401000
mov
CODE:00401005
push
eax
CODE:00401006
push
CODE:0040100D
mov
CODE:00401014
xor
eax, eax
; EAX == 0
CODE:00401016
mov
[eax], ecx
db PECompact2,0
CODE:00401023
db 0AFh ; >>
CODE:00401024
db
CODE:00401025
db 0CEh ; +
7Eh ; ~
Exerccio de fixao 3 e
Ambiente virtualizado
Um cdigo malicioso pode ter um comportamento diferente dentro de um ambiente virtualizado?
93
94
Roteiro de Atividades 8
Atividade 8.1 Deteco de debugger
1. Execute o arquivo \Desktop\malware\IsDebuggerPresent.exe. O que acontece?
No OllyDBG, basta digitar qualquer caractere na linha que deseja mudar, e ele
insere estes caracteres nessa linha.
6. Discuta com seus colegas como combater este tipo de tcnica. Escreva um relatrio com
95
5. Com o OllyDBG, encontre o entry point original e descompacte o programa (como vimos
no Captulo 7). Faa um dump do binrio.
6. Faa um relatrio descrevendo os passos executados neste exerccio, o arquivo .IDB
gerado pelo IDA e o binrio extrado com o Olly, com uma descrio das informaes
importantes encontradas no binrio.
96
9
Apresentar um roteiro de anlise e pontos importantes durante a anlise de um
cdigo malicioso, assim como tcnicas de deteco das principais funcionalidades.
anlise de backtrace.
conceitos
Exerccio de nivelamento 1 e
Anlise de strings
Por que a anlise das strings encontradas no executvel pode facilitar o processo de identificao de funes de um cdigo malicioso?
Descobrindo o bsico
Roteiro de engenharia reversa:
objetivos
Anlise de um worm
97
Nos Captulos 9 e 10, veremos como realizar uma anlise detalhada de um programa malicioso real, identificando suas funcionalidades e capacidades. Neste ponto, o aluno j tem a
base terica necessria para comear a se aventurar, porque as atividades anteriores deram
um bom exemplo de como usar as ferramentas para analisar programas.
A partir de agora, podemos ento comear a usar um mtodo durante nossa anlise, para
facilitar o trabalho e permitir a reproduo dos resultados, caso necessrio.
Como a engenharia reversa pode ser uma tarefa demorada e complexa, a melhor estratgia
comear a anlise do programa pelas ferramentas mais fceis, procurando as informaes
mais prontamente disponveis. Por isso, comece pelo mais simples:
11 Extraia as strings do arquivo, para ver se elas do alguma dica do que o programa faz,
e para us-las como ponto de partida em sua anlise. muito mais fcil identificar uma
funo que usa a string HKLM\Software\Microsoft\Windows\CurrentVersion\Run, do
que uma que no utilize nenhuma string visvel.
11 Examine as funes importadas. Uma chamada CreateFileA() ou LoadLibraryA() deve
conter alguma informao importante sobre o funcionamento do programa.
11 Aplique as assinaturas apropriadas. Use a funcionalidade do IDA de detectar cdigo
padro, e evite o trabalho de analisar cdigo de bibliotecas do sistema.
11 Examine os nomes de estruturas detectadas automaticamente e o grfico de chamadas
de funes. Elas podem dar indicaes das operaes que aquela funo executa.
11 Examine as funes mais bvias e d nomes claros. Ao analisar os grficos de funes que
chamam essas funes mais simples, o funcionamento delas pode se tornar mais claro.
11 Se o cdigo contiver strings obfuscadas, identifique-as e tente desobfusc-las usando
os plugins do IDA.
11 Examine chamadas a funes importadas. Quais funes as utilizam? Quais parmetros so
passados? Isso pode ajud-lo a identificar funcionalidades e descobrir os tipos de variveis.
Veremos neste captulo um pouco mais sobre essas tcnicas mais simples.
Responda s perguntas especficas:
Analisar um binrio desconhecido pode ser to complexo que o analista poderia levar
meses realizando essa tarefa. Se seu objetivo somente identificar formas de se proteger
contra tal praga, no necessrio analisar todo o cdigo, funo por funo.
Exerccio de fixao 1 e
Identificao do cdigo
Quando no for possvel identificar o cdigo, como podemos proceder?
Emulao
11 Plugin X86Emu para IDA Pro Free disponvel em:
22 http://www.idabook.com/ida-x86emu/
11 Para us-lo, copie para o diretrio Plugins do IDA e:
22 Carregue o malware no IDA.
22 Execute o plugin IDA-x86-meu.
22 Clique em push data.
22 Entre com 0 0 0 0 0 0 0 .... para criar um espao no Stack.
22 D duplo clique em ESP e copie o valor para EBP.
22 Pronto, basta executar o programa com Run ou Step.
11 Com ele, possvel emular apenas partes do cdigo.
22 Coloque os valores apropriados no Stack.
22 Modifique os registradores, se necessrio.
22 Posicione o cursor na primeira instruo a emular.
22 Execute com Run ou Step.
Em ltimo caso, se no for possvel identificar uma parte do cdigo, seja por ele estar obfuscado 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 executadas 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
tificar corretamente os registradores utilizados pelo cdigo, os parmetros que a funo
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?
11 Procure e tente identificar suas funcionalidades.
11 Lembre-se de usar os comentrios e de renomear as funes e variveis que identificar.
ou criptografia de um dado, pode executar somente aquela parte do cdigo. Basta iden-
99
Address
Length
Type String
....UPX0:0... 00000007
%s.zip
....UPX0:0... 00000005
html
....UPX0:0... 0000000C
%d%d%d%d
....UPX0:0... 00000041
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345...
....UPX0:0... 0000009B
....UPX0:0... 00000031
Content-Type: multipart/mixed;\r\n\tboundary=\%s\\r\n
....UPX0:0... 00000016
\r\nMINE-Version: 1.0\r\n
....UPX0:0... 0000000
Date:
....UPX0:0... 0000000E
Subject:%s\r\n
....UPX0:0... 00000009
To:%s\r\n
....UPX0:0... 0000000B
From:%s\r\n
....UPX0:0... 0000001D
----=_%s_%.3u_%.4u_%8.X.%8.X
....UPX0:0... 00000009
NextPart
....UPX0:0... 0000000F
\r\n\r\n--%s--\r\n\r\n
....UPX0:0... 0000008B
--%s\r\nContent-Type: application/octet-stream;\r\n\tname=\%s\\\r\nCont...
....UPX0:0... 00000007
inline
....UPX0:0... 00000007
\r\n\r\n\r\n
....UPX0:0... 00000058 C
--%s\r\nContent-Type: text/plain;\r\n\tcharset=us-ascii\r\nContent-Transfer-...
....UPX0:0... 00000031
....UPX0:0... 00000007
QUIT\r\n
....UPX0:0... 00000006
\r\n.\r\n
....UPX0:0... 00000007
DATA\r\n
....UPX0:0... 0000000D
RC%s0:<%s>\r\n
....UPX0:0... 00000005
PT T
Funes importadas
11 Quais funes usam essas chamadas?
100
Figura 9.1
Aba de strings
do IDA.
Procure identificar todas as funes chamadas, pois elas fornecem uma tima indicao do
funcionamento do programa.
Name
Library
00501004
RegOpenKeyExA
ADVAPI32
00501008
RegSetValueExA
ADVAPI32
0050100C
RegQueryValueExA
ADVAPI32
00501010
RegEnumKeyA
ADVAPI32
00501014
RegCreateKeyExA
ADVAPI32
0050101C
FindClose
kernel32
00501020
GetFileSize
kernel32
00501024
FindNextFileA
kernel32
00501028
MapViewOfFile
kernel32
0050102C
UnmapViewOfFile
kernel32
00501030
FileFirstFileA
kernel32
00501034
GetEnvironmentVariableA
kernel32
00501038
GetDriveTypeA
kernel32
0050103C
GetSystemTime
kernel32
00501040
WriteFile
kernel32
00501044
CreateFileMappingA
kernel32
00501048
LoadLibraryA
kernel32
0050104C
CreateProcessA
kernel32
00501050
GlobalAlloc
kernel32
00501054
GetLastError
kernel32
00501058
CreateMutexA
kernel32
0050105C
IstrcatA
kernel32
00501060
GetFileAttributesA
kernel32
00501064
CopyFileA
kernel32
00501068
DeleteFileA
kernel32
Assinaturas de cdigo
Aplicao de assinaturas:
Figura 9.2
Aba funes
importadas do IDA.
Address
101
File
State
Library name
d3vcl
Applied
b32vcl
Applied
bcb5rt
Applied
CBuilder 5 runtime
bds8vcl
Applied
bcb5rt
Applied
CBuilder 5 runtime
c4vcl
Applied
d4vcl
Applied
d5vcl
Applied
bds2006
Applied
bds2007
Applied
bds40
Applied
msmfc2
Applied
bds
Applied
bds
Applied
exe
Applied
bh32ocf
Applied
bh32dbe
Applied
bh32rw32
Applied
bp32_2
Applied
msddk32
Applied
pe
Applied
Startups of PE files
Visualizao grfica
Verificar estrutura do entry point:
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 concentram 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,
Engenharia Reversa de Cdigo Malicioso
102
Figura 9.3
Uso das assinaturas
do IDA.
public start
start
proc near
; CODE XREF:
var_298
ThreadId
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
; int
push
eax
; void *
call
memset
push
eax
call
sub_5031E4
; ThreadId
add
esp, 10h
push
call
ExitProcess
; uExitCode
start
ExitProcess
GetTickCount
sub_5031E4
sub_503384
sub_502C90
...
sub_50511C
sub_505658
...
sub_502E50
Create Thread
sub_502D8E
...
...
StartAddress
...
sub_504C09
sub_502F80
...
sub_50315C
...
Sleep
sub_504C18
...
sub_5075E5
...
memset
__imp_memset
sub_5033AB
103
Exerccio de fixao 2 e
Identificao do cdigo II
Figura 9.4
Chamada de
funes de
biblioteca e funes
desconhecidas.
Muitas vezes partir do entry point do arquivo para descobrir um funcionamento muito
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:
pressione R.
104
[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
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]
Funes bsicas
Para identificar funes bsicas:
11 Comece pelas funes do entry point e por aquelas que utilizam funes importadas.
11 Lembre-se de comentar o cdigo e renomear funes e variveis (selecione o nome e
use N).
11 Use F12, CTRL-SHIFT-F e CTRL-SHIFT-T para examinar o grfico de fluxo e o grfico de
chamadas das funes que analisar.
11 Algumas vezes este procedimento ajuda a entender o funcionamento do cdigo.
Figura 9.5
Referncia funo
RegOpenKeyExA.
mov
105
call
GetTickCount
mov
retn
SaveCurrentTime endp
; ||||||||||||||| S U B R O U T I N E ||||||||||||||||||||||||||||||||||||||
imul
eax, 343FDh
add
eax, 269EC3h
mov
mov
retn
RandomNumberGenerator endp
Figura 9.6
Identificao de
funes bsicas.
Anlise de cdigo
106
Function
Segment
Length
CheckfPunctuation
UPX0
00000022
CompareStringsWithTable
UPX0
00000036
CompareTwoStrings
UPX0
00000030
CreateRegKeyMutex
UPX0
000000FE
CreateRegKeyRun
UPX0
00000140
CreateSystemMutex
UPX0
000000C2
CreateTempFile
UPX0
00000160
FindOutlookIEWindow
UPX0
0000003F
FindOutlookAddressBook
UPX0
00000124
GenerateRandomEmailID
UPX0
00000016
GenerateTimestamp
UPX0
000000DD
GetInternetConnectionState
UPX0
00000077
MainThread
UPX0
0000009C
MaybeConvertStringToLowercase UPX0
0000004A
RandomNumberGenerator
UPX0
0000001C
RegisterProcessAsService
UPX0
00000088
SaveCurrentTime
UPX0
0000000C
SendMsgToOutLookAndIE
UPX0
0000002C
memcpy
UPX0
00000006
memset
UPX0
00000006
start
UPX0
0000004A
sub_5034BB
UPX0
00000168
sub_503697
UPX0
000000E6
sub_50377D
UPX0
0000009C
.
Figura 9.7
Anlise de cdigo.
107
108
Roteiro de Atividades 9
Atividade 9.1 Strings
1. Abra o arquivo mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dumped.dat criado no
Roteiro de Atividades do Captulo 7;
2. Examine as strings contidas no executvel;
3. Encontre e analise pelo menos trs funes que usem estas strings;
4. Examine as funes que utilizam essas strings, e tente identificar como elas funcionam;
5. Use os comentrios no cdigo e renomeie as variveis e nomes de funo de acordo com
o que encontrar.
caso especfico.
109
4. Identifique pelo menos trs funes bsicas nas pontas do grfico de chamada do programa.
110
10
Aplicar o conhecimento adquirido durante em uma anlise de uma ameaa real,
descobrindo suas principais funcionalidades, assim como detectar funes
escondidas dentro do cdigo.
conceitos
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
a algumas perguntas:
11 Como ele se propaga?
11 Que dados ele acessa ou modifica?
11 Como ele se mantm no sistema?
11 Existe algum backdoor escondido?
11 Que aes ele toma aps invadir o sistema?
11 Qual o impacto da presena do programa malicioso no computador do usurio?
Neste captulo, vamos finalizar a anlise do programa malicioso que iniciamos no captulo
anterior. Como voc j deve ter identificado diversas funes nas atividades do Captulo 9,
usaremos esse conhecimento para identificar as caractersticas mais genricas do programa.
objetivos
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?
112
CreateMIMEHeader
memset
IstrcatA
CreateFileAttachment
CreateFileA
GenerateSomeString
GenerateSubjectAndAttachmentName
ReadFile
__imp_memset
Closehandle
GeneratePartOfHeader
GenerateIPAddressOrTimeStamp
RandomNumberGenerator
GetTimeZoneInformation
Figura 10.1
Mdulo que cria
o cabealho da
mensagem MIME.
FileTimeToSystemTime
wsprintfA
GenerateTimestamp
FileTimeToLocalFileTime
IstrlenA
IstrcpyA
GetLocalTime
A figura anterior mostra o mdulo que cria o cabealho da mensagem MIME que ser
enviada com o worm em anexo. As chamadas s funes importadas esto em cinza no
grfico. Neste grfico podemos perceber duas partes principais, a que cria o arquivo
anexado e a que gera o timestamp e os IPs que sero usados na criao do cabealho falso.
Alm disso, podemos ver que ambas as partes usam a funo de gerao de nmeros
randmicos que vimos anteriormente.
Como a comunicao com o servidor de e-mail?
SendSpam
RegEnumKeyA
RegOpenKeyExA
memset
__imp_memset
wnsprintfA
Figura 10.2
Funes no
identificadas ou no
compreendidas.
FindConguredMailServer
wsprintfA
RegQueryValueExA
DeobfuscateString
sub_506AB8
IstrcatA
MaybeTalkToMailServer
MaybeCreateRandomEmail
IstrlenA
CharlowerA
IstrcpyA
TalkToMailServer
PrintEmailAddress
IstrcmpiA
No caso do MyDoom, a propagao ocorre atravs do envio de e-mails para o servidor SMTP
configurado no sistema. Inicialmente ele pesquisa o registro procurando pelas configuraes
de e-mail do Outlook, e depois se conecta ao servidor, enviando os comandos necessrios.
Observe na figura que algumas funes no foram identificadas ou no foram compreendidas
RandomNumberGenerator
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
;
;
;
;
;
CreateRegKeyRun
RegOpenKeyExA
Figura 10.4
Funo de
pesquisa.
IstrlenA
RegOpenKeyExA
RegQueryValueExA
CreateMapViewOfFile
memset
...
...
RegSetValueExA
Aqui temos alguns exemplos de chamada a funes que acessam ou modificam dados no
registro. Lembre-se de que as caixas mostradas em rosa nos grficos de chamada so
funes importadas de bibliotecas, e as em preto so funes do programa.
FindOutlookAddressBook
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.
116
E finalmente, veremos como identificar o tipo de impacto que o programa tem no sistema
como um todo. Alguns vrus costumam sobrecarregar a mquina com um processamento
muito agressivo, como ao executar um ataque de negao de servios, ou enviar spam
indiscriminadamente.
11 O programa sobrevive ao boot?
22 Vimos que existe uma funo que cria uma chave de registro em:
33 \Software\Microsoft\Windows\CurrentVersion\Run
33 Instalar um servio.
33 Salvar o executvel em um diretrio de inicializao.
33 Instalar uma extenso do shell do Explorer.
Vimos que o programa cria uma chave de registro para se reiniciar quando o sistema for
desligado. Alm desse mtodo, um programa pode usar outras formas para se manter ativo
aps um reboot. Existem diversas chaves de registro que podem ser usadas para isso, conforme os exemplos seguintes:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
Winlogon
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
RunOnce
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\
RunService
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
RunService
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\
Mais informaes sobre essas chaves podem ser encontradas nos links:
11 http://antivirus.about.com/od/windowsbasics/tp/autostartkeys.htm
11 http://technet.microsoft.com/en-us/sysinternals/bb963902.aspx
Lembre-se de que um programa pode instalar um servio ou usar um diretrio de inicializao do Windows, como o diretrio Startup.
Figura 10.5
Criando uma chave
de registro.
RegOpenKeyExA
IstrlenA
RegSetValueExA
CreateRegKeyRun
117
push
44h
lea
eax, [ebp+Dst]
pop
esi
push
esi
; Size
push
ebx
; Val
push
eax
; Dst
call
memset
add
esp, 18h
lea
eax, [ebp+ProcessInformation]
mov
[ebp+Dst], esi
mov
[ebp+var_1C], 81h
push
eax
lea
eax, [ebp+Dst]
push
eax
; 1pStartupInfo
push
ebx
; 1pCurrentDirectory
push
ebx
; 1pEnvironment
push
ebx
; dwCreationFlags
push
; bInheritHandles
push
ebx
; 1pThreadAttributes
push
eax, [ebp+CommandLine]
push
ebx
; 1pProcessAttributes
push
eax
; 1pCommandLine
push
ebx
; 1pApplicationName
mov
[ebp+var_18], bx
call
CreateProcessA
; 1pProcessInformation
mltiplas.
118
Figura 10.6
Chamada funo
CreateProcessA.
Como vimos, um programa pode usar um mutex para evitar infectar um computador mais
de uma vez. Existem basicamente trs tipos de mutex que podem ser criados:
11 Mutex no kernel: atravs de uma chamada CreateMutexA() o programa cria um semforo no sistema operacional. Este semforo fica ativo enquanto o sistema no for reiniciado. Ao iniciar, o processo pode fazer uma tentativa de criar o mutex e, se o processo
falhar, significa que j existe uma cpia do processo em memria.
11 Mutex por arquivo: o programa cria um arquivo especfico que indica que ele j foi executado no sistema. Se este arquivo existir, a mquina j foi comprometida. Normalmente
estes arquivos no tm nenhum contedo e so criados em locais escondidos para evitar
que sejam descobertos e apagados.
11 Mutex por chaves de registro: alm de criar um arquivo no sistema de arquivos, um
processo pode criar chaves de registro para indicar sua execuo prvia. Estas chaves
costumam no ter nenhum efeito no funcionamento do sistema. Se o analista encontra
a criao de uma chave de registro que aparentemente no tem nenhum impacto no
sistema, esta pode estar sendo usada como mutex.
CreateSystemMutex
GetLastError
CreateMutexA
IstrcatA
Figura 10.7
Mutex por chaves
de registro.
CreateRegKeyMutex
memset
__imp_memset
RegCreateKeyExA
RegOpenKeyExA
tcnicas, entre elas a pesquisa em arquivos de documentos. Isto pode causar uma grande
119
StartHarvestEmailThreads
GetCurrentThread
GetDriveTypeA
HarvestEmailInFiles
SearchAddressBookFile
FindTempUserDir
GetWindowsDirectoryA
GetEnvironmentVariableA
CheckValidFileExtension
Sleep
HeapFree
CharLowerA
ReadSomeData
ReadFile
LstrcpynA
CloseHandle
ChooseUsernameForEmail
LstrcnpA
MaybeCheckSizeOfStrings
GetTickCount
CreateFileA
CompareStringsWithTable
CompareTwoStrings
SearchForAtOrSpace
CreateMapViewOfFile
FindSomething
WideCharToMultiByte
CheckForValidEmailAddress
ToLower
LstrCatA
isdigit
LstrLenA
RegQueryValueExA
FindNextFileA
MaybeCheckForSpeacialChars
LstrcmpiA
__imp_memset
RagOpenKeyExA
FindClose
CreateFileMappingA
GatherEmailAddressInFiles
FindOutLookAddressBook
RandomNumberGenerator
memset
ChooseDomainNameForEmail
LstrcpyA
FindFirstFileA
SearchForEmailInFiles
MaybeMapFileToMemory
HeapAlloc GetProcessHeap
SetThreadPriority
memcpy
MaybeConvertStringToLowercase
SearchForEmailAddress
CheckIfPunctuation
__imp_memcpy
isalnum
strchr
isspace
Figura 10.8
Criao de threads
no sistema dentro
de um loop infinito.
120
StartHarvestEmailThreads
GetDriveTypeA
HarvestEmailInFiles
SearchAddressBookFile
FindTempUserDir
GetWindowsDirectoryA
GetEnvironmentVariableA
CheckValidFileExtension
Sleep
HeapFree
CharLowerA
ReadSomeData
ReadFile
LstrcpynA
CloseHandle
ChooseUsernameForEmail
LstrcnpA
MaybeCheckSizeOfStrings
GetTickCount
CreateFileA
CompareStringsWithTable
CompareTwoStrings
SearchForAtOrSpace
isspace
Figura 10.9
Criao de threads
no sistema dentro
de um loop infinito.
CreateMapViewOfFile
FindSomething
WideCharToMultiByte
CheckForValidEmailAddress
ToLower
LstrCatA
isdigit
LstrLenA
RegQueryValueExA
FindNextFileA
MaybeCheckForSpeacialChars
LstrcmpiA
__imp_memset
RagOpenKeyExA
FindClose
CreateFileMappingA
GatherEmailAddressInFiles
FindOutLookAddressBook
RandomNumberGenerator
memset
ChooseDomainNameForEmail
LstrcpyA
FindFirstFileA
SearchForEmailInFiles
MaybeMapFileToMemory
HeapAlloc GetProcessHeap
SetThreadPriority
memcpy
MaybeConvertStringToLowercase
SearchForEmailAddress
CheckIfPunctuation
__imp_memcpy
isalnum
strchr
GetCurrentThread
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?
CreateServiceExeProcess
wsprintfA
memset
__imp_memset
DropDLLBackdoor
writeFile
ReadSomeFile
SetFilePointer
122
CopyFileToTemp
ReadFile
CreateProcessA
CreateZinciteLogFilename
IstrcpyA
GetWindowsDirectoryA
GetModuleFileNameA
IstrlenA
IstrcatA
Concluso
11 Mesmo depois de tudo isso, ainda existem muitos dados no identificados no programa.
11 Como ltima alternativa, possvel executar o programa dentro da mquina virtual e
analisar o tratamento desses dados.
11 Ainda existe outro binrio embutido neste programa! Voc consegue ach-lo?
11 Estude as solues sugeridas nas atividades e treine o mximo que puder.
CreateFileA
CloseHandle
GetTempPathA
Figura 10.10
Abertura de um
backdoor.
O objetivo deste curso foi oferecer o conhecimento mnimo para analisar programas maliciosos. importante lembrar sempre que somente o treino constante vai trazer a proficincia,
e quanto mais variados forem os exemplos utilizados, melhor.
Mesmo no exemplo usado nos dois ltimos captulos, ainda existem muitas informaes a
serem identificadas, incluindo outro binrio embutido.
11 A proficincia em engenharia reversa s vem com a experincia.
123
124
Roteiro de Atividades 10
Atividade 10.1 Como ele se propaga?
Aps a identificao de funes do programa, usaremos essas informaes para descrever
as suas caractersticas mais gerais e seus mtodos de ao, auxiliando na identificao da
praga na rede e na criao de mtodos de proteo contra novas infeces.
1. Procure por funes de acesso rede ou de envio de e-mail;
2. Procure por funes de criao e leitura de arquivos;
3. Verifique nas strings se existe alguma dica;
4. Descubra funes para criar o spam;
5. Existe algum acesso rede?
7. Tente agora identificar as funes que fazem a criao e o envio dos e-mails com o worm
anexado. Tente identificar e analisar um mnimo de cinco funes e variveis possveis.
8. Use os comentrios no cdigo para marcar reas importantes e identificar a lgica de
criao do spam. Informaes que podem ser muito teis para o combate a essa praga
em uma rede so os possveis nomes dos arquivos anexados ou nomes de usurios para
os quais o worm ser enviado.
125
126
Bibliografia
11 Cartoon Hackers: http://hackerschool.org/DefconCTF/17/B300.html
11 EAGLE, Chris. The IDA Pro Book The Unofficial Guide to the Worlds Most
Popular Disassembler.
11 Free IDA Pro Binary Auditing Training Material for University Lectures:
http://www.binary-auditing.com/
11 GUILFANOV, Ilfak. TLS callbacks: http://www.hexblog.com/
11 HINES, Eric S. MyDoom.B Worm Analysis de Applied Watch Technologies:
http://isc.sans.org/presentations/MyDoom_B_Analysis.pdf
11 Malware Analysis System: https://mwanalysis.org/ (antigo CWSandbox).
11 Microsoft PE and COFF Specification: http://msdn.microsoft.com
11 OpenRCE Open Reverse Code Engineering community:
http://www.openrce.org/
11 OS X ABI Mach-O File Format Reference. Mac Developer Library, 2009.
11 PC Assembly Language Tutorial: http://www.drpaulcarter.com/cs/
11 PIETREK, Matt. A Crash Course on the Depths of Win32 Structured Exception
Handling. Microsoft Systems Journal, 1997.
11
Bibliografia
127
ISBN 978-85-63630-26-1
9 788563 630261