Você está na página 1de 144

Engenharia Reversa de

Cdigo Malicioso
Guilherme Venere

Engenharia Reversa de

Cdigo Malicioso
Guilherme Venere

Engenharia Reversa de

Cdigo Malicioso
Guilherme Venere

Rio de Janeiro Escola Superior de Redes 2013

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

Diretor Geral Nelson Simes Diretor de Servios e Solues Jos Luiz Ribeiro Filho

Escola Superior de Redes


Coordenao Luiz Coelho Edio Pedro Sangirardi Reviso Lincoln da Mata Reviso Tcnica Thiago Oliveira Marques Coordenao Acadmica de Segurana e Governana de TI Edson Kowask Bezerra Equipe ESR (em ordem alfabtica) Celia Maciel, Cristiane Oliveira, Derlina Miranda, Elimria Barbosa, Evellyn Feitosa, Felipe Nascimento, Lourdes Soncin, Luciana Batista, Luiz Carlos Lobato, Renato Duarte e Yve Abel Marcial. Capa, projeto visual e diagramao Tecnodesign Verso 1.0.1 Este material didtico foi elaborado com fins educacionais. Solicitamos que qualquer erro encontrado ou dvida com relao ao material ou seu uso seja enviado para a equipe de elaborao de contedo da Escola Superior de Redes, no e-mail info@esr.rnp.br. A Rede Nacional de Ensino e Pesquisa e os autores no assumem qualquer responsabilidade por eventuais danos ou perdas, a pessoas ou bens, originados do uso deste material. As marcas registradas mencionadas neste material pertencem aos respectivos titulares. Distribuio

Escola Superior de Redes

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

Dados Internacionais de Catalogao na Publicao (CIP) V454e Venere, Guilherme Engenharia reversa de cdigo malicioso / Guilherme Venere. 1. ed. aum. Rio de Janeiro: RNP/ESR, 2013. 128 p. : il. ; 28 cm. Bibliografia: p. 127. ISBN 978-85-63630-26-1

1. Engenharia de software. 2. Assembly (Linguagem de programao). 3. Segurana de software. 4. IDA Pro (software). 5. OllyDBG (software). I. Ttulo. CDD 005.12

Sumrio
Escola Superior de Redes
A metodologia da ESRix Sobre o curso x A quem se destinax Convenes utilizadas neste livrox Permisses de usoxi Sobre os autoresxii

1. Introduo engenharia reversa


Introduo1 Exerccio de nivelamento 1 Arquivos maliciosos2 Exerccio de fixao 1 Objetivo da engenharia reversa2 Definio2 Exerccio de fixao 2 Diferena entre vrus e trojan 3 Tipos de programas maliciosos3 Aes de um programa malicioso3 Exerccio de fixao 3 Engenharia social4 Formas de ataque4 Como a propagao?5 Quais funcionalidades o programa tem?5 Quais modificaes o programa causa?5 Qual o objetivo do cdigo?5 Classificao de cdigo malicioso6 Exerccio de fixao 4 Ambiente virtualizado6 iii

Ambiente de anlise7 Virtualizao x Emulao 8 Anlise ao vivo x Engenharia reversa 8 Roteiro de Atividades 19 Atividade 1.1 Anlise dinmica de binrio desconhecido9

2. Ferramentas
Montagem do ambiente de anlise11 Exerccio de nivelamento 1 Ferramentas11 VMWare12 Exerccio de fixao 1 VMWare13 Debugger13 Debuggers para Windows13 Exerccio de fixao 1 Decompilador e disassembler14 Decompilador14 Exerccio de fixao 2 Arquivos binrios14 Manipuladores de binrios15 Disassembler15 Roteiro de Atividades 217 Atividade 2.1 Configurao do VMWare17 Atividade 2.2 Ferramentas de decompilao18 Atividade 2.3 Ferramentas de manipulao de binrios18

3. Introduo ao IDA Pro e OllyDBG


Introduo ao IDA Pro19 Exerccio de nivelamento 1 IDA Pro e OllyDGB20 Exerccio de fixao 1 Conhecendo o IDA Pro21 IDA Pro22 Funcionalidades 23 Atalhos 24 Algoritmo de autoanlise 25 Grficos 25 Signatures e Type Library 27 Introduo ao OllyDBG28 Conhecendo o OllyDBG29

iv

Exerccio de fixao 2 OllyDGB30 Funcionalidades do OllyDBG30 Plugins31 Atalhos32 Roteiro de Atividades 333 Atividade 3.1 Signatures e Type Library33 Atividade 3.2 IDA Pro34 Atividade 3.3 OllyDBG34

4. Formato de arquivos executveis


Exerccio de fixao 1 Arquivos executveis37 Formato de arquivos executveis37 Exerccio de nivelamento 1 Execuo de cdigo38 Formato PE38 Estrutura do cabealho PE38 Cabealhos do formato PE41 Tabela de importao43 Cabealho de seo44 Roteiro de Atividades 445 Atividade 4.1 Navegando pela estrutura de um arquivo PE45 Atividade 4.2 Examinando arquivos PE45

5. Assembly bsico parte 1


Exerccio de fixao 1 Assembly47 Exerccio de nivelamento 1 Identificao de parmetros47 Assembly bsico47 Registradores49 Stack51 Layout de memria51 Exerccio de fixao 2 Tratamento de exceo54 Structured Exception Handling54 Instrues bsicas assembly54 Instrues assembly: Nmeros56 Instrues assembly: Endereamento56

Instrues assembly: Chamada de funo57 Instrues assembly: Enquadramento59 Instrues assembly: Parmetros de funo59 Roteiro de Atividades 561 Atividade 5.1 Structured Exception Handling61 Atividade 5.2 Estrutura de memria dos executveis61

6. Assembly bsico parte 2


Exerccio de fixao 1 Cdigo assembly63 Exerccio de nivelamento 1 Cdigo assembly63 Ramificaes63 Blocos condicionais64 Loops65 Switch66 Memcpy()/Strcpy()68 Strlen()/Strstr()68 Estruturas69 Operaes matemticas70 Nmeros randmicos71 Exerccio de fixao 2 Variveis em cdigos assembly72 Variveis72 Variveis de API72 Recuperao de tipos73 Cdigo orientado a objetos74 Lgica branchless75 Assembly bsico76 Roteiro de Atividades 677 Atividade 6.1 Assembly bsico77 Atividade 6.2 Reconhecimento de cdigos77

7. Import Address Table


Exerccio de fixao 1 Tabela de importao79 Exerccio de nivelamento 1 Tabela de importao79

vi

Import Address Table79 Reconstruo da IAT80 Roteiro de Atividades 783 Atividade 7.1 Recuperando a IAT com ferramentas83 Atividade 7.2 Recuperando a IAT manualmente83 Atividade 7.3 Anlise esttica85

8. Truques anti-engenharia reversa


Exerccio de fixao 1 Protetores de cdigo87 Exerccio de nivelamento 1 Debugger87 Truques anti-engenharia reversa87 Deteco de debugger88 Exerccio de fixao 2 Entry point89 Execuo de cdigo antes do Entry Point89 Thread Local Storage89 Cdigos no alinhados90 Modificaes no cabealho PE91 Structure Exception Handling92 Exerccio de fixao 3 Ambiente virtualizado93 Deteco de mquinas virtuais93 Tcnicas anti-engenharia reversa94 Roteiro de Atividades 895 Atividade 8.1 Deteco de debugger95 Atividade 8.2 Thread Local Storage95 Atividade 8.3 Cdigos no alinhados95 Atividade 8.4 Structured Exception Handling96

9. Anlise de um worm
Exerccio de nivelamento 1 Anlise de strings97 Descobrindo o bsico97 Exerccio de fixao 1 Identificao do cdigo 99 Emulao99 Strings99 Funes importadas100 vii

Assinaturas de cdigo101 Visualizao grfica102 Exerccio de fixao 2 Identificao do cdigo II104 Anlise de backtrace104 Funes bsicas105 Anlise de cdigo106 Roteiro de Atividades 9109 Atividade 9.1 Strings109 Atividade 9.2 Funes importadas109 Atividade 9.3 Assinatura de cdigo109 Atividade 9.4 Visualizao grfica109 Atividade 9.5 Anlise de backtrace110 Atividade 9.6 Funes bsicas110

10. Anlise do worm MyDoom


Exerccio de nivelamento 1 Anlise de backtrace111 Anlise do MyDoom111 Exerccio de fixao 1 Aplicando os conhecimentos112 Como ele se propaga?112 Quais dados so acessados ou modificados?114 Como ele se mantm no sistema?116 Exerccio de fixao 2 Executvel escondido122 Existe algum backdoor escondido?122 Concluso122 Roteiro de Atividades 10125 Atividade 10.1 Como ele se propaga?125 Atividade 10.2 Que dados ele acessa ou modifica?125 Atividade 10.3 Como ele se mantm no sistema?126 Atividade 10.4 Existe algum backdoor escondido?126 Atividade 10.5 Script IDC126

Bibliografia 127

viii

Escola Superior de Redes


A Escola Superior de Redes (ESR) a unidade da Rede Nacional de Ensino e Pesquisa (RNP) responsvel pela disseminao do conhecimento em Tecnologias da Informao e Comunicao (TIC). A ESR nasce com a proposta de ser a formadora e disseminadora de competncias em TIC para o corpo tcnico-administrativo das universidades federais, escolas tcnicas e unidades federais de pesquisa. Sua misso fundamental realizar a capacitao tcnica do corpo funcional das organizaes usurias da RNP, para o exerccio de competncias aplicveis ao uso eficaz e eficiente das TIC. A ESR oferece dezenas de cursos distribudos nas reas temticas: Administrao e Projeto de Redes, Administrao de Sistemas, Segurana, Mdias de Suporte Colaborao Digital e Governana de TI. A ESR tambm participa de diversos projetos de interesse pblico, como a elaborao e execuo de planos de capacitao para formao de multiplicadores para projetos educacionais como: formao no uso da conferncia web para a Universidade Aberta do Brasil (UAB), formao do suporte tcnico de laboratrios do Proinfo e criao de um conjunto de cartilhas sobre redes sem fio para o programa Um Computador por Aluno (UCA).

A metodologia da ESR
A filosofia pedaggica e a metodologia que orientam os cursos da ESR so baseadas na aprendizagem como construo do conhecimento por meio da resoluo de problemas 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

As sesses de aprendizagem onde se do a apresentao dos contedos e a realizao das atividades prticas tm formato presencial e essencialmente prtico, utilizando tcnicas de estudo dirigido individual, trabalho em equipe e prticas orientadas para o contexto de atuao do futuro especialista que se pretende formar. As sesses de aprendizagem desenvolvem-se em trs etapas, com predominncia de tempo para as atividades prticas, conforme descrio a seguir: Primeira etapa: apresentao da teoria e esclarecimento de dvidas (de 60 a 90 minutos). O instrutor apresenta, de maneira sinttica, os conceitos tericos correspondentes ao tema da sesso de aprendizagem, com auxlio de slides em formato PowerPoint. O instrutor levanta questes sobre o contedo dos slides em vez de apenas apresent-los, convidando a turma reflexo e participao. Isso evita que as apresentaes sejam montonas e que o aluno se coloque em posio de passividade, o que reduziria a aprendizagem. Segunda etapa: atividades prticas de aprendizagem (de 120 a 150 minutos). Esta etapa a essncia dos cursos da ESR. A maioria das atividades dos cursos assncrona e realizada em duplas de alunos, que acompanham o ritmo do roteiro de atividades proposto no livro de apoio. Instrutor e monitor circulam entre as duplas para solucionar dvidas e oferecer explicaes complementares. Terceira etapa: discusso das atividades realizadas (30 minutos). O instrutor comenta cada atividade, apresentando uma das solues possveis para resolv-la, devendo ater-se quelas que geram maior dificuldade e polmica. Os alunos so convidados a comentar as solues encontradas e o instrutor retoma tpicos que tenham gerado dvidas, estimulando a participao dos alunos. O instrutor sempre estimula os alunos a encontrarem solues alternativas s sugeridas por ele e pelos colegas e, caso existam, a coment-las.

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

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

Convenes utilizadas neste livro


As seguintes convenes tipogrficas so usadas neste livro: Itlico Indica nomes de arquivos e referncias bibliogrficas relacionadas ao longo do texto.

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

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

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

Smbolo
Indica um documento como referncia complementar.

Smbolo
Indica um vdeo como referncia complementar.

Smbolo
Indica um arquivo de adio como referncia complementar.

Smbolo
Indica um aviso ou precauo a ser considerada.

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

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

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

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

xi

Sobre os autores
Guilherme Venere Team Leader da equipe de Anlise de Malware do McAfee Lab e atua como analista de malware pelos ltimos 4 anos, trabalhando com anlise avanada de malware a partir do escritrio de pesquisa do McAfee Labs no Chile, criando deteces para novas ameaas a clientes McAfee. Tem 7 anos de experincia em segurana de redes e tratamento de incidentes, trabalhando para o backbone acadmico Brasileiro. bacharel em Cincia da Computao pela Universidade Federal de So Carlos e certificado em an lise forense pelo Instituto SANS. Thiago Oliveira Marques formado em Cincias da Computao pelo Centro 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
Introduo engenharia reversa
objetivos
Explicar o que a engenharia reversa e como ela pode ser utilizada na anlise de malwares; entender as diferenas entre os tipos de cdigos maliciosos e conhecer os tipos de ambientes de anlise.

conceitos

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

Introduo
Engenharia reversa: 11 Processo de descoberta do funcionamento interno de um programa de computador sem ter acesso ao cdigo-fonte. 11 Este processo pode ser to simples como executar o programa e monitorar suas aes e resultados, ou to complexo quanto analisar as instrues de cdigo de mquina, uma a uma. Um especialista em engenharia reversa precisa responder perguntas como: 11 O que exatamente este software faz? 11 Qual parte do cdigo responsvel pelo acesso rede? 11 Quais parmetros ele aceita? 11 Quais aes ativam seu funcionamento?

cesso de analisar, compreender e identificar as funes de um equipamento, software ou dispositivo, de forma a ser capaz de fornecer manuteno ou desenvolver outro produto compatvel com o analisado, ou ento descobrir o modo de funcionamento de algum programa desconhecido. Este processo pode envolver diversas tcnicas, incluindo as mais simples, como a pura execuo do software em um ambiente controlado, para identificar possveis aes e modifi caes causadas por ele, at a anlise do cdigo de mquina, possibilitando o entendimento das funes do programa no nvel mais baixo de cdigo.

Captulo 1 - Introduo engenharia reversa

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

Alguns exemplos de situaes onde a engenharia reversa pode auxiliar, alm da anlise de programas maliciosos: 11 Desenvolvimento de driver para um dispositivo; 11 Entendimento do funcionamento de um programa proprietrio, para desenvolvimento de verso livre que no use o mesmo cdigo do programa proprietrio; 11 Entendimento de protocolos para permitir compatibilidade entre produtos existentes e futuros produtos desenvolvidos; 11 Documentao de cdigo legado, para o qual no exista mais o cdigo-fonte.

Exerccio de nivelamento 1 e Arquivos maliciosos


Todos os arquivos maliciosos podem ser classificados como vrus? Qual a principal caracte rstica de um vrus?

Qual a diferena entre virtualizao e emulao?

Exerccio de fixao 1 e Objetivo da engenharia reversa


Qual a finalidade da Engenharia Reversa?

Definio
Engenharia reversa de arquivos maliciosos um estudo de cdigo suspeito ou malicioso com o intuito de descobrir: 11 Suas funcionalidades e caractersticas. 11 Seu modo de ao.
Engenharia Reversa de Cdigo 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?

Tipos de programas maliciosos


11 Vrus. 11 Trojan. 11 Worm. 11 Spyware. 11 Rootkit. muito difcil catalogar todos os tipos de programas maliciosos existentes atualmente. Apresentamos abaixo uma lista com exemplos de possveis pragas que podem ser encon-

tradas ao analisar um programa desconhecido. Muitas vezes, o programa vai se encaixar em mais de uma classificao: 11 Vrus: software que infecta outras aplicaes e as usa como vetor de infeco de outros arquivos. 11 Trojan: aplicao que tem um funcionamento malicioso baseado na diferena daquilo que se espera que ela faa. 11 Worm: cdigo malicioso com capacidade de se espalhar de um computador para outro atravs de diversos protocolos de rede. 11 Spyware: aplicao maliciosa usada para coletar informaes pessoais sobre o usurio de um computador. 11 Rootkit: ferramenta capaz de esconder a presena de programas, usurios ou servios maliciosos. Hoje em dia os programas maliciosos utilizam tcnicas diversas para descobrir e infectar sistemas vulnerveis, e para se esconder de possveis mecanismos de deteco. Ao infectar um sistema, eles costumam instalar diversos outros programas maliciosos, comprometendo ainda mais o computador.
Captulo 1 - Introduo engenharia reversa

Aes de um programa malicioso


11 Infeco de arquivos. 11 Explorao de vulnerabilidades. 11 Engenharia social. 11 Instalao de outros programas maliciosos. 11 Destruio de dados. 11 Roubo de informaes. 11 Ocultao de atividade maliciosa. 11 Agente de aes coordenadas. 11 Propagao.

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: 11 Estouros de buffers (Stack e Heap). 11 Vulnerabilidades de formato de strings. Vetores de ataque de alto nvel: 11 Explorao de vulnerabilidades em aplicativos. 11 Explorao de falhas existentes de configurao do sistema ou de protees. Ataques de mais alto nvel: 11 Engenharia social. 11 E-mails em massa. Os vetores de ataque usados por programas maliciosos apresentam variaes, e muitas vezes um nico cdigo malicioso pode explorar diversas vulnerabilidades, tanto de baixo como de alto nvel.

Os ataques de estouro de buffer (buffer overflow) exploram vulnerabilidades na forma como os programas tratam dados gravados em buffers (espaos de memria reservados para variveis). Muitas vezes, o programador no verifica o contedo de um parmetro gravado em um buffer, o que permite que o parmetro seja gravado nesta rea de memria com um tamanho maior do que suportado. Como a rea de memria seguinte rea de armazenamento de variveis reservada para a pilha de execuo do programa, estes dados sero sobrescritos, permitindo ao atacante controlar o fluxo de execuo do programa, e conse quentemente permitindo a execuo de cdigo malicioso. Os ataques contra formatos de string exploram uma vulnerabilidade em cdigos escritos em
Engenharia Reversa de Cdigo Malicioso

C/C++, onde um parmetro para uma funo de string ( printf por exemplo) no verificado, permitindo a manipulao da memria escrita no Stack e consequentemente a execuo do cdigo malicioso. Finalmente, ataques de engenharia social so difceis de combater, pois dependem 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 Existe algum padro na forma de se propagar ( randmica ou viciada)? 11 O programa contm um mdulo para reenvio de e-mails em massa? 11 Ele se replica por compartilhamentos? 11 Ele se replica por P2P ou outros protocolos de troca de arquivos? 11 Quais vulnerabilidades ele explora? A seguir, conheceremos algumas perguntas mais especficas que devem ser respondidas

pelo analista fazendo a engenharia reversa. O mtodo de propagao de um programa malicioso pode envolver diversas tcnicas e etapas, e descobrir essas informaes pode ajudar no somente a encontrar outras possveis mquinas vulnerveis, mas tambm descobrir novas vulnerabilidades que possam estar sendo exploradas pelo programa.

Quais funcionalidades o programa tem?


11 Backdoor? 11 Servidor IRC? 11 Abre alguma porta de servio? 11 Busca dados em alguma pgina web? 11 Recebe algum tipo de comando remoto? 11 Tem algum temporizador para executar funes programadas? A lista de funcionalidades de um programa malicioso atual, como os bots, pode ser gigan-

tesca. Um programa desse tipo pode dar controle total ao invasor sobre a mquina invadida, e permitir que ele execute praticamente qualquer funo remotamente. Descobrir estas funes pode ajudar na identificao de comportamentos estranhos em um sistema, ou a deteco de informaes que possam estar sendo coletadas pelo invasor.

Quais modificaes o programa causa?


11 Ele cria/modifica/remove alguma chave de registro? 11 Quais arquivos ele cria/modifica/remove? 11 Ele modifica algum processo em execuo? 11 Ele se auto modifica? 11 Ele modifica algum dado ou funo do sistema? Um programa malicioso, ao invadir o computador, pode modificar o sistema a ponto de somente uma restaurao completa do mesmo ser capaz de corrigir os problemas.

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

Qual o objetivo do cdigo?


Para qu o programa foi escrito? 11 Ataque direcionado? 11 Roubo de informaes? 11 Rede de computadores infectados?

Captulo 1 - Introduo engenharia reversa

Quem escreveu o cdigo? 11 Qual linguagem foi usada? 11 Em que data foi escrito? 11 Existe alguma caracterstica na forma de escrever o cdigo, que permita a associao a algum ou a algum grupo? A motivao por trs de quem escreve um programa malicioso pode dar pistas sobre seu autor, ou de possveis esquemas criminosos. Quase sempre, existe uma motivao finan ceira dos autores desse tipo de programa.

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

Classificao de cdigo malicioso


O cdigo pode ser classificado em trs categorias: 11 Cdigo constante: executado constantemente durante a execuo do programa. 22 Ex: loop de coleta de endereos de e-mails, ou de scan por mquinas vulnerveis 11 Cdigo reativo: executado em resposta a um evento especfico 22 Ex: quando um usurio acessa determinada pgina de um banco 11 Cdigo dormente: executado em data determinada 22 Ex: ataque DDoS coordenado

As categorias descritas abrangem quase a totalidade de cdigos que podem ser encontrados em um programa malicioso. Muitas vezes, durante a anlise de um binrio, o analista vai encontrar pores do cdigo que so executadas em um loop constante e em alguns casos podem causar a degradao do sistema. Cdigos reativos so muito utilizados em programas que coletam informaes bancrias, e que agem no momento em que o usurio acessa a pgina do seu banco. Eles podem ento sobrepor a tela de digitao dos dados, ou ento monitorar o teclado e cliques do mouse para capturar as informaes digitadas. O cdigo dormente costuma ser usado em situaes que exijam uma ao coordenada das mquinas infectadas. Exemplos disso so diversos programas maliciosos que agem somente em determinadas datas, ou em determinado perodo do dia.

Engenharia Reversa de Cdigo Malicioso

Exerccio de fixao 4 e Ambiente virtualizado


Qual a finalidade de um ambiente virtualizado?

Ambiente de anlise
Como analisar estes programas? 11 Ambiente instalado para finalidade de anlise: 22 Forma mais segura. 22 Gasta muito tempo e recurso, pois a cada execuo do programa malicioso, precisamos recuperar o estado inicial do sistema. 22 Podemos utilizar hardware especial: CoreRestore, Norton Ghost, e outros hardwares/softwares para recuperao de disco. 11 Ambiente virtual: 22 VMWare, Xen, Virtual PC, entre outros. 22 Mais barato para implantar uma estrutura de anlise. 22 Pode simular um ambiente de rede completo. 22 Facilita a recuperao do estado inicial, agilizando a anlise, mas pode prejudicar a anlise.

Para analisar um programa malicioso em tempo de execuo, pode-se utilizar basicamente trs formas: 1. Um ambiente fsico preparado para isso, com computadores e sistemas operacionais reais, que permitam simular com fidelidade o ambiente comum de um usurio. a forma mais garantida de conseguir um comportamento normal do programa analisado, pois este no saber jamais que o computador infectado est sendo examinado. Suas desvantagens so o alto custo de implementao e manuteno, j que a cada execuo do programa malicioso, todo o ambiente precisar ser restaurado. Existem diversos equipamentos que podem ser usados para realizar essa operao. Basicamente, eles mantm o estado do contedo em disco em seu formato original, direcionando todas as operaes de gravao para um disco spare. Para restaurar o ambiente, eles simplesmente descartam esse contedo gravado, e reiniciam o sistema a partir do disco original. 2. Outra tcnica a utilizao de imagens binrias dos discos utilizados, que so gravados novamente no disco, sobrescrevendo quaisquer modificaes causadas pelo programa malicioso. O ambiente virtual tem a vantagem de facilitar muito a restaurao do sistema, agilizando assim a anlise. Alm disso, muito mais barato de implantar, permitindo assim a simulao de um ambiente de rede completo, com diversas mquinas virtuais realizando funes especficas para enganar o programa malicioso e analisar interaes remotas do desse tipo de ambiente, e modificam seu comportamento, parando a execuo, executando funes diferentes ou at mesmo tentando explorar vulnerabilidades no gerenciador do sistema virtual. Por isso o analista deve tomar cuidado ao usar esse tipo de tcnica. 3. Uma terceira tcnica envolve a utilizao de um simulador de sistema operacional, que no deixa de ser um ambiente virtual. Mas diferente dos ambientes virtuais simulados, estes programas simulam apenas as chamadas especficas do sistema operacional, no executando as funes propriamente ditas. Exemplos destes softwares so o Norman Sandbox e o CWSandbox.
Captulo 1 - Introduo engenharia reversa

mesmo. A desvantagem desses sistemas que muitos programas maliciosos esto cientes

Virtualizao x Emulao
11 Tecnologias de virtualizao tais como VMWare capturam todo o acesso a hardware, e simulam toda a placa-me, menos o processador. 11 Tecnologias de emulao, tais como BOCHS ou QEMU, emulam completamente o processador, dispositivos de hardware e memria. 11 Emulao mais lenta, mas permite o controle total sobre o ambiente, e muito mais segura para impedir que o programa malicioso fuja do ambiente virtual. 11 Emulao parcial pode ser muito til na anlise esttica.

A emulao tem algumas vantagens sobre a virtualizao simples, pois permite controlar a forma como o cdigo binrio vai ser executado pelo processador. Devido ao fato de sistemas de virtualizao simularem todo o hardware com exceo do processador, o cdigo executado diretamente pelo processador do sistema. Em um ambiente emulado, at o processador simulado, permitindo assim que uma instruo seja interpretada da forma como o analista quiser. Um exemplo disso so instrues de TRAP de processamento, que normalmente param a execuo de um programa executado dentro de um debugger. Um programa que use essa tcnica para impedir a engenharia reversa facilmente enganado em um sistema emulado, que pode simplesmente ignorar esse tipo de instruo.

Anlise ao vivo x Engenharia reversa


Anlise ao vivo: 11 Significa executar o programa malicioso em um ambiente e monitorar sua atividade. 11 Permite identificar rapidamente algumas funes do programa. 11 Complicado de identificar a forma como um programa executa essas funes, mas um bom ponto de incio para a engenharia reversa. Engenharia reversa: 11 Anlise do cdigo do programa. 11 Permite entender seu funcionamento, e descobrir funes escondidas, ou cdigo dormente ou reativo.

A anlise ao vivo de um programa pode ser um bom incio na anlise de um programa malicioso, j que pode dar pistas importantes sobre as funcionalidades de um programa. Mas ela no permite descobrir facilmente as funcionalidades que sejam ativadas por uma
Engenharia Reversa de Cdigo Malicioso

ao especfica do usurio ou uma funo dormente ativada em determinada data.

Roteiro de Atividades 1
Atividade 1.1 Anlise dinmica de binrio desconhecido
Esta atividade demonstra uma possvel anlise dinmica de um binrio desconhecido, em um ambiente virtual. O objetivo identificar mudanas no sistema causadas pela execuo de um programa desconhecido. Para isso, utilizamos a ferramenta RegShot, um utilitrio livre que permite monitorar mudanas em arquivos e no registro, e comparar dois estados do sistema, para identificar mudanas. O aluno deve abrir a mquina virtual disponibilizada para o curso, que contm um sistema operacional Windows XP Pro com Service Pack 2. Para garantir que todos os alunos tenham um ambiente igual, foi gerado um snapshot chamado Incio das aulas. 1. Inicie o VMWare e abra a imagem D:\Windows_XPSP2_Malware\WinXPPro.vmx. 2. Restaure o snapshot Incio das aulas. 3. Execute o Process Explorer, o atalho encontra-se no desktop, e mantenha-o aberto durante o exerccio, para examinar os processos em execuo. 4. Execute a ferramenta RegShot no desktop; 5. Marque a opo HTML Document e Scan Dir, acrescentando a linha abaixo: 6. C:\Windows;C:\Docume~1\ 7. Clique em 1st Shot e escolha Shot; 8. Execute o cone acer.jpg.exe no desktop; 9. Clique em 2nd Shot e depois em Shot, e quando terminar, clique em Compare para gerar a diferena entre as execues.

Captulo 1 - Roteiro de Atividades

Ao final do exerccio, o RegShot abrir uma janela do Internet Explorer com o contedo das modificaes identificadas por ele. Perguntas: 1. Que modificaes o programa causou no sistema?

2. Voc percebeu algum outro comportamento estranho no sistema?

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

4. Aps terminar, restaure novamente o snapshot Incio das aulas, pois o sistema est comprometido.

10

Engenharia Reversa de Cdigo Malicioso

2
Ferramentas
objetivos
Criar um ambiente de anlise e utilizar as ferramentas para auxiliar a anlise do cdigo e entender as diferenas entre elas, identificando a melhor utilizao de cada uma.

conceitos

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

Montagem do ambiente de anlise


Antes de iniciar a anlise, deve-se montar um ambiente completo, composto de: 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.
Captulo 2 - Ferramentas

Exerccio de nivelamento 1 e Ferramentas


O que um debugger?

11

Qual a diferena entre decompilador e disassembler?

VMWare
11 Salvamento de estado em background. 11 Diversos nveis de snapshot. 11 Clones. 11 Simulao de infraestrutura de redes. 11 Gravao de vdeos.

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

Figura 2.1 Snapshot Manager.

O ambiente virtual que usaremos durante o curso baseado no VMWare, um ambiente de virtualizao que simula todo o hardware de um computador, mas passa diretamente execuo das instrues ao processador fsico da mquina. Por isso ele no considerado um emulador. Dentre as caractersticas que podemos destacar no VMWare, podemos citar o gerenciamento de snapshot, que permite a criao de uma hierarquia de estados salvos do sistema. Isto permite ao analista testar diversas configuraes ou situaes diferentes usando apenas uma mquina virtual.
Engenharia Reversa de Cdigo Malicioso

Outra caracterstica importante a possibilidade de simular uma infraestrutura de rede bsica, atravs do uso das interfaces virtuais do VMWare (vmnet1, vmnet2 etc). Cada mquina virtual pode estar conectada a uma ou mais redes virtuais, e podem se comunicar entre si, permitindo a criao, por exemplo, de um roteador/firewall entre duas redes. Finalmente, o VMWare tem a capacidade de tirar um snapshot da tela da mquina virtual em execuo, ou de gravar um vdeo da atividade na tela, uma tima ferramenta para estudar o comportamento de determinado programa, ou para utilizao em treinamentos. O VMWare implementa um hook virtual na CPU do sistema virtual, para que haja comunicao entre a mquina virtual e o processador fsico. dessa forma que ele implementa a execuo de instrues diretamente no processador. Mas esse hook passvel de deteco

12

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

Exerccio de fixao 1 e VMWare


O VMWare um software de emulao ou virtualizao?

Debugger
Debugger uma ferramenta de anlise em tempo de execuo, que permite a manipulao do programa no nvel de cdigo de mquina (assembly). Funcionalidades: 11 Informaes sobre estado da CPU. 11 Execuo passo-a-passo. 11 Pontos de parada (breakpoints). 11 Visualizao e manipulao de memria e registros. 11 Visualizao de threads.

A partir de agora conheceremos algumas ferramentas que podem auxiliar na anlise de um binrio desconhecido. Elas so utilizadas para realizar tarefas especficas, e isoladas no seriam de grande serventia. O primeiro tipo de ferramenta que veremos so os debuggers, programas utilizados para analisar o cdigo de mquina (assembly) de um programa em execuo. Com essa ferramenta possvel: 11 Examinar informaes como estado de registradores e posies de memria; 11 Executar o programa instruo por instruo; 11 Visualizar threads; 11 Criar pontos de parada em determinadas posies do cdigo ou ento em caso de acesso a determinada posio de memria. Os debuggers permitem ainda modificar o contedo de registradores e memria, alterando assim a execuo do programa. Esta funcionalidade importante para permitir ao analista desviar a linha de execuo do programa, evitando cdigos de proteo ou direcionando o programa para uma funo especfica que se queira analisar.
Captulo 2 - Ferramentas

Debuggers para Windows


11 Microsoft WinDBG. 11 OllyDBG. 11 IDA Pro. 11 PyDBG.

13

Entre os exemplos de debugger para Windows, o SoftIce foi durante muito tempo considerado o melhor debbuger existente, pois era extremamente poderoso. Ele foi descontinuado em 2006, mas continua sendo uma referncia.

w
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.

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 apresentando falhas (decompilao de verdade impossvel). Realiza otimizaes do compilador, remoo dos smbolos, nomes de variveis e funes perdidas. Existem ferramentas que basicamente deixam o disassembly mais legvel. Decompiladores so ferramentas que auxiliam o analista na tentativa de recuperar um cdigo de alto nvel, a partir de um cdigo em linguagem de mquina. Eles normalmente tentam atingir esse objetivo com a identificao de estruturas dentro do cdigo binrio, e posterior transformao dessas estruturas em uma representao de alto nvel. Por exemplo, ao analisar um cdigo binrio, a ferramenta pode identificar uma estrutura representando um switch/case, e ento substitu-la por uma representao em alto nvel (geralmente C ou C++) dessa estrutura. Mas esse tipo de abordagem falha na maioria dos casos. O problema que durante o processo de compilao, muitas informaes so perdidas, como nomes de variveis e de funes, e a otimizao feita pelo compilador modifica a forma como a estrutura em lin guagem de alto nvel mapeada para a linguagem de mquina. Ferramentas de decompilao: 11 REC e REC Studio. 11 Desquirr. 11 Boomerang. 11 Hex-Rays Decompiler. Entre as ferramentas que tentam decompilar cdigo, Desquirr e Hex-Rays Decompiler so plugins para o IDA Pro. As demais so ferramentas stand-alone, sendo que o REC Studio
Engenharia Reversa de Cdigo Malicioso

a mais estvel.

Exerccio de fixao 2 e Arquivos binrios


O que so arquivos binrios?5

14

Manipuladores de binrios
Ferramentas de manipulao de binrios: 11 Permitem examinar e modificar a estrutura dos arquivos executveis. Arquivos executveis: 11 Arquivos estruturados, geralmente baseados em um padro comum dentro de uma arquitetura de processador. 11 Informaes que podem ser encontradas nessas estruturas: 22 Entry point do programa. 22 Tamanho das sees. 22 Lista de funes importadas. Exemplos de padres de executveis: 11 PE, ELF, COM, MACH-O, COFF, entre outros.

Uma parte importante da anlise de arquivos suspeitos inclui a identificao de informaes bsicas sobre os arquivos analisados. O primeiro passo identificar o tipo de arquivo anali sado: se arquivo de dados, executvel, se est compactado ou no. Ao identificar um arquivo executvel e examinando a estrutura desse binrio, o analista pode conseguir informaes importantes. O formato de executvel que estudaremos durante esse curso o formato Portable Executable (PE), o padro de executvel usado no Microsoft Windows. No formato PE, a estrutura do binrio contm informaes importantes sobre o executvel. Ferramentas de manipulao de binrios 11 LordPE 22 http://www.woodmann.net/collaborative/tools/index.php/LordPE 11 PEiD 22 http://www.peid.info/ 11 ImportREC 22 http://vault.reversers.org/ImpRECDef 11 PE Explorer (comercial) 22 http://www.heaventools.com/overview.htm Durante o curso veremos exemplos de ferramentas para manipulao de binrios. O ltimo link fornecido contm uma lista de ferramentas de manipulao de binrios e de engenharia reversa.

Disassembler
11 O que um disassembler? 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

O disassembly usado para realizar a anlise esttica de um binrio. A principal vantagem de realizar uma anlise esttica ter acesso ao cdigo do programa. Em uma anlise dinmica, ficamos restritos apenas ao que o programa decide executar baseado nos seus par metros. J em uma anlise esttica, temos acesso a toda a estrutura do cdigo do programa, podendo seguir o caminho que melhor nos convier. Apesar disso, a dificuldade encontrada na anlise esttica diferenciar o que cdigo executvel do que apenas dado. Em um arquivo binrio, tudo apresentado por uma sequncia de bits. Cabe ao sistema operacional, na hora da execuo, identificar o ponto inicial do pro grama (atravs dos cabealhos PE) e transferir o controle para este ponto. A partir da, o programa decide o fluxo de execuo, e com isso faz a diferenciao entre cdigo e dado. Uma tcnica comum anti-engenharia reversa armazenar partes do cdigo na rea do executvel reservada aos dados do programa, e vice-versa. Os disassemblers, por no executarem o programa, no tm a informao do que cdigo e do que dado, e precisam descobrir isso seguindo o fluxo de instrues, mas sem execut-las. Um exemplo seriam os programas executveis compactados. Normalmente eles contm uma rotina de descompactao, e ao final dela, o fluxo de execuo transferido para uma rea de memria que ainda no contm cdigo executvel. Este tipo de situao muitas vezes confunde o disassembler, que pode marcar aquela posio como cdigo, quando na verdade ela ainda no . Ferramentas de Disassembly: 11 IDA Pro 22 http://www.hex-rays.com/idapro/ 11 OllyDBG 22 http://www.ollydbg.de/ 11 Fenris 22 http://lcamtuf.coredump.cx/fenris 11 PE Browser 22 http://www.smidgeonsoft.prohosting.com/pebrowse-pro-file-viewer.html Entre as ferramentas de disassembly, a mais conhecida e considerada a melhor o IDA Pro. Apesar disso, outra boa ferramenta que pode ser usada em conjunto com o IDA Pro o OllyDBG. Com essas duas ferramentas, possvel analisar praticamente qualquer tipo de arquivo suspeito, mesmo aqueles que tentam se proteger de anlises. No link abaixo h uma lista com diversas ferramentas de disassembly para download:
Engenharia Reversa de Cdigo Malicioso

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

16

Roteiro de Atividades 2
Atividade 2.1 Configurao do VMWare
Esta atividade instrui o aluno a iniciar o sistema e prepar-lo para as prximas sesses. Por isso, este roteiro descreve todas as aes que o aluno dever executar risca, para ter um sistema pronto para as prximas sesses. Ser utilizado o sistema operacional Windows XP Pro com Service Pack 2, com uma licena temporria de 60 dias. Para modificar as configuraes do sistema operacional, ele deve estar parado, isto , o aluno deve fazer o shutdown do sistema operacional se ele ainda estiver ativo desde a ltima sesso, ou se estiver em estado de pausa. 11 Execute o VMWare; 11 Abra a mquina virtual fornecida: 22 D:\Windows_XPSP2_Malware\winXPPro.vmx 11 Desabilite a acelerao nas configuraes da VM; 11 Compartilhe um diretrio para ser acessado pela mquina virtual; 11 Inicie o sistema, faa um snapshot e salve como Incio das atividades. Na aba Hardware, o aluno deve confirmar que a configurao da interface de rede ethernet est como Host-only, pois assim a mquina virtual no ter acesso internet. Na aba Options, opo Shared Folders, o aluno dever verificar se existe um compartilha mento ativo, apontando para o diretrio malware presente no CD do aluno ou no disco da mquina host. Apenas como exemplo, est configurado na mquina virtual disponvel no CD do aluno um diretrio compartilhado apontando para um diretrio em meu sistema. Este 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 com partilhamento, no formato \\vmware-host\Shared Folders\nome_compartilhamento. Aps encontrar a mquina, o aluno poder mapear o compartilhamento em um drive local para facilitar o acesso. Finalmente, o aluno dever ligar o sistema operacional e fazer um snapshot, a partir do qual 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.
Captulo 2 - Roteiro de Atividades

sero executadas todas as atividades daqui para a frente. Ao executar uma atividade que

17

Atividade 2.2 Ferramentas de decompilao


1. Execute Rec/RecStudio; 2. Abra Exemplos\Sesso 2\mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dat no desktop; 3. Qual a sua opinio sobre o resultado obtido? Discuta com seus colegas situaes onde este tipo de ferramenta pode ser til.

Para ilustrar a dificuldade de se trabalhar com ferramentas de decompilao, utilizaremos uma destas ferramentas para analisar um binrio suspeito, e visualizar o resultado da decompilao. Ao abrir o executvel, o programa analisar a estrutura do binrio e mostrar uma estrutura em rvore esquerda, e o cdigo assembly direita. Clicando em algum dos procedimentos identificados pelo programa, possvel visualizar o cdigo decompilado daquela funo.

Atividade 2.3 Ferramentas de manipulao de binrios


Os alunos devem abrir, com cada ferramenta, dois ou mais arquivos suspeitos presentes no diretrio Malware no desktop da mquina virtual, para que possam comparar diferentes informaes sobre cada um. 1. Utilize as ferramentas PEiD, Lord PE e ImportREC, disponveis no desktop da mquina virtual para examinar os arquivos maliciosos presentes no diretrio Malware, tambm no desktop. 2. Utilize todas as funcionalidades de cada um dos programas. Quais funcionalidades voc considera que seriam mais teis em uma anlise de um programa malicioso? Discuta com seus colegas as informaes encontradas com cada ferramenta, e como essas informaes podem ser teis para identificar um programa malicioso. Faa um relatrio descrevendo as funcionalidades que voc considera mais teis e as situaes em que elas podem ajudar.

18

Engenharia Reversa de Cdigo Malicioso

3
Introduo ao IDA Pro e OllyDBG
objetivos
Apresentar as ferramentas de disassembly mais utilizadas para engenharia reversa, mostrando suas diferenas e principais funcionalidades.

conceitos

IDA Pro, OllyDbg.

Introduo ao IDA Pro


DataRescue IDA Pro: 11 Ferramenta padro para anlise esttica. 11 Suporta mltiplas arquiteturas de processadores. 11 Cross-plataforma, interface de console e grfica. 11 Expansvel atravs de plugins em diversas linguagens. 11 Manipulvel atravs de scripts. 11 Possui dezenas de plugins e ferramentas escritas para ele. 11 Verso comercial custa pouco mais de US$ 500. Neste captulo, vamos conhecer as ferramentas que usaremos ao longo do curso, como o Interactive Disassembler Pro, ou IDA Pro, reconhecido como um dos melhores programas

do mercado para engenharia reversa. Custando pouco mais de 500 dlares, a quantidade de funcionalidades disponveis compensa o valor pago.
Captulo 3 - Introduo ao IDA Pro e OllyDBG

Trata-se de um programa de disassembly capaz de manipular executveis de praticamente qualquer tipo de processador, por causa da sua arquitetura modular. Basta o analista ter ou desenvolver os mdulos de acesso a um processador, que o IDA identificar binrios daquele processador. Alm de suportar processadores diferentes, o IDA suporta tambm diversos tipos de binrios, atravs de mdulos de reconhecimento de executveis. Esta propriedade torna possvel, por exemplo, analisar programas escritos para microprocessadores PIC, programas escritos em linguagens variadas como Java, .Net, Linux ELF ou executveis de outras arquiteturas, como Mac, Sun etc. A licena do IDA d direito ao uso da verso Windows e tambm da verso Linux ou Mac do programa. O IDA tambm suporta um sistema de plugins e scripts externos, que faz com que suas possibilidades de anlise sejam praticamente ilimitadas. Os scripts podem

19

ser desenvolvidos tanto em sua prpria linguagem, o IDC, como em Python, C e Perl, entre outras. Justamente por isso, existem na internet centenas de ferramentas escritas para integrao com o IDA Pro. Interactive Disassembler Pro: 11 IDA uma das melhores ferramentas para engenharia reversa. 11 Controlvel atravs de scripts IDC IDA Perl ou IDA Python. 11 Interativo, pois possvel interagir com seu banco de dados, corrigindo o que ele no conseguir identificar automaticamente. FLIRT: 11 Fast Library Identification and Recognition Technology. 11 Bibliotecas de padres, permitem que o IDA reconhea as chamadas padro de bibliotecas. Como j foi comentado, o IDA Pro pode ser controlado e expandido atravs de scripts IDC, ou atravs de outras linguagens como Python e Perl. O termo interativo advm do fato de que o IDA funciona na verdade como um gerenciador de banco de dados. Ao abrir um executvel, as informaes sobre ele so inseridas em um banco de dados, e a partir da todas as operaes so realizadas nele. Por isso, o executvel no mais necessrio aps a criao da base de dados, facilitando a distribuio da anlise entre um grupo de pessoas, sem a necessidade de enviar o binrio malicioso propriamente dito, que s se faz necessrio no caso de se realizar a execuo do binrio. As operaes realizadas na base permitem ao analista modificar informaes no disassembly, adicionar comentrios, consertar cdigos que tenham sido identificados erroneamente pelo IDA, criar ou remover funes, estruturas e tipos, renomear objetos, entre outras operaes. Uma das caractersticas mais vantajosas do IDA a utilizao de bibliotecas de reconhecimento de padres. O FLIRT um sistema de biblioteca de padres aplicados ao banco de dados analisado, que permite identificar automaticamente funes pertencentes a bibliotecas padro do Windows. Por exemplo, o sistema pode identificar automaticamente funes padro do Delphi ou do Visual C, o que facilita o trabalho do analista, j que ele no vai precisar analisar novamente essas funes.

Exerccio de nivelamento 1 e IDA Pro e OllyDGB


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

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

Durante o curso: 11 Ser utilizado IDA Pro 5.0 Free. 11 Os arquivos de exemplo esto nas pastas Exemplos e Malware no desktop. 11 Sempre que houver comprometimento da mquina, restaurar o ltimo snapshot sadio.

20

11 Por isso, evite executar os arquivos maliciosos durante o curso, a no ser quando indicado 11 Para comear, vamos configurar o IDA Pro Free para facilitar o uso. Neste curso vamos utilizar o IDA Pro Free. Esta verso distribuda livremente atravs do site do IDA Pro, mas no conta com uma srie de funcionalidades da verso atual (6.x).

A principal caracterstica faltante a visualizao da listagem assembly em forma de grfico, que facilita a identificao de estruturas e fluxo. Na verso Free no possvel usar os plugins compilados para as verses comerciais, o que mais um incentivo para a compra da verso comercial. Os arquivos de exemplo vo estar disponveis dentro da mquina virtual, nos diretrios Exemplos e Malware no desktop. Estes arquivos so realmente maliciosos, coletados pelo CAIS atravs do projeto de banco de dados de malwares. Estes arquivos devem ser manipulados em observncia aos preceitos de segurana e tica. Durante o curso ser necessrio, em alguns casos, executar o arquivo malicioso de forma a auxiliar a anlise. Nestes casos, onde ocorre o comprometimento da mquina virtual, deve-se recuperar o ltimo estado salvo do VMWare, para retornar a mquina virtual a um estado sadio. Por isso importante relembrar a criao de um diretrio compartilhado entre a mquina virtual e a mquina host, para que ele sempre grave qualquer arquivo que deseja manter neste diretrio, pois ao recuperar o estado salvo, os arquivos armazenados dentro da mquina virtual sero perdidos.

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

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

Exerccio de fixao 1 e Conhecendo o IDA Pro


O IDA Pro um decompilador ou um disassembler?

Captulo 3 - Introduo ao IDA Pro e OllyDBG

21

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

Toolbar Abas de vises e navegador Endereamento Highlight de sintaxe rea de disassembly Jumps e uxo do cdigo rea de mensagens
Figura 3.1 IDA Pro.

Na parte superior esto as barras de ferramentas, com acesso a muitas funes do IDA, e no menu, acesso a outras ferramentas. Abaixo da rea de toolbar, temos a barra de navegao. Ao abrir um executvel, essa rea representa o arquivo completo. Ela colorizada, e cada cor indica um tipo de informao. Ao remover a barra de navegao da toolbar (puxando-a para o centro da tela por exemplo, destacando da rea de toolbar) ela mostrar uma legenda com o significado de cada cor. A caixa dropdown esquerda permite ao aluno encontrar rapidamente alguns tipos de 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
Engenharia Reversa de Cdigo Malicioso

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

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 (estilo C, 7 bit ASCII null terminated). Para configurar outros tipos de string, deve-se clicar 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.
Captulo 3 - Introduo ao IDA Pro e OllyDBG

com o boto direito na janela de string, e escolher Setup. Nesta tela tambm possvel

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: 11 R: transforma valor hexa em caractere. 11 H: transforma valor hexa em decimal. 11 N: renomeia objeto atual. 11 X: mostra referncias de cdigo. 11 F12: mostra grfico de controle de fluxo. 11 Ctrl+F12: mostra grfico de chamada de funo. 11 Enter: segue uma referncia (duplo clique). 11 ESC: retorna para a referncia anterior. 11 : (dois pontos): adiciona comentrio. 11 ; (ponto-vrgula): adiciona comentrio repetitivo.

O mais importante a lembrar aqui so os atalhos para navegao no cdigo. ENTER em cima de um XREF faz com que a listagem disassembly pule para aquela referncia, e ao pressionar ESC, o IDA retorna para o ponto anterior. Com isso, voc pode navegar rapidamente por uma sequncia de chamadas a funes, e retornar ao ponto inicial com facilidade. Ao analisar uma funo e entender seu funcionamento, voc poder renome-la, e assim identific-la rapidamente depois, procedimento que deve sempre ser usado. 11 CTRL+X: mostra referncias funo corrente. 11 CTRL+UP/DOWN: para navegar sem perder a marcao de highlight de texto. 11 CTRL+LEFT/RIGHT: parar pular entre itens.
Engenharia Reversa de Cdigo Malicioso

11 SHIFT+ENTER: para marcar o item atual. 11 ALT+UP/DOWN: para encontrar a prxima ocorrncia do item atual. 11 ALT+M: marca uma posio. 11 CTRL+M: pula para a posio marcada. 11 Para apagar marcas: 22 No menu Jump -> Clear Mark, escolha a marca a apagar.

24

Algoritmo de autoanlise
Algoritmo de autoanlise do IDA: 1. Carregue o arquivo e crie os segmentos. 2. Adicione o ponto de entrada e as DLLs exportadas fila de anlise. 3. Encontre todas as sequncias de cdigo e marque-as. 4. Pegue um endereo da fila para desassemblar, adicionando na fila as referncias de cdigo. 5. Enquanto a fila no estiver vazia, repita o procedimento anterior. 6. Analise uma ltima vez todo o cdigo, convertendo para dado o que no foi analisado no segmento de texto.

Agora que voc j conhece um pouco sobre a interface do IDA, vamos entender o que feito no momento em que um programa carregado pelo IDA para ser analisado. Deve ser escolhido um programa para ser carregado, como o arquivo \Desktop\Exemplos\Sessao 3\mal.Down.nopack. worm.exe. Ao escolher um programa para ser carregado, poder ser visualizada uma tela de configurao do arquivo. Ao pressionar OK, o IDA ir proceder com a autoanlise do arquivo. No primeiro passo, o arquivo carregado na base de dados e os segmentos so criados, de acordo com o descrito no cabealho do arquivo. A seguir, o entry point do programa e todas as DLLs requeridas so adicionados fila de anlise. Em seguida, o IDA encontra todas as sequncias de cdigo dentro do arquivo, e seleciona-as para anlise. O prximo passo inicia um loop. Uma instruo retirada da fila, e o fluxo de instrues a partir dela analisado, at que no seja mais possvel encontrar uma instruo executvel. Por exemplo, a partir do entry point, o IDA examinar a sequncia de instrues seguintes, at uma instruo de sada ou de retorno. Aps isso, se no houver mais cdigo, ele pega outra instruo da fila, e comea novamente. Se for feita uma referncia de fluxo a uma posio de memria que no tenha sido marcada como cdigo, o IDA adiciona essa posio lista de instrues a analisar. Ao final, o cdigo inteiro analisado mais uma vez, e aquilo que no for identificado marcado como dado. Ao carregar o arquivo, voc poder acompanhar o estado da autoanlise atravs da rea de mensagens do IDA, e da modificao na barra de navegao, que passar a mostrar novas cores dependendo do que for identificado.
Captulo 3 - Introduo ao IDA Pro e OllyDBG

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

SetFileAttributesA

__imp_GetLastError

__imp_SetFileAttributesA

Figura 3.2 Grficos de chamadas

Os grficos de chamada so muito teis para visualizar informaes de fluxo dentro do programa. As informaes de fluxo servem para encontrar relaes entre funes dife rentes, e descobrir pontos importantes no programa analisado. No IDA Pro comercial, a partir da verso 5, existe um modo de viso disassembly que j incorpora uma viso grfica, sem a necessidade de gerar o grfico toda vez. Nestes grficos, os ns so as funes, e as arestas so as chamadas entre as funes. 11 Abra o arquivo: \Desktop\Exemplos\Sessao3\mal.Down.nopack.worm.exe 11 D duplo clique em uma funo na lista de funes. 11 Pressione Control-Shift-T para grficos at a funo atual. 11 Control-Shift-F para grficos a partir da funo atual. Para visualizar um grfico de chamada de funes, abra o arquivo indicado e escolha uma das funes identificadas pelo IDA, na janela Funes, de preferncia alguma identificada pelo nome como sub_xxxxxx, sendo xxxxxx qualquer nmero. Clique uma vez sobre o nome da funo na listagem disassembly. Aps isso, basta pressionar Control+Shift+T para gerar um grfico de chamadas a partir do entry point at a funo atual. Se o atalho no estiver configurado, basta clicar no cone identificado ao lado do texto acima. Para gerar um grfico de chamada a partir da funo atual, basta pressionar Control+Shift+F ou pressionar o cone correspondente. 11 Grficos de fluxo de controle:
Engenharia Reversa de Cdigo Malicioso

22 Funes podem ser visualizadas como grficos. 22 Blocos bsicos so representados como ns. 22 Os caminhos lgicos so representados pelas arestas. 11 Procure a funo sub_403D70: 22 CTRL+P e digite o nome da funo. 11 F12 para ver grfico de fluxo.

26

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

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

00000050
Figura 3.3 Grficos de fluxo de controle.

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 nhecidas. Nesta tela, bem como em outras parecidas, basta digitar o nome da funo, e a lista ser percorrida at o cursor parar na funo desejada. Ao encontrar a funo, basta clicar duas vezes sobre ela, e uma vez sobre o nome da funo na listagem disassembly. Aps isso, basta pressionar F12 para visualizar o grfico.
Captulo 3 - Introduo ao IDA Pro e OllyDBG

pela funo sub_403D70. Pressionando Control+P, uma janela aberta com as funes reco-

Signatures e Type Library


11 Muitas vezes, funes dentro do programa podem pertencer a bibliotecas padro de compiladores ou do sistema. 11 O IDA Pro usa bibliotecas de assinaturas para identificar essas funes. 11 Algumas vezes, o IDA reconhece erroneamente o compilador usado, e acaba no identificando corretamente essas funes.

27

Muitas vezes, ao compilar um programa, o autor pode optar por embutir nele as DLLs 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 ofe recer um grande auxlio ao analista, que pode ento procurar por funes padronizadas e elimin-las da lista a ser analisada. O IDA Pro tem duas funcionalidades muito importantes para auxiliar o analista nesta tarefa. A primeira delas a biblioteca de tipos. Uma biblioteca de tipos um conjunto de 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 funcionali dade daquela funo. Algumas vezes, porm, o IDA reconhece erroneamente o compilador, e no aplica corretamente as assinaturas. Veremos a seguir um exemplo disso. Veja como a barra de navegao muda, quando as assinaturas so aplicadas:

Figura 3.4 Mudanas na barra de navegao.

Finalmente, aps todas as assinaturas aplicadas, voc vai perceber que muitas funes que antes
Engenharia Reversa de Cdigo Malicioso

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.

28

11 Controlvel atravs de scripts OllyScript. 11 Contm um disassembler poderoso. 11 H centenas de funes escondidas. 11 A documentao existente excelente. Cuidado: o programa carregado colocado em estado de execuo pausada, e qualquer erro pode comprometer seu sistema!

Veremos a partir de agora outra ferramenta muito til na anlise de programas maliciosos. O OllyDBG um debugger e disassembler, distribudo livremente, que contm uma grande quantidade de funcionalidades teis para a anlise. O Olly uma ferramenta cracker friendly, pois suas funcionalidades so especialmente desenvolvidas para facilitar a engenharia reversa de programas protegidos. Com a 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:

Toolbar
Captulo 3 - Introduo ao IDA Pro e OllyDBG

Janela de Disassembly Janela de mensagens Janela de memria


Figura 3.5 OllyDBG.

Janela de registradores

Janela de Stack de chamadas

29

Na parte superior, h uma pequena toolbar, com botes para abrir novas janelas e para a execuo controlada do programa. Abaixo, esquerda, temos a janela de disassembly, dividida em colunas. Da esquerda para a direita: 11 Endereo da instruo; 11 Bytes relativos instruo; 11 Instrues assembly e parmetros; 11 Comentrios, referncias, tipos de parmetros etc. direita da janela de disassembly, temos a primeira mudana em relao ao IDA. Nesta tela, pelo fato do programa ser colocado em modo de execuo pelo Olly, ele pode mostrar o estado atual dos registradores e flags da CPU. Isto s possvel durante a execuo. reco mendada a pesquisa na seo de ajuda do Olly para saber o significado de cada um desses campos. importante conhecer bem pelo menos os registradores (nove primeiros valores no topo dessa janela) e as flags da CPU (CPAZSTDO, a seguir na janela), pois so importantes durante a anlise. Abaixo da janela de disassembly, h uma pequena janela de mensagens, que serve tambm para mostrar o estado de variveis monitoradas (watches). Abaixo, a representao da rea de memria do programa. Atravs dessa janela, possvel navegar na memria do programa em tempo real. Isto importante para monitorar reas de memria que estejam sendo modificadas pelo programa durante a execuo. direita, uma rea representa o Stack de chamadas do programa. Outra informao 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.
Engenharia Reversa de Cdigo Malicioso

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 boto H na toolbar.
Captulo 3 - Introduo ao IDA Pro e OllyDBG

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 par metros a ela, isto , com ele possvel descobrir rapidamente quais instrues no cdigo foram usadas para passar parmetros uma funo.

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

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. 11 CTRL+F9: executa at retornar. 11 ALT+F9: executa at cdigo de usurio. 11 F12: pausa. 11 F7: step into. 11 F8: step over.
Engenharia Reversa de Cdigo Malicioso

11 F2: marca/apaga breakpoint. 11 CTRL+G: vai para endereo. 11 Qualquer tecla: modifica assembly. 11 : (dois pontos): adiciona label. 11 ; (ponto e vrgula): adiciona comentrio. 11 CTRL+F7: animate. 11 ENTER: segue um jump. Aqui esto alguns atalhos teis durante o uso do OllyDBG. O Help do programa disponibiliza uma lista completa de atalhos, alm de algumas funes interessantes.

32

Roteiro de Atividades 3
Atividade 3.1 Signatures e Type Library
O objetivo desta atividade verificar como o reconhecimento correto do compilador usado pode auxiliar na anlise. Como exemplo, utilizaremos o mesmo programa malicioso dos exemplos anteriores: \Desktop\Exemplos\Sessao 3\mal.Down.nopack.worm.exe. 1. Com o arquivo \Desktop\Exemplos\Sessao 3\mal.Down.nopack.worm.exe aberto, examine a barra de navegao para verificar o que foi reconhecido. Examinando as strings, podemos ver algumas referncias ao Borland Delphi no cdigo do programa. 2. Abra a janela Type Libraries (View g Open Subviews g Type Libraries), observando que o compilador identificado vc6win. 3. Abra a janela Signatures (View g Open Subviews g Signatures) e adicione as assinaturas que julgar pertinentes, observando aquelas que identificam funes de bibliotecas. Observe que as partes azuis representam quase a totalidade do cdigo, e devem ser 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 sobre o assunto, explicando a razo de terem sido consideradas interessantes.

Captulo 3 - Roteiro de Atividades

33

Atividade 3.2 IDA Pro


Abra o arquivo \Desktop\malware\mal.Down.nopack.winlogin.exe no IDA Pro, navegue pelas funcionalidades que acabamos de estudar no mdulo terico e responda as seguintes questes: 1. Na janela de funes exportadas existe alguma funo? Caso positivo, qual o endereo desta funo?

2. Navegue pela janela de strings e encontre a string task32.exe. Qual o endereo da funo que faz referncia a esta string?

Atividade 3.3 OllyDBG


1. Abra \Desktop\Exemplos\Sesso 3 \mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dat; 2. V para 0x50EDB6h (Control+g) e marque um breakpoint (F2); 3. Encontre o endereo de memria onde o binrio vai ser descompactado, e v para este endereo no dump de memria (Control+g); 4. Execute com F9 at breakpoint; 5. CTRL+F7 para executar Animate; 6. Clique no boto de Pause (||) para parar ou no boto << para restaurar o programa para o estado inicial. Nesta atividade, conheceremos uma funcionalidade interessante do Olly, e comearemos a entender o processo de anlise de um binrio suspeito. O arquivo que usaremos como exemplo \Desktop\Exemplos\Sesso 3\mal.upx.6dddd7e8 e5ff88a15b7884a833ff893b.dat. Este arquivo est compactado com UPX, um compactador muito popular em arquivos maliciosos. Este compactador instala uma rotina de descompactao em uma rea no usada pelo programa, e modifica o entry point do programa para realizar um desvio para essa funo assim que o programa iniciado. Esta rotina de descompactao grava o programa descompactado em outra rea de memria, j reservada no cabealho do executvel para esta finalidade.
Engenharia Reversa de Cdigo Malicioso

Veja o arquivo \Desktop\Install\Unpacking\OpenRCE UPX Notes.txt para consultar um pequeno roteiro de como descompactar arquivos UPX.

34

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

60 PUSHAD BE [4 Bytes] MOV ESI, [ADDRESS] LEA EDI, DWORD PTR DS:[ESI+Value] PUSH EDI

8DBE [4 bytes] 57 83CD FF EB 10 90

OR EBP, FFFFFFFF JMP SHORT [Relative Jump] NOP

Leia o documento descrevendo o funcionamento do compactador UPX e tente descobrir o endereo de memria que deve monitorar para ver o cdigo descompactado. Agora veremos o OllyDBG executando cada linha do cdigo (uma a uma), de forma animada (uma instruo a cada 0,25 segundos, aproximadamente), e ao mesmo tempo, as modifica es sendo gravadas na memria na posio indicada. Pressione F9 para executar o programa at o breakpoint marcado. Aps isso, basta pressionar Control+F7 para iniciar a animao. O aluno poder acompanhar a descompactao dos bytes do programa pela rea de memria descoberta. Esta funcionalidade muito til durante a anlise de um binrio desconhecido, para a identificao de partes do cdigo executadas em um loop.

Captulo 3 - Roteiro de Atividades

35

36

Engenharia Reversa de Cdigo Malicioso

4
Formato de arquivos executveis
objetivos
Apresentar o formato PE e mostrar como extrair informaes relevantes das sees, tabela de importao e cabealhos para a anlise esttica do arquivo.

conceitos

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

Exerccio de fixao 1 e Arquivos executveis


Todo arquivo binrio um arquivo executvel? E todo arquivo executvel um arquivo binrio?

Formato de arquivos executveis


11 Para um programa ser executado em um sistema operacional, ele deve obedecer a certos formatos padronizados. 11 Dessa forma, o sistema sabe onde encontrar o cdigo, recursos, bibliotecas, e como mapear tudo isso no espao de memria reservado ao programa. 11 Alguns formatos de executveis: 22 Portable Executable PE (Windows, DOS).

22 ABI Mach-O (MacOS X). Neste captulo, conheceremos um pouco sobre o formato usado por arquivos executveis. Estudaremos rapidamente a estrutura do formato ELF do Linux, mas vamos nos concentrar no formato PE, usado pelos executveis do Windows. Um formato de arquivo executvel descreve a estrutura dos dados e cdigos de um programa, de forma a permitir ao sistema operacional identificar cada parte do programa, alocando o espao necessrio em memria e mapeando a estrutura fsica do arquivo na memria virtual, iniciando a execuo do programa a partir do ponto de entrada do cdigo. Os formatos executveis descrevem ento como organizar a informao dentro de um arquivo, descrevendo onde ficam as reas de cdigo, de recursos, as bibliotecas que devem

Captulo 4 - Formato de arquivos executveis

22 ELF (Linux, Unix).

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?

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

Formato PE
11 Formato de arquivos Portable Executable (PE): 22 A Microsoft baseou o formato PE no antigo formato COFF do Unix. 11 Por que portvel? 22 Suporta 32 bits e 64 bits. 22 Suporta arquiteturas MIPS, PowerPC, DEC Alpha e ARM. 11 Arquivos PE: 22 Extenso .exe ou .dll O formato PE o principal formato de executveis usado em sistemas Windows. Ele foi

baseado no antigo formato COFF usado em verses mais antigas do Unix. Outros formatos suportados no Windows so os formatos DOS (formato de executvel de 16 bits do antigo DOS, reconhecido pela string MZ no comeo do arquivo), COM (executvel de 16 bits do DOS com extenso COM) e NE (New Executable, formato usado pelo DOS Multitasking, que usualmente pode ser executado como 32 bits). O formato PE considerado portvel, pois pode ser utilizado tanto por arquivos de 32 bits como de 64 bits, e pode ser executado sem modificaes em outras arquiteturas de processador, como MIPS, PowerPC, DEC Alpha e ARM. Uma caracterstica muito conhecida desse formato, e que causa muitos problemas para os usurios mais leigos, que ele reconhecido pelo sistema operacional pela sua extenso,
Engenharia Reversa de Cdigo Malicioso

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

38

DOS MZ header DOS stub PE header Section table Section 1

Section 2

Figura 4.1 Formato de arquivos Portable Executable (PE).

Section ...

Section n

A Figura 4.1 representa a estrutura do cabealho de um arquivo PE. A primeira coisa a se notar a assinatura de um arquivo executvel. Em sistemas Windows, arquivos executveis sempre comeam com a string MZ. Este fato permite identificar um arquivo executvel mesmo que ele no esteja com a extenso certa, ou tambm identificar executveis embu tidos dentro de outros arquivos. A seguir, temos o stub DOS, que o cdigo responsvel por imprimir a mensagem This program cannot be run in DOS mode. O campo a seguir o cabealho NT ou cabealho PE propriamente. Ele sempre iniciado pela string PE. nele que ficam contidas as informaes sobre o executvel, incluindo endereo do entry point, endereo das tabelas de importao e exportao, nmero de sees, entre outras informaes. A ltima parte do cabealho PE descreve as sees existentes no binrio. Cada descrio contm o nome da seo, tamanho real (em disco) e virtual (em memria), realocaes (se forem necessrias), atributos da seo (leitura/escrita, executvel, contm cdigo etc). Estas caractersticas permitem ao analista identificar alguns casos onde o binrio foi modificado, como por exemplo, se foi usado um compactador. Estes programas costumam compactar somente as sees de cdigo, e criam sees extras para armazenar o cdigo descompactado. Estas sees extras geralmente tm tamanho 0 em disco, e um tamanho dessas sees vazias que elas geralmente tm o atributo de execuo setado, pois aps a descompactao, o controle do programa passar ao cdigo armazenado ali.
Captulo 4 - Formato de arquivos executveis

virtual grande o suficiente para armazenar o cdigo descompactado. Outras caractersticas

39

00500000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ....... .. 00500010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 .......@....... 00500020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00500030 00 00 00 00 00 00 00 00 00 00 00 00 DB 00 00 00 ............... 00500040 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 ..!OL!Th 00500050 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F is program canno 00500060 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 t be run in DOS 00500070 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 mode....$....... 00500080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00500090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 005000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 005000B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 005000C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 005000D0 00 00 00 00 00 00 00 00 50 45 00 00 4C 01 03 00 ........PE..LO. 005000E0 00 00 00 00 00 00 00 00 00 00 00 00 E0 00 0F 01 .............O 005000F0 0B 01 07 00 00 60 00 00 00 10 00 00 00 80 00 00 .............. 00500100 00 ED 00 00 00 90 00 00 00 F0 00 00 00 00 50 00 ...........P. 00500110 00 10 00 00 00 02 00 00 04 00 00 00 00 00 00 00 .............. 00500120 04 00 00 00 00 00 00 00 00 00 01 00 00 10 00 00 .............. 00500130 00 00 00 00 02 00 00 00 00 00 10 00 00 10 00 00 ............. 00500140 00 00 10 00 00 10 00 00 00 00 00 00 10 00 00 00 ............. 00500150 00 00 00 00 00 00 00 00 14 F5 00 00 30 01 00 00 ........J..O.. 00500160 00 F0 00 00 14 05 00 00 00 00 00 00 00 00 00 00 ............. 00500170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00500180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00500190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 005001A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 005001B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 005001C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 005001D0 55 50 58 30 00 00 00 00 00 00 00 00 00 10 00 00 UPX0.......... 005001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 005001F0 00 00 00 00 80 00 00 E0 55 50 58 31 00 00 00 00 ......UPX1.... 00500200 00 60 00 00 00 90 00 00 00 60 00 00 00 04 00 00 ....+.......... 00500210 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 E0 ............@.. 00500220 2E 72 73 72 63 00 00 00 00 10 00 00 00 F0 00 00 .rsrc......... 00500230 00 08 00 00 00 64 00 00 00 00 00 00 00 00 00 00 ....d.......... 00500240 00 00 00 00 40 00 00 C0 00 00 00 00 00 00 00 00 ....@.......... 00500250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ DOS EXE Signature DOS Header Oset to PE Signature PE Header Section Description
Na Figura 4.2 podemos ver como se parece o incio de um arquivo PE quando visto em um editor hexadecimal. Podemos ver a assinatura de arquivo executvel MZ logo no comeo do dump, seguida pelo cabealho DOS. O campo em vermelho indica o Offset, a partir do comeo do arquivo, do incio do cabealho PE. Logo aps est o stub DOS com a mensagem impressa quando o programa executado em DOS.

Engenharia Reversa de Cdigo Malicioso

Figura 4.2 Arquivo PE quando visto em um editor hexadecimal.

40

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

Cabealhos do formato PE
11 Cabealhos DOS e NT: 22 O arquivo PE comea com o stub DOS, usualmente responsvel pela mensagem This program cannot be run in DOS mode , e por apontar para o cabealho NT (Offset to PE signature). 11 So necessrias no mnimo duas sees em um arquivo PE: uma para dados e uma para cdigo. 22 Podem existir mais sees, dependendo do tipo de arquivo, sendo as mais comuns: 33 .text: cdigo executvel. 33 .data, .rdata ou .bss: dados. 33 .rsrc: seo de recursos. 33 .idata, .edata: importao e exportao de funes. Como vimos, o cabealho de um arquivo PE est dividido em trs partes: 11 Cabealho DOS, responsvel por imprimir a mensagem quando o arquivo executado em DOS, e por indicar o offset do cabealho PE; 11 O prprio cabealho PE; 11 Os cabealhos de seo, que descrevem as caractersticas das sesses existentes. A seguir so mostrados alguns exemplos de sees padro que podem existir em um exe-

cutvel. Muitas vezes, quando um binrio compactado ou criptografado com um compactador de executveis, ele pode modificar o nmero ou alguma caracterstica das sesses, e por isso voc deve ficar atento a essas informaes quando for analisar um arquivo. Sees mais comuns: 11 .text cdigo executvel; 11 .data, .rdata ou .bss dados; normalmente BSS usado para armazenar dados dinmicos durante a execuo, por exemplo na descompactao do binrio. 11 .rsrc seo de recursos; programas maliciosos costumam guardar parte do cdigo ou 11 . idata, .edata importao e exportao de funes. 11 Cabealhos NT: cabealho de arquivo. 22 Primeiro cabealho NT, logo aps a assinatura PE. 11 Contm alguns campos interessantes: 22 Machine: indica o tipo de arquitetura. 22 NumberOfSections: o nmero de sees no executvel. 22 TimeDateStamp: no crtico, mas pode indicar a data em que o arquivo foi criado. 22 SizeOfOptionalHeader: indica o tamanho exato do cabealho opcional.
Captulo 4 - Formato de arquivos executveis

tabelas de importao aqui, para dificultar a anlise dos binrios.

41

A primeira parte do cabealho NT descreve caractersticas gerais do binrio, como tipo de arquitetura para o qual ele foi compilado, nmero de sees existentes, timestamp da criao do arquivo e tamanho do cabealho PE. O timestamp existente aqui pode ser uma indicao de quando o binrio foi compilado, e por isso os autores dos programas maliciosos costumam zerar esse valor, para apagar seus rastros. O tamanho do cabealho opcional indica o tamanho em bytes do restante do cabealho, a partir da assinatura PE, at o incio dos cabealhos de sees. 11 Cabealho NT: cabealho Optional. 11 Assinatura = 10 Bh (magic number PE32) 11 AddressOfEntryPoint: endereo de incio da execuo. 22 possvel que outros cdigos sejam executados antes do ponto de entrada. 11 ImageBase: endereo usado como base para todos os endereos relativos no cdigo. 22 possvel algumas vezes encontrar o cabealho PE neste endereo na memria. 11 SizeOfHeaders: indica o tamanho do cabealho completo, a partir do incio do arquivo, inclusive dos cabealhos de sees. 11 SectionAlignment: alinhamento das sees na memria. 11 FileAlignment: alinhamento das sees no disco. No cabealho opcional esto localizadas a maioria das informaes sobre o executvel. Um dos principais campos desse cabealho o endereo do entry point do programa. Este o endereo da primeira instruo que ser executada aps o programa ser carregado na memria. Ou pelo menos, esta a descrio oficial do formato PE. Durante a anlise de um programa malicioso o analista deve tomar muito cuidado, pois existem casos onde um cdigo pode ser executado ANTES do sistema transferir o controle de execuo para a instruo no entry point, ou antes do debugger paralisar a execuo do programa. Em captulo posterior, analisaremos exemplos destes casos, mas por ora devemos apenas ficar conscientes de que mesmo executando o programa em um ambiente controlado, no se deve jamais confiar que o sistema est seguro e que o programa mali cioso no foi executado. Seguindo com a descrio dos campos mais importantes do cabealho opcional, a seguir temos o campo que indica o endereo base a partir do qual os offsets fazem referncia na imagem. neste endereo que a imagem do programa ser carregada na memria virtual, e onde podemos encontrar o incio do cabealho PE do programa carregado. possvel conferir isso, examinando no Olly o valor indicado em ImageBase e depois procurando pelo
Engenharia Reversa de Cdigo Malicioso

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

42

11 Cabealho NT: Cabealho Optional. 22 Export Table Address/Size. 33 Indica o endereo da tabela de exportao; normalmente usada em DLLs. 22 Import Table Address/Size. 33 Indica o endereo da tabela de importao. 22 Resource Table Address/Size. 33 Endereo da rea de recursos, onde so armazenados cones, imagens, strings etc. 22 TLS Table Address/Size. 33 Endereo da tabela de chamadas da Thread Local Storage. Abaixo esto descritas algumas das principais tabelas existentes no cabealho PE. Essas tabelas so as mais importantes durante a anlise de um binrio malicioso: 11 Export Table Address/Size: indica o endereo da tabela de exportao; normalmente usada em DLLs. 11 Import Table Address/Size: indica o endereo da tabela de importao. Se o offset

indicar um endereo fora da rea de cdigo, pode significar que o binrio foi modificado para dificultar a anlise. A tabela de importao indica as DLLs e funes delas que o programa utilizar, e por isso muitas vezes o autor do programa modifica a localizao da tabela, para dificultar a anlise. 11 Resource Table Address/Size: endereo da rea de recursos, onde so armazenados cones, imagens, strings etc. Pode tambm conter cdigo ou a tabela de importao em binrios modificados. A tabela de recursos indica como esto organizados os recursos dentro da seo destinada a eles. A seo de recursos normalmente usada por autores de programas maliciosos para armazenar cdigo ou dados do programa. 11 TLS Table Address/Size: endereo da tabela de chamadas da Thread Local Storage. Esta tabela pode indicar funes que sero executadas antes do entry point do programa. A tabela de chamadas do TLS (Thread Local Storage) serve normalmente para guardar informaes relativas aos threads criados pelo programa, mas devido a sua caracterstica de ser possvel criar funes de chamada a TLSs executadas antes do entry point do programa, elas so usadas para execuo de cdigo malicioso, como por exemplo uma funo para descompactar ou decriptografar cdigo, ou mesmo infectar o sistema se o programa for carregado em um debugger.

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.

Captulo 4 - Formato de arquivos executveis

Tabela de importao

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. 11 Characteristics campo que indica os atributos da seo, como por exemplo
Engenharia Reversa de Cdigo Malicioso

UNINITIALIZED_DATA, EXECUTE, READ, WRITE, entre outros.

44

Roteiro de Atividades 4
Atividade 4.1 Navegando pela estrutura de um arquivo PE
1. Execute o OllyDBG; 2. Abra o arquivo: \Desktop\Exemplos\Sessao 4\mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dat 3. Abra a Janela de Memria (Alt-M ou boto M na barra de ferramentas); 4. Identifique a rea de memria do programa, e clique duas vezes sobre o item PE Header; 5. Examine as estruturas dos cabealhos DOS e NT. Voc pode alternar entre visualizao no formato de cabealho e no formato hexadecimal, clicando com o boto direito e escolhendo Special->PE Header ou Hex->Hex/ASCII (16 bytes); 6. Faa uma lista dos campos que considera mais importantes durante a anlise; 7. Mantenha o Olly DBG aberto para acompanhar o mdulo terico, acompanhando no arquivo os campos explicados pelo instrutor.

Atividade 4.2 Examinando arquivos PE


1. Examine os arquivos em \Desktop\malware\, utilizando o LordPE e o OllyDBG; 2. Navegue pelas informaes de cabealho dos executveis; 3. Procure por inconsistncias nos campos do cabealho que possam dificultar a anlise ou indiquem comportamento malicioso ou suspeito; 4. Discuta alguns casos encontrados pela turma que tenham dificultado a anlise do programa; 5. Pesquise na internet problemas e solues relacionadas a mudanas na estrutura de arquivos executveis; 6. Faa um relatrio descrevendo os arquivos analisados e as inconsistncias encontradas, indicando se elas dificultaram a anlise do arquivo e possveis solues para contornar os problemas. Complemente o relatrio com as informaes encontradas na internet.

Captulo 4 - Roteiro de Atividades

45

Para mais informaes sobre o formato PE, consulte os arquivos: 11 \Desktop\PE File Format - A Reverse Engineers View.pdf 11 \Desktop\PE Format Poster.pdf

46

Engenharia Reversa de Cdigo Malicioso

5
Assembly bsico parte 1
objetivos
Apresentar a linguagem assembly e seus pontos principais, como anlise de stack e anlise de memria, para extrair o mximo de informaes em uma anlise de cdigo malicioso.

conceitos

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

Exerccio de fixao 1 e Assembly


Por que devemos entender o assembly para trabalhar com engenharia reversa?

Exerccio de nivelamento 1 e Identificao de parmetros


Qual o registrador responsvel por armazenar o endereo do topo da pilha?

A partir de um endereamento baseado em EBP, como podemos identificar os parmetros passados e as variveis locais definidas em uma funo?

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.

Captulo 5 - Assembly bsico parte 1

47

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

No est no escopo deste curso ensinar tudo sobre a linguagem; o conhecimento mnimo dela pr-requisito para o curso, mas somente relembraremos alguns conceitos teis durante a anlise de programas maliciosos. Primeiro, devemos relembrar os componentes macro de um processador: CPU, memria, registradores e disco. A CPU processa as instrues de um programa, lendo cada instruo a partir da memria principal para uma memria interna CPU (cache), decodificando-a e executando-a. Para isso, utiliza registradores, que so reas de memria internas CPU, para armazenar dados necessrios execuo da instruo. Os programas so armazenados em disco, e dele so lidos atravs de instrues de acesso a dispositivos fsicos do sistema operacional. Um programa implementado como uma sequncia de instrues assembly. Mas como veremos daqui para a frente, essa sequncia nem sempre muito clara. 11 As instrues podem: 22 Referenciar ou manipular posies de memria. 22 Fazer clculos. 22 Controlar o fluxo do programa. 22 Controlar a entrada e sada de dados. 11 Uma nica linha de cdigo de alto nvel convertida em diversas instrues assembly. importante lembrar que essas instrues so de baixo nvel, isto , perfazem as aes mais simples. Por isso, uma nica linha de cdigo em linguagem de alto nvel, como C por exemplo, pode se transformar em diversas linhas em assembly.
HelloWorld proc near var_8= dword ptr -8 var_4= dword ptr -4 push mov sub and mov
Engenharia Reversa de Cdigo Malicioso

ebp ebp, esp esp, 8 esp, 0FFFFFFF0h eax, 0 eax, 0Fh eax, 0Fh eax, 4 eax, 4 [ebp+var_4], eax eax, [ebp+var_4] sub_401088 __main

Figura 5.1 Comparao de linha de cdigo em linguagem de alto nvel com assembly.

add int main () { printf("Hello World"); } add shr shl mov mov call call mov call leave retn

[esp+8+var_8], oset aHelloWorld ; "Hello World" printf

HelloWorld endp

48

Este cdigo foi complicado com o Cygwin GCC, com diversas funes extras de inicializao inseridas pelo compilador. Outros compiladores poderiam adicionar outros tipos de cdigo. Esta uma caracterstica importante durante a anlise, pois possvel reconhecer o tipo de compilador usado apenas estudando as funes de inicializao adicionadas ao cdigo do usurio. No exemplo, vemos que um simples cdigo Hello World pode se transformar em funes e instrues diversas. O arquivo no IDA Pro est disponvel no diretrio \Desktop\Sessao 5\HelloWorld.exe.

Registradores
11 Registradores so reas de memria reservadas para uso pela CPU. 11 Existem oito registradores de uso geral em plataformas x86 de 32 bits, cada um tambm com 32 bits. 11 O acesso aos registradores muito rpido. 22 Como o acesso rpido e eles so limitados, os compiladores tentam utiliz-los de forma eficiente. 22 Isso se torna um fator importante durante a anlise. Durante a execuo de uma instruo, a CPU precisa armazenar dados que possam ser necessrios para execut-la. A CPU no tem acesso direto memria da mquina, e portanto precisa utilizar uma memria interna para isso. Por exemplo, para copiar dados de

uma posio de memria para outra, a CPU precisa copiar cada byte da posio de memria de origem, para dentro da memria da CPU, e depois para a posio de memria de destino. Estas reas de memria interna so os registradores. Existem oito registradores de uso geral em processadores de 32 bits, e cada registrador tem 32 bits de espao para armazenar informaes. Em plataformas x64 temos os registradores de 64 bits que alm dos registradores de uso geral existentes na plataforma 32 bits existem mais 8 registradores de R8 at R15. Os registradores j existentes na plataforma x86 so acessados como: RAX, RBX, RCX, RDX, RSI, RDI, RBP e RSP. Os registradores especiais possuem uma forma especial para acesso aos contedos de 32 bits, 16 bits e 8 bits. Por exemplo, o registrador R8 acessa o seu contedo 64 bits, para acessar o seu respectivo DWORD (32 bits) utilizamos R8D, para acessar o WORD (16 bits) utilizamos R8W e para acessar os 8 bits utilizamos R8L. O ponteiro de instruo (EIP na plataforma 32 bits) tambm recebeu seu equivalente 64 bits que acessado como RIP.
Captulo 5 - Assembly bsico parte 1

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. 11 EDX : voltil, de uso geral.

49

8 bits RAX

8 bits

8 bits

8 bits

8 bits

8 bits

8 bits

8 bits

EAX AX AH AL
Tabela 5.2 Organizao de um registrador.

A Tabela 5.2 de um grfico que mostra como est organizado um registrador. importante notar que um mesmo registrador pode ser acessado por diversos nomes em um programa. Cada nomenclatura indica o tamanho do dado que queremos acessar, mas todos eles se referem ao mesmo registrador. Olhando a figura, vemos que o mesmo registrador RAX (64 bits) pode ser acessado como EAX (32 bits), AX (16 bits) e AH e AL se referem aos 8 bits mais 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
Engenharia Reversa de Cdigo Malicioso

22 Ponteiro de instruo, indica a prxima instruo a ser executada. Mais alguns registradores e seus usos mais comuns: 11 ESI e EDI: registradores normalmente usados em operaes que envolvem strings, como origem e destino das mesmas, respectivamente.Normalmente, estes registradores contm o endereo de memria onde as strings esto armazenadas, e as instrues vo ler cada byte do endereo de origem e escrever no endereo de destino. 11 ESP e EBP: normalmente usados como apontadores do Stack e de frame. 11 EIP: usado para controlar o fluxo de execuo, apontando sempre para a instruo seguinte que deve ser executada.

50

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

Stack
11 Estrutura de dados abstrata baseada em uma combinao de hardware e software. 11 Utilizado para armazenar dados, em uma estrutura LIFO (Last In First Out). 22 Passagem de parmetros para funes. 22 Armazena endereos de retorno de chamadas. 22 No Windows, serve tambm para armazenar a Structured Exception Handling (SEH). 11 A instruo PUSH utilizada para colocar um valor de 32 bits no Stack. 11 A instruo POP remove um valor de 32 bits do Stack. 11 Dados podem ser acessados no Stack atravs de referncia indireta usando o registrador EBP. Entender o funcionamento do Stack fundamental para realizar uma anlise de qualquer tipo de programa em nvel de cdigo de mquina. O Stack usado pela CPU para passar parmetros a funes, armazenar endereos de retorno de chamadas, e outras estruturas mais complexas como a Structured Exception Handling (SEH).

Ele funciona como uma estrutura LIFO, isto , o ltimo dado a ser colocado no Stack vai ser o primeiro a sair. O Stack comparado a uma pilha de pratos, que cresce de baixo para cima. O registrador ESP utilizado para apontar para o topo da pilha, e normalmente, quando um programa precisa reservar espao de memria para um parmetro de funo, ele subtrai o tamanho necessrio de ESP. Essa subtrao adiciona espao ao Stack. Para limpar o Stack, deve-se somar o tamanho desejado a ESP, o que remover este tamanho do Stack. Para gravar um dado de 32 bits na pilha, usamos a funo PUSH, e para remover esse dado, usamos a funo POP. Os dados tambm podem ser acessados atravs de referncia indireta usando o registrador EBP, como mostrado no exemplo abaixo:

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


Move para EAX o valor armazenado na posio 14 do Stack.
Captulo 5 - Assembly bsico parte 1

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. 11 Processos no podem sair de seu espao de memria.

51

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

O sistema operacional Windows, em sua verso de 32 bits, disponibiliza um total de 4 GB de memria virtual para os aplicativos de kernel e de usurio. Cada processo v somente 2 GB de memria virtual, que compartilhada entre todos os processos. O compartilhamento ocorre atravs da paginao de memria, isto , cada processo v sua memria como sendo de 2 GB contnuos em memria, mas o sistema organiza esses 2 GB em pginas de 4096 bytes, e somente as pginas em uso de um processo ficam em memria. Duas pginas no ocupam nunca o mesmo espao fsico na memria real, e assim o sistema consegue fazer com que os processos compartilhem a memria fsica, sem que um tenha acesso memria de outro. Este esquema permite que um processo tenha disponveis 2 GB sempre, independente da memria fsica do computador. As pginas que no couberem na memria fsica ficam armazenadas na partio de swap at que sejam necessrias. 11 No incio da execuo, a imagem do programa carregada na memria. 11 As DLLs necessrias so carregadas. 11 As variveis de ambiente so mapeadas. 11 As pilhas do processo so iniciadas.

0x00000000 0x00010000 0x00030000 0x0012f000 0x00150000 0x00400000

USER SPACE Environment Variables Heap Stack of Main Thread Heap Main Executable

0x00d8d0000 0x71ab0000 0x7c800000 0x7c900000 0x7f000000 0x80000000

Stack of Main Thread 2 WS2_32.DLL KERNEL32.DLL NTDLL.DLL


Figura 5.4 Mapeamento de um processo na memria.

Engenharia Reversa de Cdigo Malicioso

KERVEL SPACE

Na Figura 5.4 podemos observar como o mapeamento de um processo nos 2 GB reservados para ele. Podemos notar que o cdigo executvel do programa no carregado necessariamente no incio da memria. O endereo onde ele carregado dentro da memria virtual definido pelo seu atributo ImageBase de acordo com o que est determinado no cabealho do executvel. Normalmente (mas nem sempre) esse endereo 0x00400000. Podemos notar ainda que as variveis de ambiente so as primeiras a serem carregadas, seguido do Heap e do Stack (normalmente disponvel a partir de 0x0012f000) do thread principal do programa. Aps o executvel, existe um espao reservado aos Stacks dos threads adicionais, e finalmente o espao reservado pelo programa s DLLs necessrias.

52

Durante o carregamento, essas estruturas so mapeadas em memria, as DLLs so 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.
Address Size Owner Section Contains Type Access Initial Mapped as RW RW

00010000 00001000 00020000 00001000 0022D000 00001000 0022E000 00002000 00230000 00003000 00240000 00006000 00340000 00006000 00350000 00003000 00360000 00016000 00380000 0003D000 003C0000 00006000 003D0000 00001000 003E0000 00001000 00400000 00001000 HelloWo: 00401000 00001000 HelloWo: .text 00402000 00001000 HelloWo: .rdata 00403000 00001000 HelloWo: .bss 00404000 00001000 HelloWo: .idata 00410000 00041000 0065B000 00001000 0065C000 00004000 60000000 00005000 60010000 0000B000 60040000 00003000 61000000 00001000 cygwin1 61001000 000FE000 cygwin1 610FF000 00003000 cygwin1 61102000 0000B000 cygwin1 6110D000 00034000 cygwin1 61141000 0000A000 cygwin1 61141B00 00008000 cygwin1 61153000 00001000 cygwin1 61154000 00011000 cygwin1 61165000 00001000 cygwin1 61166000 00001000 cygwin1 61167000 00009000 cygwin1 PE header .text /4 .data .rdata .bss .edata .rsrc .reloc /19 /38 .idata imports exports resources relocations data code stack of main thread PE header SFX data imports stack of main thread

Priv 00021004 RW Priv 00021004 RW

Priv 00021104 RW Guarded RW Priv 00021104 RW Guarded RW Map 00041002 R R RW RW RW R R R RWE RWE RWE RWE RWE RWE RWE R \Device\Harddi \Device\Harddi \Device\Harddi \Device\Harddi Priv 00021004 RW Priv 00021004 RW Map Map Map Map 00041004 RW 00041002 R 00041002 R 00041002 R

Priv 00021040 RWE Priv 00021040 RWE Imag 01001002 R Imag 01001002 R Imag 01001002 R Imag 01001002 R Imag 01001002 R Map 00041002 R

Priv 00021004 RW Guarded RW Priv 00021004 RW Guarded RW Map Map Map 00041004 RW 00041004 RW 00041004 RW RW RW RW RWE RWE RWE RWE RWE RWE RWE RWE RWE RWE RWE RWE RWE RWE

Imag 01001002 R Imag 01001002 R Imag 01001002 R Imag 01001002 R Imag 01001002 R Imag 01001002 R Imag 01001002 R Imag 01001002 R Imag 01001002 R Imag 01001002 R Imag 01001002 R Imag 01001002 R

Figura 5.5 Layout da memria de processo.

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.

Captulo 5 - Assembly bsico parte 1

.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

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?

Structured Exception Handling


11 SEH: 22 Manipuladores de exceo so funes registradas para tratar problemas. 22 Podemos registrar uma funo para tratar erros de E/S ou divises por zero, por exemplo. 11 Os endereos destas funes so armazenados no Stack. 11 Quando ocorre uma exceo, a lista de manipuladores percorrida para encontrar uma apropriada. 11 Existe um manipulador que trata todas as excees, responsvel pela mensagem: 22 Windows has detected a general protection fault. Sistemas Windows utilizam um sistema de tratamento de excees chamado Structured Exception Handling (SEH). Essa estrutura formada por ponteiros para funes, que so chamadas toda vez que uma exceo ocorre dentro do programa.

Um programa pode registrar funes para tratar algumas excees, como por exemplo uma diviso por zero. Quando ocorre a exceo, o Windows percorre essa lista, passando o controle para cada funo registrada, e aquela que conseguir tratar o erro ser executada. O endereo dessas funes fica armazenado no Stack, em uma lista encadeada. Existe
Engenharia Reversa de Cdigo Malicioso

sempre uma funo de tratamento de excees registradas pelo Windows, e geralmente ela responsvel por mostrar a mensagem Windows has detected a general protection fault. Alguns programas utilizam essa estrutura para controlar seu fluxo de execuo. Veremos nas atividades prticas um exemplo de um compactador de executveis chamado PECompact, que utiliza essa funcionalidade para executar sua rotina de descompresso.

Instrues bsicas assembly


11 Assembly bsico: 22 O padro que adotaremos o assembly Intel (outro padro seria AT&T). 22 Ex: MOV destino, origem.

54

11 Ponteiros so indicados por [] 22 Ex: [EAX] = *EAX = Contedo do endereo apontado por EAX. 11 Load Effective Address (LEA) 22 Transfere o endereo de offset da origem para o registrador de destino. 22 mais rpido que usar MOV. 33 Ex: LEA EAX, [EBX] vs. MOV EAX, EBX. 22 LEA geralmente utilizado em operaes matemticas. 33 Ex: LEA EAX, [EAX*EAX] equivalente a EAX 2. A seguir faremos uma rpida reviso de alguns comandos mais usados em assembly. Primeiramente vemos dois exemplos de uso de ponteiros em assembly. O primeiro caso usado para indicar o contedo do endereo armazenado em um registrador.

Assim, se EAX=0x00401000, e a partir do endereo 0x00401000 temos os valores 0xDE 0x41, 0xBE e 0x00, o comando MOV EAX, [EAX] vai fazer EAX=0x00BE41DE. Isto porque EAX um registrador de 32 bits (4 bytes so copiados) e em sistemas little endian os valores so armazenados de trs para a frente. Nesse caso, o comando MOV no copiou o valor de EAX, mas sim o contedo apontado pelo endereo em EAX. No caso do LEA, o indicador de ponteiro funciona de forma diferente. Load Effective Address (LEA) indica que o que vamos copiar para o registrador de destino o endereo armazenado no registrador de origem. Assim, se EBX=0x00401000, o comando LEA EAX,[EBX] vai copiar o valor 0x00401000 em EAX. Isto o equivalente a fazer MOV EAX, EBX. LEA geralmente usado em operaes matemticas envolvendo os valores armazenados nos registradores. Um exemplo disso o incio do cdigo em um arquivo compactado com UPX:

0050ED00 PUSHAD 0050ED01 MOV ESI,509000

<- Salva flags <- Move para ESI endereo 0x00509000

0050ED06 LEA EDI,DWORD PTR DS:[ESI+FFFF8000] <- Salva em EDI o endereo onde ser descompactado o programa (ESI+0xFFFF8000 => ESI0x8000 => 0x00501000) 0050ED0C PUSH EDI <- Salva EDI

11 XOR executa a operao OU-EXCLUSIVO. 22 Passar o mesmo registrador nos dois parmetros zera o contedo do registrador.

q
Captulo 5 - Assembly bsico parte 1

33 Ex: XOR EAX, EAX igual a EAX = 0. 11 PUSH/POP salva ou recupera o contedo de um registrador no Stack. 22 Ex: PUSH EAX/POP ECX. 11 PUSHF(D)/POPF(D) salva ou recupera os flags de CPU. 22 Ex: PUSHF. 11 As verses terminadas em D trabalham em 32 bits; o comando normal em 16 bits. O comando XOR usado basicamente para zerar registradores, mas pode indicar o uso de criptografia. Qualquer operao XOR onde o operando da direita diferente do da esquerda pode ser considerada uma criptografia simples. Os valores da esquerda so mascarados com o valor da direita, que pode ser chamado de chave da criptografia. Nas duas ltimas sesses, veremos um exemplo de criptografia usando essa tcnica.

55

Os comandos PUSHAD e POPAD so usados para salvar todas as flags e registradores no Stack. Isso geralmente feito antes de uma operao que v modificar muitos registradores, e o programa precisa salvar essa informao antes de executar as operaes. O compactador UPX usa essas funes para salvar o estado inicial do programa antes de descompact-lo, e recuperar esse estado antes de passar o controle para o programa descompactado. 11 Instrues de matemtica bsica: 22 INC, DEC, ADD, SUB, MUL, DIV. 11 Manipulao de registradores: 22 MOV, LEA. 11 Instrues de chamadas de funo: 22 CALL / RET, ENTER / LEAVE. 11 Comparao de valores: 22 CMP, TEST. 11 Controle de fluxo: 22 JMP, JZ, JNZ, JG, JL, JGE etc. 11 Manipulao de Stack: 22 PUSH, POP. 11 Operao binria: 22 AND, OR, XOR, SHL, SHR. Diversas instrues realizam operaes bsicas em assembly, como operaes matemticas, manipulao de registradores, chamada de funes, comparaes e controle de fluxo, mani pulao de Stack e operaes binrias. Um manual mais completo sobre essas operaes pode ser obtido atravs do IDA Pro, se tiver configurado corretamente o Help adicional conforme foi sugerido (opcodes.hlp), bastando posicionar o cursor em um comando e pressionar Control-F1.

Instrues assembly: Nmeros


11 Nmeros podem ser representados com sinal ou sem. 11 Nmeros positivos sem sinal variam de 0 a 0xFFFFFFFF. 11 Nmeros com sinal ocupam metade desse valor: 22 Positivos vo de 0x00000000 a 0x7FFFFFFF. 22 Negativos vo de 0x80000000 a 0xFFFFFFFF (-1).
Engenharia Reversa de Cdigo Malicioso

importante guardar bem esses conceitos sobre formato dos nmeros em assembly. Como assembly no mantm os tipos de variveis, muitas vezes o analista se confunde ao 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.

Instrues assembly: Endereamento


Modos de endereamento de memria: 11 Endereamento direto. 11 Endereamento indireto.

56

11 Endereamento indexado. 11 Endereamento indexado escalado. Formas de endereamento usadas em assembly: 11 Endereamento direto MOV EAX, 0xDACAFE int big num = 0xDACAFE; 11 Endereamento indireto MOV EAX, [EBX] char inicial = *nome; 11 Endereamento indexado MOV EAX, [EBX+0xB4D] int opcao = char array [0xB4D]; 11 Endereamento indexado escalado MOV EAX, [EBX+ECX*20] struct *mystruct = struct array[20]; O endereamento direto aquele onde o valor do operando da direita copiado diretamente para o operando da esquerda. No endereamento indireto, o valor do operando da direita o endereo copiado para o operando da esquerda.

Os dois ltimos exemplos mostram como usar endereamento indireto para criar estruturas como arrays e estruturas mais complexas . No ltimo caso, temos que EBX o endereo base da estrutura, ECX o tamanho de cada registro, e 20 o nmero do registro que queremos acessar.

Instrues assembly: Chamada de funo


Existem diversos padres para a chamada de funo: 11 cdecl 22 Quem chama limpa o Stack. 11 stdcall 22 Funo chamada limpa o Stack. 11 fastcall 22 Argumentos podem ser passados em registradores diferentes.

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

Captulo 5 - Assembly bsico parte 1

11 thiscall

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 funcao(arg1, arg2); push arg2 push arg1 call funcao mov [ebp-0xc], eax

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

Abaixo esto dois exemplos de chamada de funes com passagem de parmetros e os respectivos modos de tratamento do Stack:

stdcall funcao(arg1, arg2); push arg2 push arg1 call funcao mov [ebp-0xc], eax cdecl funcao(arg1, arg2); push arg2 push arg1
Engenharia Reversa de Cdigo Malicioso

call funcao add esp, 8 mov [ebp-0xc], eax


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

58

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

Instrues assembly: Enquadramento


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

push ebp mov ebp, esp sub esp, 0x100


11 DLLs mais recentes:

mov edi, edi push ebp mov ebp, esp


11 Compiladores otimizados podem omitir o apontador de frame. 22 As variveis so referenciadas por ESP. O endereamento baseado em EBP permite ao programa acessar o Stack independentemente dos valores que possam ter sido adicionados ao mesmo. Por exemplo, quando uma funo chamada, seus parmetros ficam armazenados no Stack. Durante a execuo da funo, outros valores podem ser gravados ou removidos do Stack, modificando o ponteiro de topo da pilha. Para acessar os parmetros, a funo normalmente salva o valor de ESP em EBP no comeo da execuo, e passa a acessar os parmetros usando EBP como valor relativo. Vimos um exemplo disso quando o programa salva o retorno da chamada de funo EAX em sua varivel [EBP-0xC], ou seja, na posio 0xC relativa a EBP. importante notar que apesar dessa ser a maneira mais comum de acesso s variveis, nem sempre esse formato usado. Compiladores mais recentes ou otimizaes durante a compilao podem omitir o uso de EBP.

Instrues assembly: Parmetros de funo


11 Parmetros so positivos. 22 Parmetros passados para funes so referenciados positivamente a partir de EBP. 11 [EBP + valor] 22 Normalmente indica argumentos no Stack.

22 Indica variveis locais. 11 O retorno de funes normalmente feito em EAX quando o valor 32 bits. Finalmente, para diferenciar o uso de variveis locais e variveis passadas como parmetros, os compiladores geralmente usam valores positivos ou negativos referentes a EBP. Vimos o uso de [EBP-0xC], que indica uma varivel local. Lembrando dos exemplos de chamada cdecl e stdcall, poderamos escrever aquele cdigo em assembly da seguinte forma:

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

Captulo 5 - Assembly bsico parte 1

11 [EBP - valor]

59

60

Engenharia Reversa de Cdigo Malicioso

Roteiro de Atividades 5
Atividade 5.1 Structured Exception Handling
00401000 MOV EAX,4BA070 00401005 PUSH EAX 00401006 PUSH DWORD PTR FS:[0] 0040100D MOV DWORD PTR FS:[0],ESP 00401014 00401016 00401018 XOR EAX,EAX MOV DWORD PTR DS:[EAX],ECX PUSH EAX

1. Com OllyDBG, abra o arquivo:

\Desktop\Malware\mal.Banker-Down.PECompact.worm.scr
2. Examine o Stack quando executar 0x0040100D; 3. Execute com F7 cada instruo acima, at chegar em 0x00401016; 4. Ao executar 0x00401016, ser gerada uma exceo, que deve ser passada ao programa com Shift-F7; 5. Descreva o que aconteceu com o fluxo do programa e os possveis efeitos na anlise do programa.

Atividade 5.2 Estrutura de memria dos executveis


1. Examine os arquivos no diretrio \Desktop\Malware com o OllyDBG; 2. Verifique o mapeamento das sees na memria e o contedo da memria nos endereos das sees; 3. Examine as DLLs carregadas. Os processos que usam LoadLibraryA e GetProcAddress tm alguma diferena em relao aos demais?

Captulo 5 - Roteiro de Atividades

61

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

62

Engenharia Reversa de Cdigo Malicioso

6
Assembly bsico parte 2
objetivos
Identificar blocos de cdigo que so normalmente encontrados em cdigos analisados, visando facilitar a anlise do cdigo e a identificao de funcionalidades.

conceitos

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

Exerccio de fixao 1 e Cdigo assembly


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

Exerccio de nivelamento 1 e Cdigo assembly


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

Ao abrir um executvel em um disassembler, possvel recuperar informaes referentes aos tipos de variveis?
Captulo 6 - Assembly bsico parte 2

Ramificaes
11 Instrues utilizadas no controle de decises do programa. 11 Em uma instruo CMP, o operando da esquerda o parmetro de comparao: 22 CMP EBX, [EAX+20h] 22 EBX: 33 > [EAX+20h]? JA endereo 33 < [EAX+20h]? JB endereo 33 = [EAX+20h]? JE endereo

63

Ramificaes podem ser entendidas como cdigo de controle de fluxo dependente do valor de uma varivel. No exemplo do slide, temos o uso de uma instruo de comparao CMP EBX, [EAX+20h]. Essa instruo compara EBX com o valor armazenado no endereo 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 CODE:00407359 (sub_40729C()-1) CODE:0040735B para location1 CODE:0040735D para location2 CODE:0040735F outro valor? Va para location3

call sub

sub_40729C al, 1 ; Se

jb

short loc_407372 ; < 0? va

jz

short loc_407361 ; = 0? Va

jmp

short loc_407362 ; qualquer

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. Blocos condicionais so parecidos com as ramificaes, mas normalmente contm apenas
Engenharia Reversa de Cdigo Malicioso

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

if (var > 128) var = 128; mov eax, [ebp+8] cmp eax, 0x80 jbe skip

64

mov eax, 0x80 skip:

Loops
for (i = 0; i < 100; i++) do_something(); xor eax, eax start: cmp eax, 0x64 jge exit call do_something inc eax jmp start exit:
11 Loops so fceis de visualizar em grficos. 11 No IDA Pro 5, o modo normal de visualizao j em forma grfica. 11 Pode-se usar F12 para visualizar o fluxo de uma funo. Loops so estruturas de cdigo executadas um certo nmero de vezes, normalmente com uma condio de sada. Por exemplo, a funo FOR executa a sequncia de cdigo do_something() cem vezes.

for (i = 0; i < 100; i++) do_something(); xor eax, eax start: cmp eax, 0x64 jge exit call do_something inc eax
Captulo 6 - Assembly bsico parte 2

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.

65

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

Figura 6.1 Grfico gerado no IDA para identificar um loop.

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

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

loc_407372: mov eax, edi pop edi pop esi pop ebx retn

loc_407362: inc edi mov edx, ebx mov eax, edi call sub_4057AB mov edi, eax test edi, edi jnz short loop

legenda:

Verdadeiro Falso

; } while (EDI ! = 0)

Switch
Switch Statements:

switch (var) {
Engenharia Reversa de Cdigo Malicioso

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

66

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 JMP off_407F8C[EAX*4]
Captulo 6 - Assembly bsico parte 2

off_407F8C CODE:00407F88 dd offset loc_404394 dd offset loc_4045FC dd offset loc_4046E4 dd offset loc_4045C4 ; DATA XREF:

No caso acima, o controle do fluxo direcionado para a terceira localizao a partir de off_407F8C, ou seja, loc_4045FC.

67

Memcpy()/Strcpy()
memcpy() / strcpy() inline

mov esi, origem mov edi, [ebp-64] mov ebx, ecx shr ecx, 2 rep movsd mov ecx, ebx and ecx, 3 rep movsb
11 REP MOVSD copia ECX DWORDS de ESI para EDI. 11 REP MOVSB copia o restante dos bytes. Este tipo de estrutura pode ser encontrada em qualquer programa que trabalhe com strings.

mov esi, origem mov edi, [ebp-64] mov ebx, ecx shr ecx, 2 rep movsd mov ecx, ebx and ecx, 3 rep movsb
Os comandos REP so usados para ler/copiar strings em geral. Mais informaes sobre os comandos REP SCA* podem ser encontradas no Help do IDA Pro (opcodes.hlp). O importante a notar aqui que o registrador ESI usado para indicar o endereo da string de origem; EDI usada para indicar o endereo da string de destino, e ECX usado para indicar quantos caracteres sero lidos. Se a string no for um mltiplo de DWORD, os bytes restantes so copiados por REP MOVSB.

Engenharia Reversa de Cdigo Malicioso

Strlen()/Strstr()
strlen()/strstr() inline

mov edi, string or ecx, 0xFFFFFFFF xor eax, eax repne scasb not ecx dec ecx

68

11 REPNE SCASB percorre a string em EDI procurando pelo caractere em AL. 11 Para cada caractere percorrido, ECX decrementado e EDI incrementado. 11 No fim da sequncia REPNE: 22 EDI = posio do caractere encontrado + 1 (mais um). 22 ECX = tamanho negativo da string - 2 (menos dois). 11 Tamanho da string: 22 not ECX - 1

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

mov edi, string or ecx, 0xFFFFFFFF xor eax, eax repne scasb not ecx dec ecx
Para strstr(), cada caractere percorrido comparado com AL (ECX decrementado e EDI incrementado). Ao final, ECX vai conter a posio do caractere em AL na string. Se AL=0x00, o comando procura pelo caractere de fim de string, transformando o comando em strlen(). Como ECX vai ser um nmero negativo, normalmente o cdigo transforma o mesmo em nmero positivo fazendo NOT ECX; DEC ECX.

Estruturas
Acesso a estruturas:

push ebp amov ebp, esp mov eax, off_struct mov ebx, [ebp+arg_0] push esi
Captulo 6 - Assembly bsico parte 2

; varivel arg_0 local

cmp ebx, [eax+14h] mov eax, off_object ja short loc_12345678

; byte 0x14 a partir de EAX

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


11 EAX carregado de uma varivel global. 11 EAX acessado utilizando [], o que indica que um ponteiro para a estrutura.

; tem 8 bytes

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] mov eax, off_object ja short loc_12345678 cmp [eax+8*var_4], ebx ; if (struct[var_4]==EBX), cada struct[] sbb esi, esi
O primeiro caso o salvamento do endereo da estrutura off_struct em EAX. Este valor usado posteriormente para acessar o dcimo quarto byte da varivel, com a chamada CMP EBX, [EAX+14h]. Isso significa que deve-se comparar o valor de EBX com o dcimo quarto byte a partir de EAX. Outro uso de estruturas mostrado acima o acesso a variveis locais da funo, atravs de endereamento indireto de EBP. O comando MOV EBX, [EBP+arg_0] acessa o argumento arg_0 passado funo. Finalmente, temos um exemplo de acesso uma estrutura mais complexa. Neste caso, podemos considerar off_object como um array de estruturas. No caso, cada estrutura deve ter 0x8 bytes de tamanho, e o acesso a cada membro da estrutura feito como mostrado: CMP [EAX+8*var_4], EBX, ou seja, EBX vai ser comparado estrutura com ndice var_4 em nosso array.

; varivel arg_0 local

; byte 0x14 a partir de EAX

; tem 8 bytes

Operaes matemticas
11 A diviso usando a instruo DIV extremamente lenta. 22 Compiladores s a utilizam quando necessitam do resto. 11 Divises so feitas utilizando uma combinao de instrues de Shift.
Engenharia Reversa de Cdigo Malicioso

22 Ex: diviso por 4. 33 SHR EAX, 2. 11 SHL faz a operao oposta (multiplicao). As operaes de multiplicao e diviso em assembly so geralmente realizadas atravs das funes de Shift binrio. O comando DIV extremamente lento, e portanto o compilador s o utiliza quando precisar de resto. Para casos onde o resto no necessrio, ou em que realizamos uma multiplicao, o uso das funes SHR e SHL escolhido pelo compilador. Tomando como exemplo o nmero 8 representado em binrio por 00001000:

70

SHR EAX, 2 => 00000010 => 2 SHL EAX, 3 => 00010000 => 16
No caso de algum bit significativo ser movido para fora do tamanho do byte, ele ser descartado, e as flags de CARRY, ZERO e OVERFLOW podem ser setadas. Exemplo:

EAX=10001001 SHL EAX, 2 => 00100100 SHR EAX=3 => 00000100

Nmeros randmicos
Pseudo geradores de nmeros randmicos.

; ||||||||||||||| S U B R O U T I N E ||||||||||||||||||||||||||||||||| SaveCurrentTime proc near call mov retn SaveCurrentTime endp ; ||||||||||||||| S U B R O U T I N E ||||||||||||||||||||||||||||||||| GetTickCount ds:CurrentSavedTime, eax

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

Figura 6.2 Pseudo geradores de nmeros randmicos.

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
Captulo 6 - Assembly bsico parte 2

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. 11 Ento, como diferenciar: 22 Strings de dados brutos? 22 Strings UNICODE de strings ASCII? 22 Inteiros de ponteiros? 22 Inteiros de valores booleanos? 33 Precisamos analisar a varivel atravs das funes que a utilizam.

A identificao de tipos em assembly uma tarefa difcil, porque o assembly no representa tipos de variveis, dificultando essa tarefa do analista. Para identificar e diferenciar tipos de variveis, necessrio estudar como esses valores so usados durante a execuo do programa. A forma indicada de fazer isso estudando os parmetros passados para funes ou operaes realizadas com valores armazenados em registradores.

Variveis de API
O IDA Pro tem uma excelente identificao de tipos usados em chamadas de funes de API:

CODE:004056A4 loc_4056A4: CODE:004056A4 CODE:004056A7 CODE:004056A8 CODE:004056AB CODE:004056AC CODE:004056AF CODE:004056B0


Engenharia Reversa de Cdigo Malicioso

; CODE XREF: sub_405694+C

lea push lea push lea push lea push push call

edx, [ebp+TotalNumberOfClusters] edx ; lpTotalNumberOfClusters

edx, [ebp+NumberOfFreeClusters] edx ; lpNumberOfFreeClusters

edx, [ebp+BytesPerSector] edx ; lpBytesPerSector

edx, [ebp+SectorsPerCluster] edx eax ; lpSectorsPerCluster ; lpRootPathName

CODE:004056B3 CODE:004056B4 CODE:004056B5

GetDiskFreeSpaceA

Se compararmos com a dificuldade em encontrar os tipos das variveis de funes no inte grantes de uma API, para APIs documentadas o procedimento mais fcil. Para identificar o tipo de uma varivel, preciso descobrir um ponto no cdigo onde essa varivel seja usada, e ver como ela tratada, isto , se usada em uma soma ou 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:

BOOL _ _stdcall GetDiskFreeSpaceA(LPCSTR lpRootPathName,LPDWORD lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters)


Examinando o cdigo que antecede a chamada funo, observamos diversos comandos PUSH colocando esses parmetros no Stack. Lembre-se sempre de que a ordem de passagem dos parmetros inversa ordem descrita na chamada da funo na API.

Recuperao de tipos
Inteiros x Ponteiros: 11 Inteiros nunca so desreferenciados. 11 Inteiros so frequentemente comparados, ponteiros no. 11 Ponteiros so comparados com zero ou com outros ponteiros. 11 Aritmtica com ponteiros geralmente simples, mas com inteiros costuma ser complexa. No caso especfico de diferenciao de nmeros e ponteiros, importante notar a forma como as variveis so usadas. Ponteiros costumam ser desreferenciados (dereferenced), e geralmente so comparados com zero ou com outros ponteiros. A aritmtica realizada com ponteiros tambm costuma ser simples. No caso de nmeros, eles costumam ser comparados com outros nmeros e nunca so desreferenciados. A aritmtica envolvendo nmeros mais complexa. O uso dos

comandos INC e DEC pode indicar a presena de um nmero, j que no teria muito sentido incrementar ou decrementar o endereo de um ponteiro. 11 Recuperao de tipos: Strings x Dados brutos. 11 Cpia de strings geralmente precedida por um strlen() ou o equivalente inline, cpia de dados brutos no.
Captulo 6 - Assembly bsico parte 2

11 Strings so normalmente comparadas a caracteres legveis ou a outras strings, mas dados brutos normalmente no. 11 Confirme parmetros strings at para as chamadas a APIs.

73

loc_504546: cmp mov jnz cmo jz mov mov

;CODE XREF: sub_50450E+16j ; sub_50450E+1Aj byte ptr [edi], 40h ; 40h == @ [ebp+esi+String1], bl short loc_5045C3 ds:off_5090D0, ebx short loc_50457D eax, offset off_5090D0 esi, eax
Figura 6.3 Strings x Dados brutos.

No caso de strings, a identificao se faz atravs de chamadas a funes strlen() e strcpy(). Dados brutos tambm podem ser copiados com strcpy() inline, mas normalmente somente cpias de strings so precedidas por strlen(). Caso a varivel analisada seja usada como parmetro em uma chamada de funo de API, confirme na documentao da API se o parmetro equivalente aceita mesmo uma string. O exemplo compara o valor apontado por EDI com o caracter @, e move o valor em BL para a posio ESI da varivel String1, passada como parmetro funo. ESI possivelmente foi carregado com o tamanho de String1, e o cdigo faz com que o caractere em BL seja adicionado string.

Cdigo orientado a objetos


11 Cdigo orientado a objeto C++ 22 O ponteiro this normalmente passado atravs de ECX.

lea ecx, [esp+16] call rotina_membro


11 Tabelas virtuais, ou VTables, so comuns em C++

mov eax, esi push 0x100 call dword ptr [eax+50]


11 Procure identificar os construtores/destrutores e rotinas de inicializao ao analisar programas em C++, pois eles podem ser teis. A anlise de cdigo orientado a objeto costuma confundir o analista, principalmente ao tentar
Engenharia Reversa de Cdigo Malicioso

identificar as funes a variveis membro de um objeto, e quando o mesmo instanciado. Como j vimos, o ponteiro this de um objeto geralmente passado uma funo membro atravs de ECX. Outra caracterstica, neste caso usada em cdigo C++, o uso de tabelas virtuais, onde o endereo da funo chamada armazenado em um array, e a chamada feita ao ndice desejado dentro dessa tabela.

74

Lgica branchless
11 Fluxo lgico do programa no conta com saltos ou desvios condicionais. 11 Compiladores evitam o uso de desvios condicionais quando possvel. 11 A maioria dos pares CMP/JMP podem ser convertidos em uma sequncia de operaes aritmticas. 22 O uso da instruo SBB um indicador tpico. 11 O cdigo resultante roda muito mais rpido, mas no to legvel.

O processo de deciso de fluxo muito custoso em assembly. Por isso, em alguns casos os compiladores escolhem utilizar uma lgica sem desvios. Neste caso, os flags da CPU so usados para controlar o fluxo do programa. O uso da instruo SBB um indicador tpico de que o compilador escolheu usar lgica branchless no cdigo. Geralmente ela substitui casos simples de estruturas IF/THEN.

cmp eax, 1 sbb eax, eax inc eax pop esi pop ebx retn
11 CMP EAX, 1 vai setar o flag CF se EAX for 0. 11 SBB EAX, EAX faz EAX= EAX - (EAX+CF). 11 Portanto, se EAX=0, logo EAX = 0 - (0+1) = -1. 11 Se EAX maior que zero, ento EAX = EAX - EAX+0 = 0. 11 INC EAX torna os valores possveis de EAX iguais a 0 ou 1. Neste exemplo podemos ver o uso da instruo SBB para executar um cdigo que transforma o valor de retorno de uma funo em 0 ou 1.

cmp eax, 1 sbb eax, eax inc eax pop esi pop ebx 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()
Captulo 6 - Assembly bsico parte 2

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 como o cdigo assembly gerado e conhecer as diferenas entre os compiladores.

76

Engenharia Reversa de Cdigo Malicioso

Roteiro de Atividades 6
Atividade 6.1 Assembly bsico
Examine com o IDA Pro o arquivo \Desktop\malware\mal.Down.nopack.worm.exe. Identifique as estruturas vistas na sesso terica marcando a posio (Alt-M) e inserindo um comentrio (:) ao lado das que conseguir encontrar. Ao final, grave o arquivo IDB do IDA Pro (mal.Down.nopack.worm.idb) com as marcaes e comentrios.

Atividade 6.2 Reconhecimento de cdigos


Examine os cdigos de exemplo disponveis no CD do aluno, no diretrio Sesso 6\Exemplos. Abra os arquivos C em um editor de textos e os executveis correspondentes no IDA Pro. Para cada arquivo, encontre o cdigo assembly correspondente ao cdigo C apresentado, e insira os comentrios (:) e marcaes (Alt-M) conforme a atividade anterior.

Captulo 6 - Roteiro de Atividades

77

78

Engenharia Reversa de Cdigo Malicioso

7
Import Address Table
objetivos
Apresentar a tabela de importao e como podemos reconstru-la em caso de anlise de um arquivo compactado.

conceitos

Tabela de importao, reconstruo da tabela de importao.

Exerccio de fixao 1 e Tabela de importao


Como as informaes da tabela de importao podem ser teis durante a anlise de um cdigo malicioso?

Exerccio de nivelamento 1 e Tabela de importao


Por qual motivo os autores de cdigos maliciosos tentam obfuscar a tabela de importao?

Import Address Table


11 A tabela de endereos de importao (IAT) uma tabela com endereos dos smbolos importados. 11 Normalmente executveis escondem estes smbolos utilizando diversos truques para 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.

q
Captulo 7 - Import Address Table

dificultar a anlise.

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 difi culta tambm a ao do analista. Mas como em algum momento essas funes estaro mapeadas para uso do programa, possvel recuperar essa informao. Veremos a seguir exemplos desse tipo de tcnica, e formas de recuperar a informao de importao de funes. Para recriar essa tabela, podemos utilizar algumas tcnicas: 11 Procurar manualmente pela sequncia de comandos LoadLibrary/GetProcAddress 11 Procurar por hashes dos nomes e funes mais comuns 11 Procurar por assinaturas dos cdigos das funes 11 Ou ento podemos utilizar o prprio executvel para isso! Para recriar essa tabela, podemos usar as tcnicas descritas acima, que normalmente exigem muito trabalho. Mas conforme comentado, o programa realiza as chamadas a LoadLibrary/GetProcAddress em algum momento, ento basta esperar que esse momento ocorra, e recuperar o binrio da memria j com as funes mapeadas.

Reconstruo da IAT
11 Por que reconstruir a IAT? 11 Analisar um arquivo malicioso sem estes smbolos pode ser muito trabalhoso. 11 Existe um nmero de formas diferentes de se fazer isso. 11 Normalmente, necessrio executar o programa, para que o mapeamento de
Engenharia Reversa de Cdigo Malicioso

funes seja feito por ele. 11 Por isso, importante salvar o estado da sua mquina virtual antes, para no compromet-la. 11 Existem diversas ferramentas para isso. Veremos duas a seguir: 22 OllyDBG/OllyDump. 22 ImportRec. Para realizar a primeira atividade, vamos usar o OllyDBG, especificamente o plugin de dump de memria, para recuperar uma cpia do programa mapeado na memria.

80

A seguir, usaremos a ferramenta ImportRec para percorrer o programa e recuperar as 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.

Neste captulo aprendemos a recuperar informaes ofuscadas em um programa malicioso. Vimos tambm algumas rotinas de descompresso de executveis, e aprendemos a encontrar o OEP dos programas. Estas tcnicas servem para recuperar outros tipos de informao, como arquivos criptografados. Estude outros arquivos compactados, e os scripts do OllyDBG disponveis em: \Desktop\install\OllyDbg\OLLYSCRIPTS\ E treine sempre e o mximo que puder!

Captulo 7 -

81

82

Engenharia Reversa de Cdigo Malicioso

Roteiro de Atividades 7
Atividade 7.1 Recuperando a IAT com ferramentas
Primeira parte
1. Faa snapshot da mquina virtual; 2. Abra com o OllyDBG o arquivo: \Desktop\malware\mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dat 3. Encontre o OEP do cdigo descompactado, e pause a execuo do programa nesta instruo; 4. Faa um dump do processo deixando marcada a opo Rebuild Import. Para cada mtodo de reconstruo da IAT disponvel, faa um dump diferente; 5. Faa um relatrio descrevendo o que fez at agora, incluindo o processo para encontrar o OEP e para fazer o dump do programa.

Segunda parte
1. Execute o ImportRec, e depois execute o programa malicioso original (renomeie de .dat para .exe); 2. Escolha o programa malicioso em execuo no ImportRec, clique em IAT Autosearch, depois em Get Imports, e finalmente em Fix Dump. Escolha um dos arquivos dump feito na primeira parte; 3. Abra o arquivo gerado acima e os dois arquivos de dump da primeira parte no IDA Pro e examine as funes importadas e o cdigo analisado pelo IDA; 4. Verifique os arquivos com o LordPE para comparar as informaes sobre os arquivos gerados; 5. Faa um relatrio destacando as principais diferenas entre os mtodos utilizados e as funes detectadas:

6. Recupere o snapshot inicial, pois a mquina virtual foi comprometida.


Captulo 7 - Roteiro de Atividades

Atividade 7.2 Recuperando a IAT manualmente


Agora que j vimos como fazer a recuperao automaticamente, vamos entender o procedimento de recuperao manual.

Primeira parte
1. No OllyDBG, abra o arquivo \Desktop\Malware\mal.Banker.Upack.abrir-fotos.scr; 2. Descubra a rea de memria na qual o programa ser descompactado;

83

3. Execute o programa com F7 por um tempo, e monitore a rea de memria em que sero gravados os dados descompactados na janela de dump, para descobrir a rotina de descompresso; 4. Encontre o endereo do ltimo byte gravado para descobrir a instruo de sada da rotina de descompactao; 5. Descubra onde comea e onde termina a rotina de descompresso do Upack; 6. Faa um relatrio descrevendo os passos executados e os mtodos utilizados para a resoluo das questes acima. 7. Aps gravar o ltimo byte, o programa realiza uma operao modificando alguns bytes no cdigo descompactado. Possivelmente trata-se de um ltimo passo de desobfuscao do cdigo:

0093789E 009378A0 009378A1 009378A3 009378A5 009378A7 009378A9 009378AB 009378AD 009378AF 009378B1 009378B4 009378B6 009378B7

MOV AL,BYTE PTR DS:[EDI] INC EDI ADD AL,18 CMP AL,2 ^JNB SHORT 0093789E MOV EAX,DWORD PTR DS:[EDI] CMP AL,16 ^ JNZ SHORT 0093789E MOV AL,0 BSWAP EAX ADD EAX,DWORD PTR DS:[ESI+14] SUB EAX,EDI STOS DWORD PTR ES:[EDI] ^ LOOPD SHORT 0093789E

; Loop fixa cdigo

; mal_Bank.0093789E

; mal_Bank.0093789E

; fim do loop

Analise este cdigo com seus colegas e faa um relatrio com suas concluses.

84

Engenharia Reversa de Cdigo Malicioso

Segunda parte
1. Tente encontrar a posio de memria em que ficam armazenadas as DLLs e as funes que sero carregadas para recriar a tabela de importao. 2. Qual cdigo utilizado para executar essa operao? 3. O que acontece com o mapa de memria do processo aps carregar todas as DLLs?

4. Faa um dump do processo aps finalizar essa anlise. 5. Faa um relatrio descrevendo todos os passos executados nesta parte e os mtodos usados para encontrar as informaes. Entregue o dump acima junto com o relatrio.

Terceira parte
1. Voc consegue encontrar a chamada ao OEP do programa? Se encontrar, faa um dump do processo aps atingir o OEP. 2. Restaure o estado da mquina virtual para o snapshot inicial.

Atividade 7.3 Anlise esttica


Abra o mesmo arquivo da atividade anterior no IDA Pro. Encontre as partes de cdigo responsveis pela descompresso, reconstruo da IAT e OEP, comente (:) e marque (Alt+M).

Captulo 7 - Roteiro de Atividades

85

86

Engenharia Reversa de Cdigo Malicioso

8
Truques anti-engenharia reversa
objetivos
Apresentar tcnicas anti-debugging normalmente utilizadas e demonstrar tcnicas para deteco e bypass destas protees.

conceitos

Deteco de debugger, thread local storage, deteco de mquinas virtuais, structured exception handling.

Exerccio de fixao 1 e Protetores de cdigo


Qual o objetivo dos protetores de cdigo utilizados em artefatos maliciosos?

Exerccio de nivelamento 1 e Debugger


Por que alguns cdigos maliciosos utilizam tcnicas de deteco de debugger?

possvel a execuo de um cdigo antes do entry point?

11 Os autores de programas maliciosos utilizam compactadores e encriptadores para reduzir o tamanho dos arquivos, embaralhar o cdigo e dificultar a anlise. 22 Cdigo compactado passa a aparecer como dado, confundindo os disassemblers. 11 Algumas ferramentas usam tcnicas anti-debugger. 11 Existem centenas de compactadores. 11 OllyDBG tem dezenas de scripts para descompactar estes arquivos. Neste captulo, estudaremos algumas tcnicas usadas por autores de programas maliciosos

para tentar impedir a anlise ou dificultar a identificao do programa. Veremos como identificar essas tcnicas e algumas ferramentas e medidas que podem ser tomadas para contra atacar.

Captulo 8 - Truques anti-engenharia reversa

Truques anti-engenharia reversa

87

Os autores de programas maliciosos utilizam compactadores e encriptadores para reduzir o tamanho dos arquivos, embaralhar o cdigo e dificultar a anlise. Algumas ferramentas usam tcnicas anti debugger, como deteco de execuo passo a passo, modificaes das funes de tratamento de excees ou insero de funes de callback na tabela TLS. Existem centenas de compactadores, como UPX, PECompact, Yoda, tElock, ASPack, BurnEye, entre tantos outros. Este tipo de tcnica usada justamente porque os autores de programas maliciosos sabem que empresas de antivrus e de combate ao crime digital utilizam tcnicas de engenharia reversa para analisar o cdigo e descobrir as caractersticas que identificam o programa, e as aes tomadas quando um usurio infectado. Entre as tcnicas mais simples, podemos citar o uso de compactadores de executveis, ou ento tcnicas mais avanadas como deteco de debugger, modificao de excees, deteco de ambiente virtual, entre outras tcnicas. Veremos como usar as ferramentas estudadas at agora para reverter essa situao e analisar qualquer tipo de programa malicioso.

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 comporta mento ou mesmo interromper seu funcionamento se conseguem detectar o debugger. Eles podem realizar essa operao de diversas formas, e implementar verificaes peridicas para dificultar ainda mais o trabalho do analista. A biblioteca do sistema Kernel32.dll possui uma funo chamada IsDebuggerPresent() que retorna verdadeiro caso o programa esteja sendo executado ao mesmo tempo que
Engenharia Reversa de Cdigo Malicioso

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

Podemos descrever ainda a tcnica de utilizao de timers para identificar pausas na execuo de um programa. Quando o programa executado em modo passo a passo ou pausado por um debugger, o relgio do sistema continua contando os segundos da mesma forma. Um programa pode usar essa caracterstica para identificar se determinada parte do cdigo executada em um tempo razovel. Assim, se o cdigo deveria ser executado em 1 segundo, mas demorou 5 segundos para rodar, o programa pode achar que foi executado em modo passo a passo, e parar seu funcionamento. Vimos um exemplo de como isso poderia ser feito.

Exerccio de fixao 2 e Entry point


possvel executar um cdigo antes do entry point do arquivo?

Execuo de cdigo antes do Entry Point


11 Existem formas de executar cdigo antes que um debugger assuma a execuo 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 programa no entry point.
Captulo 8 - Truques anti-engenharia reversa

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.

Thread Local Storage


Funcionamento da tcnica do Thread Local Storage (TLS): 11 Utilizada para alocar informaes sobre threads. 11 A estrutura importante no TLS a IMAGE_TLS_DIRECTORY.

89

11 Dentro dessa estrutura, existe um campo importante: AddressOfCallBacks. 11 Ele aponta para uma lista de funes de callback. 11 Estas funes podem ser executadas no momento da inicializao do arquivo PE na memria, antes de executar o entry point.

Inserir cdigo como uma funo de callback no TLS permite executar cdigo antes do entry point do programa. Isto permite descompactar, decriptografar, ou mesmo modificar o cdigo de forma a confundir quem tentar analis-lo. O IDA Pro detecta estas funes de callback e as oferece como entry points alternativos. Para visualiz-los, pressione Control+E.

Cdigos no alinhados
11 JUMP ou CALL no meio de uma funo. 11 Criptografia ou compactao de executvel. 11 Otimizaes do compilador. 11 Virtualizao de cdigo. 11 Vulnerabilidades. Outra tcnica usada pelos autores de malware inclui truques de controle de fluxo do pro grama, com JUMPs e CALLs para endereos intermedirios de cdigo. Estas tcnicas no modificam realmente o fluxo do programa, mas so truques de instrues assembly, que

apenas dificultam a visualizao do cdigo, mas que durante a execuo, permitem ao pro grama executar normalmente seu fluxo. No exemplo, vemos uma chamada a um endereo intermedirio (CALL near ptr loc_AE0007+3), que na verdade equivale a um CALL a um ende reo no identificado pelo IDA. Examinando o cdigo da Figura 8.1 percebe-se que o CALL cairia no meio do comando JMP NEAR PTR 460b04F7h em 0x00AE0007. Alm desta tcnica, o uso de compressores e protetores de executveis, otimizaes do compilador, virtualizao de cdigo (como as usadas pelo compactador Themida e pelo protetor ExeCrypter) e shellcodes que exploram vulnerabilidades, entre outras, dificultam muito ou tornam impossvel a leitura do cdigo assembly. Nestes casos, o analista vai ter um trabalho muito grande para identificar os truques usados, e quase sempre o trabalho no poder ser replicado para outros arquivos.

90

Engenharia Reversa de Cdigo Malicioso

.aspack:00AE0000 _aspack .aspack:00AE0000 .aspack:00AE0000 .aspack:00AE0000 .aspack:00AE0001

segment para public DATA use32 assume cs:_aspack ;org 0AE0000h db 90h ;

.aspack:00AE0001 ; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||| .aspack:00AE0001 .aspack:00AE0001 .aspack:00AE0001 .aspack:00AE0001 start .aspack:00AE0001 .aspack:00AE0002 .aspack:00AE0007 .aspack:00AE0007 loc_AE0007: .aspack:00AE0007 .aspack:00AE0007 start .aspack:00AE0007 .aspack:00AE0007 ; ----------------------------------------------------------.aspack:00AE000C .aspack:00AE000D
Figura 8.1 Truques de controle de fluxo do programa.

public start proc near pusha call near ptr loc_AE0007+3 ; CODE XREF: start+1p jmp endp near ptr 460B04F7h

db

55h ; U

db 0C3h ; +

Modificaes no cabealho PE
11 Valores invlidos. 11 Valores de ImageBase invlidos. 11 Dados invlidos em LoaderFlags e NumberOfRvaAndSizes. 11 Tamanho excessivo em SizeOfRawDataValues. 11 Tcnicas de realocao: 22 Realocao serve para modificar ponteiros no cdigo, caso a base da imagem seja realocada na memria. 22 Pode-se usar essa caracterstica para modificar praticamente qualquer dado. 22 Abusando desta tcnica, um autor de programa malicioso pode modificar todo seu cdigo antes do programa ser carregado. Outra tcnica de autores de malware utiliza caractersticas dos arquivos PE para dificultar o carregamento do arquivo em programas de debugger e obfuscar o cdigo. Algumas anlise simplesmente no conseguem abrir tais arquivos, apesar de o sistema operacional abri-los normalmente e ignorar os valores invlidos. Outra tcnica usada a realocao de cdigo. Esta tabela, presente no cabealho PE, permite ao programa trocar alguns bytes do seu cdigo, antes do incio da execuo, para

possibilitar a realocao do endereo base do programa. Dessa forma, ele poder trocar os offsets de algumas chamadas, para refletir o novo endereo base. Examine o arquivo \Desktop\malware\mal.Down.crypt.winss.jpg no LordPE, e veja a tabela de realocao nos diretrios do programa. Veja que as realocaes indicam o endereo original do dado (RVA e Offset), e para onde ele vai ser realocado (Far Address).

Captulo 8 - Truques anti-engenharia reversa

entradas no cabealho PE aceitam valores no padronizados, e algumas ferramentas de

91

Usando essa tcnica, o autor do programa malicioso consegue modificar cdigo (veja as realocaes de funes, que comeam com os bytes 55 8B EC A1 0A 5A), dificultando a ao de anlise automtica do binrio.

Structure Exception Handling


Structured Exception Handling (SEH): 11 Esta tabela mantm um registro de funes executadas quando coisas ruins acontecem. 11 Por exemplo, podemos registrar uma funo para tratar divises por 0. 11 Quando ocorre uma exceo, a cadeia SEH percorrida para encontrar uma funo apropriada. 11 Um autor de programa malicioso pode instalar uma funo de tratamento de exceo, que pode ser usada para modificar o cdigo. 11 Exemplo: PECompact2. A estrutura SEH permite ao programa executar funes especficas quando ocorre alguma exceo durante a execuo normal do cdigo. Estas funes podem ser registradas pelo

programa, e sempre que ocorrer uma exceo, a lista de funes registradas ser chamada, e aquela que puder tratar a exceo em questo, ser executada. Compiladores visuais como Visual C e Delphi usam essa estrutura para instalar funes de controle dos formulrios, botes e outros tipos de objetos visuais usados no programa. Alm disso, ferramentas como o compressor PECompact2 usam esse tipo de estrutura para obfuscar o cdigo gerado. No exemplo, vemos como ocorre a instalao de uma funo para tratar excees, que na verdade usada para desviar o controle do fluxo do programa, pois logo 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.

CODE:00401000 ; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||| CODE:00401000 CODE:00401000 CODE:00401000


Engenharia Reversa de Cdigo Malicioso

public start proc near mov push push mov xor mov eax, offset sub_469830 ; endereco da funcao de excecao eax large dword ptr fs:0 large fs:0, esp ; instala a excecao no SEH eax, eax [eax], ecx ; EAX == 0 ; Segmentation fault! Dispara excecao

CODE:00401000 start CODE:00401000 CODE:00401005 CODE:00401006 CODE:0040100D CODE:00401014 CODE:00401016 CODE:00401018 aPecompact2 CODE:00401023 CODE:00401024 CODE:00401025

CODE:00401016 ; -----------------------------------------------------------------------db PECompact2,0 db 0AFh ; >> db 7Eh ; ~ db 0CEh ; +

92

Exerccio de fixao 3 e Ambiente virtualizado


Um cdigo malicioso pode ter um comportamento diferente dentro de um ambiente virtualizado?

Deteco de mquinas virtuais


Deteco de VMWare: 11 Alguns programas maliciosos detectam o VMWare e podem modificar seu comportamento. 11 Instrues privilegiadas. 11 Instruo SIDT e Interrupt Descriptor Table Register (IDTR). 22 http://invisiblethings.org/papers/redpill.html 11 Diretrios ou chaves de registro. 11 Algumas tcnicas podem ajudar, como desabilitar a acelerao da VM ou no instalar o VMWare Tools. 11 Algumas pessoas j chegaram a editar o binrio do VMWare para modificar nomes de dispositivos tpicos. Durante este curso, vimos que analisar um binrio dentro de um ambiente virtual pode facilitar o trabalho, alm de ser uma maneira mais segura do que fazer a anlise em uma mquina real. Mesmo assim, como j foi comentado antes, o analista precisa estar ciente de que um ambiente virtual, por mais que parea seguro, pode ser detectado e explorado, prejudicando a anlise ou at mesmo comprometendo o sistema hospedeiro.

Existem diversos programas maliciosos e ferramentas que exploram vulnerabilidades na forma como as mquinas virtuais so implementadas. Alguns programas conseguem detectar o VMWare, por exemplo, e modificar seu funcionamento ou simplesmente terminar a execuo. A deteco pode ser feita por diversos mecanismos, como os exemplos listados. O problema com mquinas virtuais criadas pelo VMWare que em algum momento, elas precisam ter uma interao com o sistema hospedeiro, e essa interao pode ser detectada de dentro do sistema virtual. Por isso, existem algumas tcnicas que podem ser usadas para tentar diminuir a ocorrncia deste tipo de deteco. A instalao do VMWare Tools, por exemplo, instala uma srie de ferramentas e chaves de registro que so facilmente detectadas por um programa malicioso. Outra forma de evitar a deteco desabilitar a acelerao do processador da mquina virtual. Essa acelerao faz com que certas instrues no sejam emuladas pelo VMWare, e sim passadas diretamente CPU. Para isso, o VMWare instala no sistema virtual uma interrupo que chamada a cada instruo. Essa interrupo pode ser detectada por um programa que esteja rodando no sistema virtual. Ao desabilitar a acelerao, todas as instrues passam a ser emuladas, tornando o sistema mais lento, mas dificultando a deteco. Em casos mais extremos, onde o programa malicioso detecta o VMWare atravs da enumerao de dispositivos, algumas pessoas chegaram a editar o binrio do VMWare para modificar o nome destes dispositivos, e impedir o uso desse mtodo de deteco.
Captulo 8 - Truques anti-engenharia reversa

93

Tcnicas anti-engenharia reversa


11 Apesar de todas as dificuldades apresentadas, as ferramentas apresentadas tm capacidade de combater tcnicas anti-engenharia reversa. 11 O IDA Pro, por carregar o binrio para um banco de dados, e no execut-lo, permite o carregamento de quase todos os binrios que for analisar. 11 Lembre-se: para cada tcnica usada pelos autores de programas maliciosos, sempre ser possvel desenvolver uma tcnica contrria! Lembramos que mesmo com todas as dificuldades, a escolha correta das ferramentas permite a anlise de praticamente qualquer binrio. Os plugins do OllyDBG so de grande ajuda para analisar alguns arquivos protegidos por

tcnicas de obfuscao, valores invlidos em estruturas, tcnicas de identificao de debugger etc. Habilite todas as opes do plugin Olly Advanced, Hide Debugger e do IsDebuggerPresent e Hide Caption, para que voc possa analisar at os programas mais problemticos. Um plugin alternativo do Olly o Phant0m. Com algumas protees a mais, esse plugin permite analisar binrios compactados com Themida ou ExeCryptor. Para utilizar o plugin Phant0m (com um zero), necessrio marcar a opo Expand plugin limit to 127 plugins no Olly Advanced. Depois disso, basta renomear o arquivo Phant0m.dl_ no diretrio do Olly e reinici-lo. Finalmente, importante lembrar que toda tcnica de obfuscao de cdigo pode ser quebrada e revertida de algum modo, dependendo da capacidade do analista e das ferramentas que utiliza, e do tempo que se quer investir nessa tarefa.

94

Engenharia Reversa de Cdigo Malicioso

Roteiro de Atividades 8
Atividade 8.1 Deteco de debugger
1. Execute o arquivo \Desktop\malware\IsDebuggerPresent.exe. O que acontece?

2. Abra o arquivo no IDA Pro, e execute novamente. Alguma coisa mudou?

3. Procure pela funo que detecta o debugger; 4. Remova esta proteo usando o OllyDBG; 5. Faa um relatrio explicando o que aconteceu nas duas execues, e como voc fez para remover a proteo, com a parte do cdigo relevante comentada; 6. Faa um dump do programa corrigido.

No OllyDBG, basta digitar qualquer caractere na linha que deseja mudar, e ele insere estes caracteres nessa linha.

Atividade 8.2 Thread Local Storage


1. Abra o arquivo \Desktop\malware\tls.exe no IDA Pro. 2. Marque um breakpoint na funo Start e execute. O que aconteceu?

3. Encontre a funo executada antes do entry point ; 4. Marque um breakpoint e execute novamente. E agora? 5. Comente e marque o cdigo relevante no IDA, incluindo o local onde essa funo chamada. 6. Discuta com seus colegas como combater este tipo de tcnica. Escreva um relatrio com
Captulo 8 - Roteiro de Atividades

o resultado das execues acima e suas concluses sobre a discusso.

Atividade 8.3 Cdigos no alinhados


1. Abra o arquivo \Desktop\malware\mal.Banker.aspack.ActiveX.exe no IDA Pro; 2. Identifique as partes do cdigo que usam tcnicas anti-debugger (comentrios no IDA); 3. Modifique o banco de dados do IDA para mostrar o fluxo correto do programa; 4. Procure na internet por uma anlise sobre o compressor usado, e comente no IDA os pontos do cdigo que fazem a descompactao do arquivo;

95

5. Com o OllyDBG, encontre o entry point original e descompacte o programa (como vimos no Captulo 7). Faa um dump do binrio. 6. Faa um relatrio descrevendo os passos executados neste exerccio, o arquivo .IDB gerado pelo IDA e o binrio extrado com o Olly, com uma descrio das informaes importantes encontradas no binrio.

Atividade 8.4 Structured Exception Handling


1. Abra o arquivo \Desktop\malware\mal.Down.PECompact.WindowsUpdate.exe no OllyDBG; 2. Identifique as partes do cdigo que usam a tcnica de SEH (comentrios no Olly); 3. Procure na internet por uma anlise sobre o compressor usado. Comente no Olly os pontos do cdigo que fazem a descompactao do arquivo; 4. Encontre o entry point original e descompacte o programa (como visto no Captulo 7). Faa um dump do binrio; 5. Faa um relatrio com os passos executados nesta atividade, o binrio extrado com o Olly, e com uma descrio das informaes importantes encontradas no binrio.

96

Engenharia Reversa de Cdigo Malicioso

9
Anlise de um worm
objetivos
Apresentar um roteiro de anlise e pontos importantes durante a anlise de um cdigo malicioso, assim como tcnicas de deteco das principais funcionalidades.

conceitos

Emulao, anlise de strings, anlise da tabela de importao, visualizao grfica, anlise de backtrace.

Exerccio de nivelamento 1 e Anlise de strings


Por que a anlise das strings encontradas no executvel pode facilitar o processo de identifi cao de funes de um cdigo malicioso?

A aplicao de assinaturas de cdigo ao IDB pode facilitar a anlise? Por qu?

Descobrindo o bsico
Roteiro de engenharia reversa: 11 Comece sempre pelo mais simples: 22 Strings. 22 Funes importadas. 22 Aplicao de assinaturas.

11 Passe rapidamente pelo binrio nomeando as funes mais bvias. 11 Se necessrio, identifique strings obfuscadas. 11 Examine o backtrace de funes importadas. 22 Quem as utiliza? 22 Quais parmetros so passados?

Captulo 9 - Anlise de um worm

11 Examine o grfico de chamadas e nomes de estruturas identificadas automaticamente.

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: 11 Como ele se espalha? 22 Por e-mail? Como so enviados? 22 Por rede? Compartilhamentos ou redes P2P? 22 Ele explora alguma vulnerabilidade? 11 Ele contm um backdoor? 22 Qual porta aberta?
Engenharia Reversa de Cdigo Malicioso

22 Ele conecta em algum lugar? 11 Que modificaes so feitas no sistema? 22 Quais arquivos so criados? 22 Quais chaves de registro so criadas? 11 Existe alguma data especial? 22 Existe alguma data para ativar uma atividade especfica? Analisar o binrio simplesmente por analisar no eficiente. Tenha em mente perguntas especficas que queira responder. Existem tpicos mais genricos com os quais devemos nos preocupar ao analisar um programa malicioso. Pense nessas perguntas, escolha a melhor sequncia de aes para respond-las, e fique focado em seu objetivo.

98

Analisar um binrio desconhecido pode ser to complexo que o analista poderia levar meses realizando essa tarefa. Se seu objetivo somente identificar formas de se proteger contra tal praga, no necessrio analisar todo o cdigo, funo por funo.

Exerccio de fixao 1 e Identificao do cdigo


Quando no for possvel identificar o cdigo, como podemos proceder?

Emulao
11 Plugin X86Emu para IDA Pro Free disponvel em: 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 ou criptografia de um dado, pode executar somente aquela parte do cdigo. Basta iden 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.
Captulo 9 - Anlise de um worm

tificar corretamente os registradores utilizados pelo cdigo, os parmetros que a funo

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.

99

Durante estes dois captulos, usaremos um arquivo criado no Roteiro de Atividades 7, em que vimos como descompactar um arquivo UPX e realizar o dump do processo em memria para um arquivo. este arquivo descompactado que iremos usar em nossos exemplos. Se voc no guardou o resultado daquela sesso, deve faz-lo agora, e guardar o arquivo em um diretrio fora da mquina virtual, para poder restaur-la a um estado sadio. Ao abrir o arquivo no IDA Pro, perceba que o programa realiza uma anlise prvia do arquivo e identifica uma parte de cdigo (em azul) e muitas reas de dados (em cinza). Utilizando o navegador para examinar essas regies em cinza, voc poder ver que estas reas quase sempre correspondem a strings usadas pelo programa. Ao examinar a aba de strings do IDA, possvel identificar diversos textos caractersticos de mensagens de e-mail, nomes de usurios, comandos de comunicao com o servidor SMTP, entre outras mensagens.
Address Length Type String C C C C C C C C C C C C C C C C C C C C C C C %s.zip html %d%d%d%d ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345... X-Pririty: Normal\r\nX-Mailed: Microsoft Outlook Expr... Content-Type: multipart/mixed;\r\n\tboundary=\%s\\r\n \r\nMINE-Version: 1.0\r\n Date: Subject:%s\r\n To:%s\r\n From:%s\r\n ----=_%s_%.3u_%.4u_%8.X.%8.X NextPart \r\n\r\n--%s--\r\n\r\n --%s\r\nContent-Type: application/octet-stream;\r\n\tname=\%s\\\r\nCont... inline \r\n\r\n\r\n --%s\r\nContent-Type: text/plain;\r\n\tcharset=us-ascii\r\nContent-Transfer-... This is a multi-part message in MINE format \r\n\r\n QUIT\r\n \r\n.\r\n DATA\r\n RC%s0:<%s>\r\n PT T

....UPX0:0... 00000007 ....UPX0:0... 00000005 ....UPX0:0... 0000000C ....UPX0:0... 00000041 ....UPX0:0... 0000009B ....UPX0:0... 00000031 ....UPX0:0... 00000016 ....UPX0:0... 0000000 ....UPX0:0... 0000000E ....UPX0:0... 00000009 ....UPX0:0... 0000000B ....UPX0:0... 0000001D ....UPX0:0... 00000009 ....UPX0:0... 0000000F ....UPX0:0... 0000008B ....UPX0:0... 00000007 ....UPX0:0... 00000007 ....UPX0:0... 00000031 ....UPX0:0... 00000007 ....UPX0:0... 00000006 ....UPX0:0... 00000007 ....UPX0:0... 0000000D ....UPX0:0... 00000005

....UPX0:0... 00000058 C

Engenharia Reversa de Cdigo Malicioso

Funes importadas
11 Quais funes usam essas chamadas? 11 Tente identificar a funcionalidade delas. 11 Voc consegue encontrar os parmetros passados? Outra forma de descobrir rapidamente os objetivos de uma funo examinando as chamadas a bibliotecas importadas. Estas chamadas geralmente permitem identificar os parmetros passados e a operao que as funes tentam executar.

Figura 9.1 Aba de strings do IDA.

Uma maneira simples de realizar essa operao no IDA examinar a aba de funes importadas e acessar a rea do disassembly onde elas esto localizadas. A partir de cada funo, basta usar os comandos de referncias cruzadas e identificar as funes que fazem chamadas a essas funes importadas.

100

Procure identificar todas as funes chamadas, pois elas fornecem uma tima indicao do funcionamento do programa.

Address 00501004 00501008 0050100C 00501010 00501014 0050101C 00501020 00501024 00501028 0050102C 00501030 00501034 00501038 0050103C 00501040 00501044 00501048 0050104C 00501050 00501054 00501058 0050105C
Figura 9.2 Aba funes importadas do IDA.

Name RegOpenKeyExA RegSetValueExA RegQueryValueExA RegEnumKeyA RegCreateKeyExA FindClose GetFileSize FindNextFileA MapViewOfFile UnmapViewOfFile FileFirstFileA GetEnvironmentVariableA GetDriveTypeA GetSystemTime WriteFile CreateFileMappingA LoadLibraryA CreateProcessA GlobalAlloc GetLastError CreateMutexA IstrcatA GetFileAttributesA CopyFileA DeleteFileA

Library ADVAPI32 ADVAPI32 ADVAPI32 ADVAPI32 ADVAPI32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32 kernel32

00501060 00501064 00501068

Assinaturas de cdigo
Aplicao de assinaturas: 11 Use assinaturas para identificar automaticamente funes de bibliotecas padro. 11 Compiladores visuais costumam inserir muitas funes de controle de objetos que no precisam ser analisadas. Infelizmente, nem sempre elas so teis. Alm de funes importadas de DLLs do sistema, um programa pode conter cdigo padro

inserido pelos compiladores, ou pode ter sido compilado estaticamente com suas bibliotecas. Neste caso, essas funes estaro misturadas ao cdigo inserido pelo autor do programa. Exemplos desse tipo de cdigo so inseridos por compiladores visuais (Visual C, C++ Builder, Delphi). Eles inserem funes de manuteno dos controles usados no formulrio.
Captulo 9 - Anlise de um worm

Para distingui-las do cdigo inserido pelo autor, e evitar o trabalho de analis-las, usaremos as assinaturas do IDA. Normalmente essas assinaturas esto associadas a um compilador especfico. Descobrir no cdigo qual foi o compilador usado pode ser muito til. Por exemplo, programas compilados com compiladores visuais da Borland tendem a apresentar diversas strings referenciando chaves de registro com o nome Borland. Isto pode ser uma indicao de que este compilador foi usado. Mesmo assim, s vezes difcil identificar o compilador, como o caso do programa analisado. Neste caso, o analista dever inserir todas as assinaturas que achar provveis, e ver quais delas identificam cdigo.

101

File d3vcl b32vcl bcb5rt bds8vcl bcb5rt c4vcl d4vcl d5vcl bds2006 bds2007 bds40 msmfc2 bds bds exe bh32ocf bh32dbe bh32rw32 bp32_2 msddk32 pe

State Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied Applied

7 3 3 3 3 2 2 2 2 2 2 1 1 1 1 0 0 0 0 0 0

Library name Delphi 3 Visual Component Library Borland Visual Component Library & Packages CBuilder 5 runtime BDS2008 Component Library & Packages CBuilder 5 runtime CBuilder 4 and Delphi 4 VCL Delphi 4 Visual Component Library Delphi 5 Visual Component Library Delphi2006/BDS2006 Visual Component Library Codegear Rad Studio 2007 Visual Component Library BDS 4.0 RTL and VCL MFC32 WinMain detector BDS 2005-2007 and Delphi6-7 Visual Component Library BDS 2005-2007 and Delphi6-7 Visual Component Library Startups of EXE/COM files Borland OCF 32 bit Borland DBE 32 bit BCC v4.x/5.x & BCB v1.0/v7.0 BDS2006 win32 runtime Borland Delphi/C++Builder VCL DDK Windows 32bit 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 con centram as chamadas, nas pontas do grfico.

Figura 9.3 Uso das assinaturas do IDA.

Aps identificar algumas funes usando os mtodos descritos at agora, o analista comea a ter uma ideia das funcionalidades do programa. Ele j pode tentar visualizar as referncias cruzadas e descobrir quais funes chamam ou so chamadas pelas que foram identificadas at o momento. Para isso, os grficos de chamada podem ser teis. Por exemplo, se o analista optar por usar uma metodologia de pesquisa top-down, poder usar os grficos de referncias cruzadas editveis para criar grficos mais especficos. Por exemplo, para gerar um grfico com as funes chamadas a partir da funo Start, com dois nveis de recurso, o analista pode mudar a opo Recursion Depth para 2, desmarcar a opo Cross Reference To e, se quiser, desmarcar a opo Ignore Data e
Engenharia Reversa de Cdigo Malicioso

marcar a opo Print Comments. No grfico, duas funes de bibliotecas e duas funes desconhecidas so chamadas a partir do entry point, sendo que uma dessas ltimas chama diversas outras funes desconhecidas. Voc pode escolher analisar a mais simples primeiro, ou partir para a identificao da funo que chama as demais funes do programa.

102

public start start var_298 ThreadId proc near = dword ptr -298h = dword ptr -108h push mov sub lea push push call call push lea push push call push call add push call ebp ebp, esp esp, 298h eax, [ebp+var_298] eax 101h dword_50116C sub_5033A8 108h eax, [ebp+ThreadId] 0 eax memset eax sub_5031E4 esp, 10h 0 ExitProcess
start

; CODE XREF:

; int ; void * ; ThreadId

; uExitCode

sub_5033AB

ExitProcess

sub_5031E4

GetTickCount

sub_503384

sub_50511C

Create Thread

sub_504C09

Sleep

sub_502C90

sub_505658

sub_502E50

sub_502D8E

StartAddress

sub_502F80

sub_50315C

sub_504C18

sub_5075E5

...

...

... memset

...

...

...

...

...

...

__imp_memset

103

Captulo 9 - Anlise de um worm

Exerccio de fixao 2 e Identificao do cdigo II


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?

Figura 9.4 Chamada de funes de biblioteca e funes desconhecidas.

Anlise de backtrace
Verificar backtrace de funes importadas: 11 Navegue at a rea de funes importadas. 11 CTRL-X abre janela de referncias para uma funo. 11 Identifique como o cdigo faz a chamada funo importada.

A anlise do cdigo atravs de backtrace (anlise reversa) das funes importadas permite ao analista descobrir rapidamente funes que fazem uso das funes importadas de DLLs. Para encontrar o cdigo que faz referncia s funes importadas, voc deve procurar pela regio onde estas funes esto armazenadas no cdigo, e usando o atalho Control+X, descobrir os cdigos que fazem referncia quela funo. Esta tcnica vale tambm para tentar descobrir as partes do cdigo que usam a funo analisada. No exemplo, observamos que uma referncia funo RegOpenKeyExA() usada para criar uma chave no registro. O texto passado como parmetro funo no aparece na lista de strings, pois cada caractere foi passado individualmente para o Stack, e dessa forma a string nunca aparece inteira no cdigo. Esta uma tcnica que os autores de programas maliciosos usam para dificultar a identificao de caractersticas do cdigo. No exemplo, os caracteres referentes chave de registro criada so normalmente apresentados em bytes hexadecimais. Para transformar bytes em caracteres, selecione o byte e pressione R.

104

Engenharia Reversa de Cdigo Malicioso

mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov mov call test jz lea

[ebp+var_20], u [ebp+var_1F], r [ebp+var_1E], r [ebp+var_1D], e [ebp+var_1C], n [ebp+var_1B], t [ebp+var_1A], V [ebp+var_19], e [ebp+var_18], r [ebp+var_17], s [ebp+var_16], i [ebp+var_15], o [ebp+var_14], n [ebp+var_13], \ [ebp+var_12], R [ebp+var_11], u [ebp+var_10], n [ebp+var_f], bl [ebp+ValueName], J byte ptr [ebp-0Bh], a [ebp+var_A], v [ebp+var_9], a [ebp+var_8], V [ebp+var_7], M [ebp+var_6], bl esi ; RegOpenKeyExA eax, eax short loc_5030C2 eax, [ebp+hkey]

Figura 9.5 Referncia funo RegOpenKeyExA.

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.

105

Captulo 9 - Anlise de um worm

SaveCurrentTime proc near call mov retn SaveCurrentTime endp GetTickCount

; CODE XREF: start+1Bp

ds:nSavedCurrentTime, eax ; EAX contem o valor de retorno de GetTickCount()

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

RandomNumberGenerator proc near mov imul add mov mov retn RandomNumberGenerator endp eax, 343FDh eax, 269EC3h

; CODE XREF: sub_5031E4+57p ; Multiplica por um numero grande ; adiciona a outro numero grande

eax, ds:nSavedCurrentTime ; Usa SavedCurrentTime

ds:CurrentSavedTime, eax ; Salva em uma variavel ax, word ptr ds:nSavedCurrentTime+2 ; Copia 2 bytes do SavedCurrentTime ;para AX (parte de EAX)

Anlise de cdigo
Agora a sua vez! Consegue chegar at aqui?

Figura 9.6 Identificao de funes bsicas.

Function CheckfPunctuation CompareStringsWithTable CompareTwoStrings CreateRegKeyMutex CreateRegKeyRun CreateSystemMutex CreateTempFile FindOutlookIEWindow FindOutlookAddressBook GenerateRandomEmailID GenerateTimestamp GetInternetConnectionState MainThread RandomNumberGenerator
Engenharia Reversa de Cdigo Malicioso

Segment UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0 UPX0

Length 00000022 00000036 00000030 000000FE 00000140 000000C2 00000160 0000003F 00000124 00000016 000000DD 00000077 0000009C 0000004A 0000001C 00000088 0000000C 0000002C 00000006 00000006 0000004A 00000168 000000E6 0000009C

R R R R R R R R . R R R R R R R R R R R R . R R R

F . . . . . . . . . . . . . . . . . . . . . . . .

L . . . . . . . . . . . . . . . . . . . . . . . .

S . . . . . . . . . . . . . . . . . . . . . . . .

B . . B B B B B . B . B B B B . B . . . . B B B .

T . . . . . . . T . . T . T . . . . T T T . T T .

= . . . . . . . . . . . . . . . . . . . . . . . .
Figura 9.7 Anlise de cdigo.

MaybeConvertStringToLowercase UPX0 RegisterProcessAsService SaveCurrentTime SendMsgToOutLookAndIE memcpy memset start sub_5034BB sub_503697 sub_50377D

106

No prximo captulo, comearemos a descrever as caractersticas gerais do programa, seus mtodos de ao, as informaes que podem ser usadas para identificar pragas na rede e as caractersticas do programa que permitem a criao de mtodos de proteo contra novas infeces.

107

Captulo 9 - Anlise de um worm

108

Engenharia Reversa de Cdigo Malicioso

Roteiro de Atividades 9
Atividade 9.1 Strings
1. Abra o arquivo mal.upx.6dddd7e8e5ff88a15b7884a833ff893b.dumped.dat criado no Roteiro de Atividades do Captulo 7; 2. Examine as strings contidas no executvel; 3. Encontre e analise pelo menos trs funes que usem estas strings; 4. Examine as funes que utilizam essas strings, e tente identificar como elas funcionam; 5. Use os comentrios no cdigo e renomeie as variveis e nomes de funo de acordo com o que encontrar.

Atividade 9.2 Funes importadas


1. Examine as funes importadas pelo programa; 2. Encontre e analise pelo menos trs funes que utilizem estas chamadas a bibliotecas.

Atividade 9.3 Assinatura de cdigo


1. Aplique as assinaturas que achar relevantes ao cdigo; 2. Identifique aquelas que foram teis, e determine quantas funes de biblioteca foram reconhecidas; 3. Faa um breve relatrio com suas concluses sobre a aplicao de assinaturas neste caso especfico.

Atividade 9.4 Visualizao grfica


1. Tente identificar e analisar as funes bsicas a partir do incio (top-down); observe que uma nica funo chama diversas outras. Ateno para ela! 2. Identifique as funes chamadas a partir do entry point e pelo menos trs chamadas a partir de sub_5031E4; 3. Se ainda houver tempo, identifique mais funes.

109

Captulo 9 - Roteiro de Atividades

Atividade 9.5 Anlise de backtrace


1. Navegue at a rea de funes importadas (em rosa no navegador); 2. D CTRL-X para abrir a janela de referncias para uma funo; 3. Identifique como o cdigo faz a chamada funo importada, para identificar e analisar pelo menos cinco funes do programa.

Atividade 9.6 Funes bsicas


1. Comece pelas funes do entry point e por aquelas que utilizam funes importadas; 2. Lembre-se de comentar o cdigo e renomear funes e variveis (selecione o nome e use N); 3. Use F12, CTRL-SHIFT-F e CTRL-SHIFT-T para examinar o grfico de fluxo e grfico de chamadas das funes que analisar. Algumas vezes isso ajuda a entender o funcionamento do cdigo; 4. Identifique pelo menos trs funes bsicas nas pontas do grfico de chamada do programa.

110

Engenharia Reversa de Cdigo Malicioso

10
Anlise do worm MyDoom
objetivos
Aplicar o conhecimento adquirido durante em uma anlise de uma ameaa real, descobrindo suas principais funcionalidades, assim como detectar funes escondidas dentro do cdigo.

conceitos

Worm MyDoom, formas de propagao, infeco do sistema, deteco de backdoor, script IDC.

Exerccio de nivelamento 1 e Anlise de backtrace


Como podemos identificar a funo de criao de mutex de sistema utilizando anlise de backtrace? Por onde comear?

Que forma este worm utiliza para se manter ativo no sistema aps o boot?

Anlise do MyDoom
O malware que estamos analisando uma variante do MyDoom. Temos que responder a algumas perguntas: 11 Como ele se propaga?

q
Captulo 10 - Anlise do worm MyDoom

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.

111

O programa que analisamos uma variante do worm MyDoom. Precisamos agora responder as perguntas propostas, identificando funes especficas que possam nos ajudar a respond-las. Como adotamos uma abordagem de analisar primeiramente as funes mais bvias, temos agora uma parte das funes identificadas e uma viso geral de como esto distribudos os dados e cdigos do programa. O prximo passo juntar todas essas funes em mdulos maiores que descrevam o funcionamento completo do programa. Para criar uma marca no IDA Pro, posicione o cursor na posio desejada e pressione Alt+M. Para navegar pelos marcadores, use Control+M.

Exerccio de fixao 1 e Aplicando os conhecimentos


Como poderamos aplicar os conhecimentos adquiridos em uma anlise completa de um artefato malicioso? Por onde comear?

Como ele se propaga?


11 Procure por funes de acesso rede ou de envio de e-mail. 11 Procure funes de criao e leitura de arquivo. 11 Veja nas strings se existe alguma dica e descubra funes para criar um spam. 11 Existe algum acesso rede?

Para responder a primeira pergunta, devemos primeiro pensar nos mtodos de propagao que o programa poderia usar para se propagar: acesso a diretrios compartilhados, explorao de vulnerabilidades remotas, spam com o programa malicioso anexado, entre outros. Depois de ter em mente possveis mtodos de propagao, o analista deve procurar pelas funes importadas que permitem acesso rede ou criao e acesso a arquivos. Normalmente, procurar na lista de strings pode dar uma dica de quais arquivos so acessados, se o programa cria algum e-mail ou se acessa algum diretrio ou compartilhamento remoto. Examinando as strings do programa, podemos perceber que diversas delas indicam textos que provavelmente so usados em um e-mail. Fazendo o backtrace das chamadas a essas strings, voc poder encontrar as funes que criam o spam. Para enviar o spam, o programa deve utilizar algum mtodo de comunicao com a rede. Alternativas possveis seriam o uso de um cliente SMTP interno ao programa, o uso do servidor de e-mail configurado no sistema ou de algum servidor aberto para relay.
Engenharia Reversa de Cdigo Malicioso

112

CreateMIMEHeader

IstrcatA

CreateFileAttachment

GenerateSubjectAndAttachmentName

memset

CreateFileA

GenerateSomeString

ReadFile

Closehandle

GeneratePartOfHeader

__imp_memset

GenerateIPAddressOrTimeStamp

IstrlenA

RandomNumberGenerator

GenerateTimestamp

IstrcpyA

GetTimeZoneInformation

FileTimeToSystemTime

wsprintfA

FileTimeToLocalFileTime

GetLocalTime

Figura 10.1 Mdulo que cria o cabealho da mensagem MIME.

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

RandomNumberGenerator

FindConguredMailServer

IstrcatA

RegEnumKeyA

RegOpenKeyExA

memset

RegQueryValueExA

wsprintfA

MaybeTalkToMailServer

TalkToMailServer

__imp_memset

DeobfuscateString

MaybeCreateRandomEmail

IstrcpyA

PrintEmailAddress

wnsprintfA

sub_506AB8

IstrlenA

CharlowerA

IstrcmpiA

Figura 10.2 Funes no identificadas ou no compreendidas.

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 corretamente. Sugerimos o exerccio de tentar corrigir essas funes e identific-las corretamente.

113

Captulo 10 - Anlise do worm MyDoom

Quais dados so acessados ou modificados?


11 Verifique os arquivos que so criados. 11 Quais chaves de registro so lidas/escritas/modificadas? 11 O programa acessa mais algum arquivo no sistema? 22 FindFirstFileA() 22 FindNextFileA() 22 MapViewOfFile() 22 GetDriveType() 22 GetEnvironmentVariableA() 22 Entre outros. Outra pergunta importante a responder, principalmente para auxiliar na recuperao da mquina invadida, saber quais arquivos ou dados do sistema so modificados quando a mquina infectada.

Para descobrir isso, analise as chamadas s funes de criao/acesso a arquivos, acesso ao registro, e outras funes de acesso a arquivos e diretrios. As funes sugeridas acima mostram apenas uma parte das possveis funes de acesso a arquivo que podem ser encontradas no programa. 11 Outra pergunta importante a responder, principalmente para auxiliar na recuperao da mquina invadida, saber quais arquivos ou dados do sistema so modificados quando a mquina infectada. 11 Para descobrir isso, analise as chamadas s funes de criao/acesso a arquivos, acesso ao registro, e outras funes de acesso a arquivos e diretrios. 11 As funes sugeridas mostram apenas uma parte das possveis funes de acesso a arquivo que podem ser encontradas no programa.

114

Engenharia Reversa de Cdigo Malicioso

; sub_504AE2+D9p ; SearchforEmailinFiles+C5p ; CreateMapViewOfFile+EBp --; CloseHandle (import by name) ; HANDLE __stdcall CreateFileA(LPCSTR 1pFileName,DWORD dwDesiredAccess, DWORD dwShareMode, LPSE extrn CreateFileA:dword ; ; ; ; ; ; BOOL __stdcall SetFileAttributesA(LPCST extrn SetFileAttributesA; ; ; ; ; int __stdcall lstrlenA(LPCSTR ipString) extrn lstrlenA:dword ; ; ; ; ;

; DWORD __stdcall GetTempPathA(DWORD nBuf extrn GetTempPathA:dword ; ; ; ; ; UINT __stdcall GetWindowsDirectoryA(LPS extrn GetWindowsDirectory
Figura 10.3 Chamadas funo CreateFileA.

Lembre-se de utilizar a funcionalidade de referncias cruzadas do IDA para examinar as funes que fazem chamadas s funes importadas que podem ser usadas para criar ou modificar arquivos. Veja no exemplo que existem muitas chamadas CreateFileA(), o que pode ser uma indicao de que o programa tenta criar algum arquivo no sistema. Examinando as funes que fazem chamadas CreateFile(), pode-se encontrar os arquivos que so criados. Verifique chamadas a RegOpenKeyExA(), RegSetValueExA() e RegQueryValueExA():

FindOutlookAddressBook

CreateRegKeyRun

RegOpenKeyExA

RegQueryValueExA

CreateMapViewOfFile

memset

...
RegOpenKeyExA IstrlenA RegSetValueExA

...

Figura 10.4 Funo de pesquisa.

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.

115

Captulo 10 - Anlise do worm MyDoom

Podemos ver acima uma funo que pesquisa o registro tentando encontrar o diretrio onde o Outlook armazena a lista de contatos do usurio, e outra que cria uma chave de registro para executar automaticamente o programa malicioso no incio do sistema.

Verifique os parmetros passados para chamadas a FindFirstFileA() para saber quais arquivos e diretrios so pesquisados. A funo FindFirstFileA() usada quando um programa precisa listar os arquivos de um diretrio. Aps uma chamada a essa funo, o programa geralmente realiza uma chamada em um loop FindNextFileA() para encontrar os outros arquivos do diretrio. Estas funes so geralmente chamadas quando o programa tenta procurar por algum arquivo especfico. No caso do nosso exemplo, o MyDoom tenta encontrar arquivos de catlogo de endereos, arquivos HTML e documentos de texto que possam conter endereos de e-mail que ele usar para enviar o binrio anexado. Veja no exemplo uma parte do mdulo que faz a pesquisa de catlogo de endereos e arquivos. A seguir, precisamos descobrir como o programa analisado faz para se manter no sistema.

Como ele se mantm no sistema?


11 O programa sobrevive ao boot? 11 Quais processos so iniciados? 11 Ele cria algum mutex? 11 Como ele usa os recursos do sistema? Na maioria dos casos, os programa maliciosos tentam instalar algum tipo de mecanismo para serem reiniciados caso o computador seja desligado. Outra informao importante descobrir se apenas o programa malicioso executado no

sistema, ou se ele de algum modo inicia outros processos tambm. comum que programas maliciosos baixem e instalem outras ferramentas para comprometer ainda mais o sistema. Esta inclusive uma fonte de renda para os autores dos programas, pois eles costumam vender essa funcionalidade para outros invasores que desejam instalar suas ferramentas no maior nmero possvel de mquinas. Para evitar que o mesmo programa infecte mais de uma vez a mesma mquina, alguns programas maliciosos costumam usar algum tipo de semforo, ou mutex, para indicar que a mquina j foi comprometida. Se o mutex existir, significa que a mquina j foi comprome tida e no precisa mais ser infectada.
Engenharia Reversa de Cdigo Malicioso

E finalmente, veremos como identificar o tipo de impacto que o programa tem no sistema como um todo. Alguns vrus costumam sobrecarregar a mquina com um processamento muito agressivo, como ao executar um ataque de negao de servios, ou enviar spam indiscriminadamente. 11 O programa sobrevive ao boot? 22 Vimos que existe uma funo que cria uma chave de registro em: 33 \Software\Microsoft\Windows\CurrentVersion\Run

116

11 Outras formas de sobreviver ao boot seriam: 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.

CreateRegKeyRun

Figura 10.5 Criando uma chave de registro.

RegOpenKeyExA

IstrlenA

RegSetValueExA

11 Quais processos so iniciados? 11 Examinando a funo CreateProcessA() possvel encontrar o processo iniciado pelo programa. 11 Verifique tambm possveis ocorrncias de LoadLibraryA() e GetProcAddress(), pois eles podem ser utilizados para iniciar processos utilizando DLLs.

117

Captulo 10 - Anlise do worm MyDoom

Alm da possibilidade de baixar outras ferramentas de ataque, alguns programas maliciosos podem tambm trazer embutidos outros programas ou DLLs que possam usar durante o comprometimento da mquina, como por exemplo um programa que instala um backdoor e seja independente do primeiro. Para iniciar esses processos alternativos, o programa precisa executar uma chamada a alguma funo como CreateProcessA() ou LoadLibraryA(), que permitem a execuo de programas externos.

push lea pop push push push call add lea mov mov push lea push push push push push push push push push push mov call

44h eax, [ebp+Dst] esi esi ebx eax memset esp, 18h eax, [ebp+ProcessInformation] [ebp+Dst], esi [ebp+var_1C], 81h eax eax, [ebp+Dst] eax ebx ebx ebx 1 ebx ebx eax ebx [ebp+var_18], bx CreateProcessA ; ; 1pStartupInfo ; 1pCurrentDirectory ; 1pEnvironment ; dwCreationFlags ; bInheritHandles ; 1pThreadAttributes ; 1pProcessAttributes ; 1pCommandLine ; 1pApplicationName
Figura 10.6 Chamada funo CreateProcessA.

; Size ; Val ; Dst

; 1pProcessInformation

eax, [ebp+CommandLine]

11 Ele cria algum mutex? 22 Um mutex um tipo de semforo criado pelo programa para evitar infeces mltiplas.
Engenharia Reversa de Cdigo Malicioso

22 Existem diversos tipos de mutex: 33 Arquivos. 33 Semforos no kernel. 33 Chaves no registro. 11 Procure por: 22 Ocorrncias de CreateMutexA(). 22 Arquivos com tamanho nulo. 22 Chaves de registro incuas.

118

Como vimos, um programa pode usar um mutex para evitar infectar um computador mais de uma vez. Existem basicamente trs tipos de mutex que podem ser criados: 11 Mutex no kernel: atravs de uma chamada CreateMutexA() o programa cria um semforo no sistema operacional. Este semforo fica ativo enquanto o sistema no for reini ciado. Ao iniciar, o processo pode fazer uma tentativa de criar o mutex e, se o processo falhar, significa que j existe uma cpia do processo em memria. 11 Mutex por arquivo: o programa cria um arquivo especfico que indica que ele j foi exe cutado no sistema. Se este arquivo existir, a mquina j foi comprometida. Normalmente estes arquivos no tm nenhum contedo e so criados em locais escondidos para evitar que sejam descobertos e apagados. 11 Mutex por chaves de registro: alm de criar um arquivo no sistema de arquivos, um processo pode criar chaves de registro para indicar sua execuo prvia. Estas chaves costumam no ter nenhum efeito no funcionamento do sistema. Se o analista encontra a criao de uma chave de registro que aparentemente no tem nenhum impacto no sistema, esta pode estar sendo usada como mutex.

CreateSystemMutex

GetLastError

CreateMutexA

IstrcatA

memset

CreateRegKeyMutex

Figura 10.7 Mutex por chaves de registro.

__imp_memset

RegCreateKeyExA

RegOpenKeyExA

Como ele usa os recursos do sistema? 11 Alguns programas maliciosos costumam abusar dos recursos do sistema. 11 Uma indicao est em chamadas a CreateThread(), principalmente se estiver dentro de loops. Podemos ver no exemplo que o programa cria diversos threads no sistema dentro de um

loop infinito, com um intervalo de um segundo entre cada criao. Isto pode no ser muito prejudicial ao sistema, mas se examinarmos a funo chamada em cada thread, veremos que o sistema pode se tornar inutilizvel dentro de pouco tempo. A funo em questo faz a procura de endereos de e-mail no sistema usando diversas tcnicas, entre elas a pesquisa em arquivos de documentos. Isto pode causar uma grande sobrecarga no sistema pelas constantes leituras a disco.
Captulo 10 - Anlise do worm MyDoom

119

StartHarvestEmailThreads

GetCurrentThread

HarvestEmailInFiles

FindTempUserDir

SetThreadPriority

FindOutLookAddressBook

GetDriveTypeA

SearchAddressBookFile

GetWindowsDirectoryA

GetEnvironmentVariableA

RagOpenKeyExA

RegQueryValueExA

CheckValidFileExtension

FindFirstFileA

FindClose

FindNextFileA

LstrCatA

Sleep

CharLowerA

LstrcpynA

SearchForEmailInFiles

RandomNumberGenerator

CreateMapViewOfFile

HeapFree

ReadSomeData

ReadFile

CloseHandle

CreateFileA

CreateFileMappingA

MapViewOfFile UnMapViewOfFile GetFileSize

MaybeMapFileToMemory

memset

MaybeCheckForSpeacialChars

FindSomething

HeapAlloc GetProcessHeap

GetTickCount

GatherEmailAddressInFiles

LstrcmpiA

isdigit

WideCharToMultiByte

memcpy

ChooseUsernameForEmail

ChooseDomainNameForEmail

__imp_memset

CheckForValidEmailAddress

MaybeConvertStringToLowercase

LstrcnpA

CompareStringsWithTable

CompareTwoStrings

LstrLenA

SearchForEmailAddress

__imp_memcpy

MaybeCheckSizeOfStrings

LstrcpyA

SearchForAtOrSpace

ToLower

CheckIfPunctuation

isalnum

strchr

isspace

Figura 10.8 Criao de threads no sistema dentro de um loop infinito.

120

Engenharia Reversa de Cdigo Malicioso

StartHarvestEmailThreads

GetCurrentThread

HarvestEmailInFiles

FindTempUserDir

SetThreadPriority

FindOutLookAddressBook

GetDriveTypeA

SearchAddressBookFile

GetWindowsDirectoryA

GetEnvironmentVariableA

RagOpenKeyExA

RegQueryValueExA

CheckValidFileExtension

FindFirstFileA

FindClose

FindNextFileA

LstrCatA

Sleep

CharLowerA

LstrcpynA

SearchForEmailInFiles

RandomNumberGenerator

CreateMapViewOfFile

HeapFree

ReadSomeData

ReadFile

CloseHandle

CreateFileA

CreateFileMappingA

MapViewOfFile UnMapViewOfFile GetFileSize

MaybeMapFileToMemory

memset

MaybeCheckForSpeacialChars

FindSomething

HeapAlloc GetProcessHeap

GetTickCount

GatherEmailAddressInFiles

LstrcmpiA

isdigit

WideCharToMultiByte

memcpy

ChooseUsernameForEmail

ChooseDomainNameForEmail

__imp_memset

CheckForValidEmailAddress

MaybeConvertStringToLowercase

LstrcnpA

CompareStringsWithTable

CompareTwoStrings

LstrLenA

SearchForEmailAddress

__imp_memcpy

MaybeCheckSizeOfStrings

LstrcpyA

SearchForAtOrSpace

ToLower

CheckIfPunctuation

isalnum

strchr

isspace

Figura 10.9 Criao de threads no sistema dentro de um loop infinito.

121

Captulo 10 - Anlise do worm MyDoom

Exerccio de fixao 2 e Executvel escondido


H possibilidade de existir outro executvel escondido dentro do cdigo de um artefato malicioso? Como identificar este tipo de comportamento?

Existe algum backdoor escondido?


11 O MyDoom se mantm ativo atravs de diversas tcnicas, incluindo um backdoor. 11 Procure por dados no identificados que sejam referenciados por cdigo. 11 Procure por uma funo de decriptografia (XOR). 11 Procure por chamadas a CreateFile()/WriteFile() e a CreateProcessA(). muito comum que um programa malicioso traga junto consigo outros programas embutidos, que so extrados e salvos no sistema infectado. Estes programas podem realizar funes diversas do programa original. No caso do MyDoom, existe um programa embutido que usado para abrir um backdoor na mquina para permitir o acesso remoto pelo autor da ferramenta aps a mquina ter sido comprometida. Para encontrar este tipo de informao, lembre-se de que um programa tem um tamanho razovel. Procure por uma grande quantidade de dados referenciados por um cdigo que faa chamadas CreateFileA() e WriteFileA(), usado para gravar o arquivo no disco.

CreateServiceExeProcess

wsprintfA

memset

DropDLLBackdoor

CopyFileToTemp

CreateProcessA

GetWindowsDirectoryA

__imp_memset

writeFile

ReadSomeFile

CreateZinciteLogFilename

GetModuleFileNameA

CreateFileA

CloseHandle

SetFilePointer Engenharia Reversa de Cdigo Malicioso

ReadFile

IstrcpyA

IstrlenA

IstrcatA

GetTempPathA

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.

Figura 10.10 Abertura de um backdoor.

122

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. 11 Treine sempre, com o maior nmero possvel de executveis. 11 Procure nas referncias e na internet por tutoriais em engenharia reversa e anlises de programas maliciosos. Eles so uma boa fonte de treinamento. Treinar os conceitos apresentados nesse curso e as solues para as atividades sugeridas um bom comeo, mas o aluno deve procurar mais informaes em outras fontes, como nos sites indicados na bibliografia.

123

Captulo 10 - Anlise do worm MyDoom

124

Engenharia Reversa de Cdigo Malicioso

Roteiro de Atividades 10
Atividade 10.1 Como ele se propaga?
Aps a identificao de funes do programa, usaremos essas informaes para descrever as suas caractersticas mais gerais e seus mtodos de ao, auxiliando na identificao da praga na rede e na criao de mtodos de proteo contra novas infeces. 1. Procure por funes de acesso rede ou de envio de e-mail; 2. Procure por funes de criao e leitura de arquivos; 3. Verifique nas strings se existe alguma dica; 4. Descubra funes para criar o spam; 5. Existe algum acesso rede?

6. Como a comunicao com o servidor de e-mail?

7. Tente agora identificar as funes que fazem a criao e o envio dos e-mails com o worm anexado. Tente identificar e analisar um mnimo de cinco funes e variveis possveis. 8. Use os comentrios no cdigo para marcar reas importantes e identificar a lgica de criao do spam. Informaes que podem ser muito teis para o combate a essa praga em uma rede so os possveis nomes dos arquivos anexados ou nomes de usurios para os quais o worm ser enviado.

Atividade 10.2 Que dados ele acessa ou modifica?


Analisando o cdigo do programa: 1. Verifique os arquivos que so criados; 2. Quais chaves de registro so lidas/escritas/modificadas?
Captulo 10 - Roteiro de Atividades

3. O programa acessa mais algum arquivo no sistema? 4. Examine as referncias cruzadas s funes de acesso a arquivo, e analise as funes que as utilizam. 5. Que dados so acessados nos arquivos lidos pelo programa malicioso? Identifique as funes e analise o cdigo de acordo com o que foi visto na sesso terica.

125

Atividade 10.3 Como ele se mantm no sistema?


Analisando o cdigo do programa, responda: 1. O programa sobrevive ao boot? 2. Quais processos so iniciados? Tente identificar o nome dos processos. 3. Ele cria algum mutex? Quais semforos so criados pelo programa malicioso? 4. Como ele usa os recursos do sistema? Identifique as funes que so chamadas dentro dos threads criados.

Atividade 10.4 Existe algum backdoor escondido?


1. Descubra a rea do programa que armazena o arquivo de backdoor. 2. Descubra e analise a funo que faz a decriptografia dos dados. 3. Descubra como o processo iniciado e onde ele gravado.

Atividade 10.5 Script IDC


Para essa atividade final, o aluno deve usar um programa em IDC para decriptografar a regio do programa que contm o binrio embutido, sem precisar executar o programa. O IDC uma ferramenta poderosa para auxiliar nesse tipo de situao. Como ensinar programao IDC no o objetivo desse curso, e por si s j seria matria para um curso completo. Um script para realizar essa converso fornecido no diretrio de scripts IDC do IDA. 1. Utilizando o script IDC xor.idc, decodifique o binrio embutido. Leia o script para entender seu funcionamento. 2. Modifique o script para salvar o cdigo embutido em um arquivo, j decodificado. 3. Examine o script, entenda seu funcionamento e use-o para decriptografar o programa embutido. Se voc se sentir confortvel, pode tentar modificar o programa para salvar o arquivo em disco aps decodific-lo. Veja os outros arquivos IDC para ter um exemplo de como salvar arquivos. Aps a decodificao, voc poder conferir a validade da operao examinando os dados decodificados para verificar se realmente trata-se de um executvel.

126

Engenharia Reversa de Cdigo Malicioso

Bibliografia
11 Cartoon Hackers: http://hackerschool.org/DefconCTF/17/B300.html 11 EAGLE, Chris. The IDA Pro Book The Unofficial Guide to the Worlds Most Popular Disassembler. 11 Free IDA Pro Binary Auditing Training Material for University Lectures: http://www.binary-auditing.com/ 11 GUILFANOV, Ilfak. TLS callbacks : http://www.hexblog.com/ 11 HINES, Eric S. MyDoom.B Worm Analysis de Applied Watch Technologies : http://isc.sans.org/presentations/MyDoom_B_Analysis.pdf 11 Malware Analysis System: https://mwanalysis.org/ (antigo CWSandbox). 11 Microsoft PE and COFF Specification: http://msdn.microsoft.com 11 OpenRCE Open Reverse Code Engineering community: http://www.openrce.org/ 11 OS X ABI Mach-O File Format Reference. Mac Developer Library, 2009. 11 PC Assembly Language Tutorial: http://www.drpaulcarter.com/cs/ 11 PIETREK, Matt. A Crash Course on the Depths of Win32 Structured Exception Handling. Microsoft Systems Journal, 1997. 11 . An In-Depth Look into the Win32 Portable Executable File Format, 2002. 11 PORRAS et al. An Analysis of Confickers Logic and Rendezvous Points, 2009. 11 ROBERTS, Wesley. New Conficker B++ Worm Variant on the Prowl, 2009. 11 Securith-forum.net: http://forums.security-forum.net/ 11 Threat Analyses de Secure Works: http://www.secureworks.com/ cyber-threat-intelligence/threats/ 11 Vulnerabilities on Sophos: http://www.sophos.com/

127

Bibliografia

O curso apresenta tcnicas de anlise de malware para apoiar a investigao forense digital e a resposta a incidentes envolvendo programas mal-intencionados.

LIVRO DE APOIO AO CURSO

O objetivo fornecer aos administradores de TI habilidades prticas para a anlise destes programas. So abordados os conceitos, procedimentos e ferramentas para a anlise de um cdigo malicioso, com o uso de uma ferramenta para a realizao das atividades prticas, que consolidam o conhecimento terico. So apresentados os comandos bsicos de Assembly para que o aluno execute a engenharia reversa de worms que afetaram milhares de computadores. O aluno aprender as melhores prticas antiengenharia reversa, desenvolvenzes contra cdigos maliciosos. Este livro inclui os roteiros das atividades prticas e o contedo dos slides apresentados em sala de aula, mento em suas organizaes ou localidades de origem.

ISBN 978-85-63630-26-1

9 788563 630261