SlideShare una empresa de Scribd logo
1 de 34
Descargar para leer sin conexión
1/2
      Tutorial: Engenharia Reversa
        em sistemas GNU/Linux



             Fernando Mercês


            LinuxCon 2010 Brazil
2/2
3/2

            Lançamento na LinuxCon
      ●   Suporte ao CentOS
             – 0800xxx
             – Todo território nacional

              –   24x7
              –   SLA

                  –   Lançamento oficial dia 01/09 às 12:30h
                      no Stand da 4Linux
                  –   Sorteio de 03 cursos de CentOS aos
                      presentes no stand.
4/2

           No final da minha palestra
      ●   As 5 melhores perguntas ganharão um
          botton do TUX
      ●   Sortearei o curso EaD “Segurança em
          Servidores Linux: Norma ISO 27002”
            –   Preencham o cupom que está no folheto da
                4Linux dentro da bolsa da LinuxCon
            –   Se você já preencheu, ele já está aqui na
                urna
            –   O ganhador deve estar presente até o
                quinto sorteio. Se não estiver presente
                ganhará o sexto sorteado
5/2

                             Agenda
      ●   O que é ER?
      ●   Por que reverter no GNU/Linux
      ●   O formato ELF e ferramentas de análise
      ●   Um pouco de arquitetura e Assembly
      ●   Técnicas de ER
             –   Fishing
             –   Byte patching
             –   Unpacking
             –   Injeção de código
6/2

                         Agenda
             –   Debugging
      ●   Curiosidade: um keygen em shell script
      ●   Considerações finais
      ●   Documentação e recursos
      ●   Perguntas
7/2

               Engenharia Reversa
      ●   É o processo de obter informações
          sobre o funcionamento de um
          dispositivo, objeto ou sistema através
          da análise de sua estrutura, funções e
          recursos.
      ●   No caso de software, representa o
          aprendizado das funções e
          comportamento de um programa sem
          possuir seu código-fonte.
8/2

           Por que reverter no Linux?
      ●   Desenvolvimento de softwares livres
          com base em softwares proprietários,
          como os baseados em protocolos
          fechados ou drivers restritos.
      ●   Análise de malware, estudo do
          comportamento de binários e
          debugging de aplicações sem código-
          fonte.
9/2

                   O formato ELF
      ●   Formato padrão utilizado nos binários
          do *nix.
      ●   Organiza o binário e estabelece regras
          para sua formação e interpretação no
          SO.
      ●   O binário ELF apresenta um cabeçalho
          e uma área de dados que, na sua forma
          completa, contém:
10/2

                          O formato ELF
       ●   Tabela de cabeçalhos do programa, que
           determina o offset onde um segmento
           inicia e termina.
       ●   Tabela de cabeçalhos das seções, que
           especifica as seções dentro dos
           segmentos, como:
              –   .text
              –   .data
              –   .bss
11/2

                    O formato ELF
       ●   Os segmentos contém as seções.
       ●   As seções abrigam bytes que podem
           ser código, dados ou até comentários.
           Porém, existem bytes fora de qualquer
           seção, os chamados bytes órfãos.
12/2

                    O formato ELF
       ●   Especificação disponível na internet.
       ●   Existem outros formatos de binários,
           inclusive para Linux como o FatELF (não
           nativo), além da especificação ELF64.
13/2

               O formato ELF
       $ file /etc/resolv.conf 
       /etc/resolv.conf: ASCII text


       $ file /bin/ls
       /bin/ls: ELF 64­bit LSB 
       executable, x86­64, version 1 
       (SYSV), dynamically linked (uses 
       shared libs), for GNU/Linux 
       2.6.18, stripped
14/2

                     O formato ELF
       $ readelf ­h /lib/libc.so.6 
       ELF Header:
         Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 
       00 00 00 
         Class:                ELF64
         OS/ABI:               UNIX­System V
         Type:                 DYN (Shared object file)
15/2

                    O formato ELF
       ●   O readelf pode exibir os cabeçalhos
           seções do binário com a opção -S e os
           cabeçalhos do programa com a opção
           -l.
       ●   Também é possível fazer um dump em
           hexa do conteúdo das seções.
16/2

                    O formato ELF
       ●   O readelf pode exibir os cabeçalhos
           seções do binário com a opção -S e os
           cabeçalhos do programa com a opção
           -l.
       ●   Também é possível fazer um dump em
           hexa do conteúdo das seções.
17/2

                      O formato ELF
       $ objdump ­d tato
       00000000004006c8 <_init>:
         4006c8:   sub    $0x8,%rsp
         4006cc:   callq  40079c <call_gmon_start>
         4006d1:   callq  400830 <frame_dummy>
         4006d6:   callq  400a70 <__do_global_ctors_aux>
         4006db:   add    $0x8,%rsp
         4006df:   retq 
18/2

                     O formato ELF
       ●   strings é um programa capaz de
           localizar strings dentro de um binário.
       ●   HT Editor (hte) é um poderoso editor
           interativo de binários ELF, capaz de
           analisar binários e interpretar o
           assembly em 32-bits.
19/2

                         Arquitetura
       ●   Instruções, opcodes.
       ●   Registradores de uso geral, contadores,
           flags de estado, apontadores.
       ●   Pilha (stack).
       ●   Modos de endereçamento, por
           exemplo:
              –   Base + deslocamento
              –   Por registrador
              –   Indexado
20/2

                        Assembly
       ●   Definida na arquitetura do
           microprocessador.
       ●   A visualização depende da capacidade
           do disassembler.
       ●   Sintaxes AT&T e Intel.
       ●   Tire da cabeça que assembly é difícil!
           Quem programa em assembly é
           humano sim!
21/2

                         Assembly
       ●   Empurrando para a pilha: PUSH
       ●   Recuperando da pilha: POP
       ●   Copiando dados: MOV
       ●   Aritimética: ADD, SUB, MUL, DIV
       ●   Incremento: INC
       ●   Comparação: CMP / TEST
       ●   Salto incondicional: JMP
       ●   Saltos condicionais: JE, JNE, JG, JNG, JL...
22/2

                         Assembly
       ●   Chamando sub-rotinas: CALL
       ●   Return: RET
       ●   Chamando interrupções: INT
       ●   OU exclusivo: XOR
       ●   Lendo um endereço: LEA
23/2

                        Fishing
       ●   Pescar algo na memória principal ou em
           registradores.
       ●   Útil para observar o que dado é usado
           em determinada operação ou o retorno
           de uma função específica.
       ●   Algo um pouco mais paupável que um
           dump de memória.
24/2

                    Byte patching
       ●   Modificar e salvar bytes num programa,
           modificando seu comportamento ou os
           dados com os quais trabalha.
       ●   Útil para observar o que dado é usado
           em determinada operação ou o retorno
           de uma função específica.
25/2

                        Unpacking
       ●   Comprime o executável.
       ●   Dificulta/impossibilita a leitura direta
           por um disassembler.
       ●   “Embaralha” as seções e em alguns
           casos, protege bem o binário.
       ●   Quando o binário é executado, o código
           do packer descompacta o código
           original do binário em memória,
           permitindo sua execução.
26/2

                       Unpacking
       ●   O processo automático conta com
           auxílio de programas que conhecem o
           packer para removê-lo.
       ●   No processo manual o engenheiro
           reverso precisa chegar num estado
           onde todo o executável original esteja
           na memória e dumpá-lo para o disco,
           gerando um novo executável,
           descompactado, mas ainda é preciso
           fixar suas tabelas e endereços.
27/2

                  Injeção de código
       ●   Consiste em injetar código ASM para
           realizar determinada tarefa como
           colocar um software para logar por
           exemplo.
       ●   Uma técnica é buscar um hole (vários
           bytes 0 em seqüência), criar uma
           função ali e desviar o código do
           programa para lá, respeitando a pilha e
           os registradores.
28/2

                      Debugging
       ●   Sempre aliado a um bom disassembler
           para um resultado melhor.
       ●   gdb, IDA Pro e EDB.
       ●   Permite execução instrução por
           instrução, observando-se o estado dos
           registradores e pilha de memória, além
           de recursos como breakpoints, memory
           breakpoints e tracing.
29/2




       ●   Projeto open source.
       ●   Debugger de uso geral.
       ●   Indicado para aplicações sem source.
       ●   Similar ao OllyDbg.
30/2

                        KeyGen
       ●   Um ótimo exercício para compreender
           um software compilado é vencer
           desafios chamados de “keygenme”.
       ●   Para vencer, é preciso entender
           completamente a lógica do programa e
           descobrir sua chave.
       ●   Lembrando que não se deve fazer isso
           em softwares protegidos. ;)
31/2

                        KeyGen
       ●   É possível fazer um keygen com
           qualquer linguagem que se conheça,
           inclusive BASH scripting.
32/2

        Documentação e recursos
       http://asm.sourceforge.net
       http://linuxreversing.org
       http://codef00.com
       www.reverse-engineering.net
       www.slideshare.net/nandu88
33/2

                       Oportunidade
       ●   Espionagem é muito utilizada na área militar.
       ●   A indústria de anti-vírus investe milhões para se
           antecipar às ameaças.
       ●   Você é de segurança? Quer usar esse know-how
           para outra área? Inovação gera necessidade de
           ER.
       ●   Quer um hobby que evolua mais seu
           conhecimento em segurança?
34/2

               Obrigado


               Fernando Mercês
       fernando.merces@4linux.com.br
              www.4linux.com.br
             www.hackerteen.com
         twitter.com/FernandoMerces
             twitter.com/4LinuxBR

           Tel: 55-11-2125-4747

Más contenido relacionado

La actualidad más candente

TDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux EmbarcadoTDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux Embarcadotdc-globalcode
 
Laboratório de Programação I: Arquivos (texto) em disco
Laboratório de Programação I: Arquivos (texto) em discoLaboratório de Programação I: Arquivos (texto) em disco
Laboratório de Programação I: Arquivos (texto) em discoAlex Camargo
 
Como Colaborar no Desenvolvimento do Kernel Linux - Fábio Olivé Leite
Como Colaborar no Desenvolvimento do Kernel Linux - Fábio Olivé LeiteComo Colaborar no Desenvolvimento do Kernel Linux - Fábio Olivé Leite
Como Colaborar no Desenvolvimento do Kernel Linux - Fábio Olivé LeiteTchelinux
 
Cap1 exercicios comandos linux resolucao part i
Cap1 exercicios comandos linux   resolucao part iCap1 exercicios comandos linux   resolucao part i
Cap1 exercicios comandos linux resolucao part iportal_Do_estudante
 
Curso de Python (Básico) - Português
Curso de Python (Básico) - PortuguêsCurso de Python (Básico) - Português
Curso de Python (Básico) - PortuguêsHelio Colombe
 
Unix - Sistemas Operacionais
Unix - Sistemas OperacionaisUnix - Sistemas Operacionais
Unix - Sistemas OperacionaisJunior Silva
 
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataformaAndroid Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataformaFelipe Silveira
 
Análise estática de malware com o pev
Análise estática de malware com o pevAnálise estática de malware com o pev
Análise estática de malware com o pevDiego Santos
 
Android Core Aula 2: Inicialização de um sistema Android
Android Core Aula 2: Inicialização de um sistema AndroidAndroid Core Aula 2: Inicialização de um sistema Android
Android Core Aula 2: Inicialização de um sistema AndroidFelipe Silveira
 
Estrutura de Programas
Estrutura de ProgramasEstrutura de Programas
Estrutura de ProgramasSidney Roberto
 
A lógica do Python e seus termos
A lógica do Python e seus termosA lógica do Python e seus termos
A lógica do Python e seus termosValore I/O
 
Sistema Operacional GNU/Linux
Sistema Operacional GNU/LinuxSistema Operacional GNU/Linux
Sistema Operacional GNU/LinuxPedro Neto
 
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...Rogério Moraes de Carvalho
 
Máquinas Multiníveis - Nível da Microarquitetura
Máquinas Multiníveis - Nível da MicroarquiteturaMáquinas Multiníveis - Nível da Microarquitetura
Máquinas Multiníveis - Nível da MicroarquiteturaLincoln Lamas
 
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé Leite
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé LeiteComo ajudar no desenvolvimento do kernel Linux? - Fábio Olivé Leite
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé LeiteTchelinux
 

La actualidad más candente (20)

TDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux EmbarcadoTDC2016SP - Trilha Linux Embarcado
TDC2016SP - Trilha Linux Embarcado
 
Laboratório de Programação I: Arquivos (texto) em disco
Laboratório de Programação I: Arquivos (texto) em discoLaboratório de Programação I: Arquivos (texto) em disco
Laboratório de Programação I: Arquivos (texto) em disco
 
Como Colaborar no Desenvolvimento do Kernel Linux - Fábio Olivé Leite
Como Colaborar no Desenvolvimento do Kernel Linux - Fábio Olivé LeiteComo Colaborar no Desenvolvimento do Kernel Linux - Fábio Olivé Leite
Como Colaborar no Desenvolvimento do Kernel Linux - Fábio Olivé Leite
 
Soa#cap4.1 gestor de pacotes
Soa#cap4.1   gestor de pacotesSoa#cap4.1   gestor de pacotes
Soa#cap4.1 gestor de pacotes
 
Cap1 exercicios comandos linux resolucao part i
Cap1 exercicios comandos linux   resolucao part iCap1 exercicios comandos linux   resolucao part i
Cap1 exercicios comandos linux resolucao part i
 
Aprendendo linux
Aprendendo linuxAprendendo linux
Aprendendo linux
 
Curso de Python (Básico) - Português
Curso de Python (Básico) - PortuguêsCurso de Python (Básico) - Português
Curso de Python (Básico) - Português
 
Unix - Sistemas Operacionais
Unix - Sistemas OperacionaisUnix - Sistemas Operacionais
Unix - Sistemas Operacionais
 
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataformaAndroid Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
Android Core Aula 1 - Histórico, Arquitetura e Compilação da plataforma
 
Análise estática de malware com o pev
Análise estática de malware com o pevAnálise estática de malware com o pev
Análise estática de malware com o pev
 
Python, CPython, Pythonico, Cython
Python, CPython, Pythonico, CythonPython, CPython, Pythonico, Cython
Python, CPython, Pythonico, Cython
 
Android Core Aula 2: Inicialização de um sistema Android
Android Core Aula 2: Inicialização de um sistema AndroidAndroid Core Aula 2: Inicialização de um sistema Android
Android Core Aula 2: Inicialização de um sistema Android
 
Estrutura de Programas
Estrutura de ProgramasEstrutura de Programas
Estrutura de Programas
 
A lógica do Python e seus termos
A lógica do Python e seus termosA lógica do Python e seus termos
A lógica do Python e seus termos
 
Curso openmp
Curso openmpCurso openmp
Curso openmp
 
Sistema Operacional GNU/Linux
Sistema Operacional GNU/LinuxSistema Operacional GNU/Linux
Sistema Operacional GNU/Linux
 
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
 
Máquinas Multiníveis - Nível da Microarquitetura
Máquinas Multiníveis - Nível da MicroarquiteturaMáquinas Multiníveis - Nível da Microarquitetura
Máquinas Multiníveis - Nível da Microarquitetura
 
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé Leite
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé LeiteComo ajudar no desenvolvimento do kernel Linux? - Fábio Olivé Leite
Como ajudar no desenvolvimento do kernel Linux? - Fábio Olivé Leite
 
Cap1 exercicios comandos linux
Cap1 exercicios comandos linuxCap1 exercicios comandos linux
Cap1 exercicios comandos linux
 

Destacado

FISL11: Análise de binários ELF
FISL11: Análise de binários ELFFISL11: Análise de binários ELF
FISL11: Análise de binários ELFFernando Mercês
 
(Un)Protecting USB Storage Media
(Un)Protecting USB Storage Media(Un)Protecting USB Storage Media
(Un)Protecting USB Storage MediaFernando Mercês
 
Construindo um analisador de executáveis
Construindo um analisador de executáveisConstruindo um analisador de executáveis
Construindo um analisador de executáveisFernando Mercês
 
Criando um site com LAMP e Joomla em 30 minutos
Criando um site com LAMP e Joomla em 30 minutosCriando um site com LAMP e Joomla em 30 minutos
Criando um site com LAMP e Joomla em 30 minutosFernando Mercês
 
SlackShow 2010: Monitorando servidores com o Twitter
SlackShow 2010: Monitorando servidores com o TwitterSlackShow 2010: Monitorando servidores com o Twitter
SlackShow 2010: Monitorando servidores com o TwitterFernando Mercês
 
FISL11: Protegendo webservers na intranet contra ataques Man-In-The-Middle
FISL11: Protegendo webservers na intranet contra ataques Man-In-The-MiddleFISL11: Protegendo webservers na intranet contra ataques Man-In-The-Middle
FISL11: Protegendo webservers na intranet contra ataques Man-In-The-MiddleFernando Mercês
 
Disparando eventos com Asterisk
Disparando eventos com AsteriskDisparando eventos com Asterisk
Disparando eventos com AsteriskFernando Mercês
 

Destacado (11)

Webcast Luiz Vieira criptografia on-the-fly com software livre
Webcast Luiz Vieira criptografia on-the-fly com software livreWebcast Luiz Vieira criptografia on-the-fly com software livre
Webcast Luiz Vieira criptografia on-the-fly com software livre
 
Análise de malware com software livre
Análise de malware com software livreAnálise de malware com software livre
Análise de malware com software livre
 
FISL11: Análise de binários ELF
FISL11: Análise de binários ELFFISL11: Análise de binários ELF
FISL11: Análise de binários ELF
 
(Un)Protecting USB Storage Media
(Un)Protecting USB Storage Media(Un)Protecting USB Storage Media
(Un)Protecting USB Storage Media
 
Construindo um analisador de executáveis
Construindo um analisador de executáveisConstruindo um analisador de executáveis
Construindo um analisador de executáveis
 
Criando um site com LAMP e Joomla em 30 minutos
Criando um site com LAMP e Joomla em 30 minutosCriando um site com LAMP e Joomla em 30 minutos
Criando um site com LAMP e Joomla em 30 minutos
 
SlackShow 2010: Monitorando servidores com o Twitter
SlackShow 2010: Monitorando servidores com o TwitterSlackShow 2010: Monitorando servidores com o Twitter
SlackShow 2010: Monitorando servidores com o Twitter
 
Entendendo os pacotes DEB
Entendendo os pacotes DEBEntendendo os pacotes DEB
Entendendo os pacotes DEB
 
FISL11: Protegendo webservers na intranet contra ataques Man-In-The-Middle
FISL11: Protegendo webservers na intranet contra ataques Man-In-The-MiddleFISL11: Protegendo webservers na intranet contra ataques Man-In-The-Middle
FISL11: Protegendo webservers na intranet contra ataques Man-In-The-Middle
 
Disparando eventos com Asterisk
Disparando eventos com AsteriskDisparando eventos com Asterisk
Disparando eventos com Asterisk
 
Webgoat como ferramenta de aprendizado
Webgoat como ferramenta de aprendizadoWebgoat como ferramenta de aprendizado
Webgoat como ferramenta de aprendizado
 

Similar a LinuxCon 2010: Tutorial - Reverse Engineering on GNU/Linux Systems

Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling LandgrafDesenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling LandgrafTchelinux
 
Programando Software Livre em C
Programando Software Livre em CProgramando Software Livre em C
Programando Software Livre em CDiego Santos
 
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...Tchelinux
 
Linux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoCLinux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoCEmbarcados
 
Fundamentos de Sistemas Operacionais - Aula 3 - Arquiteturas de Sistemas Oper...
Fundamentos de Sistemas Operacionais - Aula 3 - Arquiteturas de Sistemas Oper...Fundamentos de Sistemas Operacionais - Aula 3 - Arquiteturas de Sistemas Oper...
Fundamentos de Sistemas Operacionais - Aula 3 - Arquiteturas de Sistemas Oper...Helder Lopes
 
Microcontroladores pic
Microcontroladores picMicrocontroladores pic
Microcontroladores picCesar Prim
 
10 apostila microcontroladores
10  apostila microcontroladores10  apostila microcontroladores
10 apostila microcontroladoresAlyson Cavalcante
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosEmbarcados
 
Introdução à Programação Python e Tk
Introdução à Programação Python e TkIntrodução à Programação Python e Tk
Introdução à Programação Python e TkCarlos Campani
 
Microarquitetura Intel Core Duo
Microarquitetura Intel Core DuoMicroarquitetura Intel Core Duo
Microarquitetura Intel Core DuoSamuel Bié
 
Aula - Comandos Linux - Parte 1
Aula - Comandos Linux - Parte 1Aula - Comandos Linux - Parte 1
Aula - Comandos Linux - Parte 1Leo Amorim
 
Comandos Linux Parte 1
Comandos Linux Parte 1Comandos Linux Parte 1
Comandos Linux Parte 1Leo Amorim
 
Guia com mais de 500 comandos do linux
Guia com mais de 500 comandos do linuxGuia com mais de 500 comandos do linux
Guia com mais de 500 comandos do linuxKalanzans
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2Daniel
 
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdfparadigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdfAndreiaCristinaFlore
 
Módulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de ComputadoresMódulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de ComputadoresLuis Ferreira
 

Similar a LinuxCon 2010: Tutorial - Reverse Engineering on GNU/Linux Systems (20)

Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling LandgrafDesenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
 
Programando Software Livre em C
Programando Software Livre em CProgramando Software Livre em C
Programando Software Livre em C
 
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
 
Linguagem assembly
Linguagem assemblyLinguagem assembly
Linguagem assembly
 
Linux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoCLinux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoC
 
LEON3 e KIT ALTERA.
LEON3 e KIT ALTERA.LEON3 e KIT ALTERA.
LEON3 e KIT ALTERA.
 
Fundamentos de Sistemas Operacionais - Aula 3 - Arquiteturas de Sistemas Oper...
Fundamentos de Sistemas Operacionais - Aula 3 - Arquiteturas de Sistemas Oper...Fundamentos de Sistemas Operacionais - Aula 3 - Arquiteturas de Sistemas Oper...
Fundamentos de Sistemas Operacionais - Aula 3 - Arquiteturas de Sistemas Oper...
 
Microcontroladores pic
Microcontroladores picMicrocontroladores pic
Microcontroladores pic
 
10 apostila microcontroladores
10  apostila microcontroladores10  apostila microcontroladores
10 apostila microcontroladores
 
Resumo x86
Resumo x86Resumo x86
Resumo x86
 
Engenharia reversa
Engenharia reversaEngenharia reversa
Engenharia reversa
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcados
 
Introdução à Programação Python e Tk
Introdução à Programação Python e TkIntrodução à Programação Python e Tk
Introdução à Programação Python e Tk
 
Microarquitetura Intel Core Duo
Microarquitetura Intel Core DuoMicroarquitetura Intel Core Duo
Microarquitetura Intel Core Duo
 
Aula - Comandos Linux - Parte 1
Aula - Comandos Linux - Parte 1Aula - Comandos Linux - Parte 1
Aula - Comandos Linux - Parte 1
 
Comandos Linux Parte 1
Comandos Linux Parte 1Comandos Linux Parte 1
Comandos Linux Parte 1
 
Guia com mais de 500 comandos do linux
Guia com mais de 500 comandos do linuxGuia com mais de 500 comandos do linux
Guia com mais de 500 comandos do linux
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2
 
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdfparadigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
 
Módulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de ComputadoresMódulo 5 Arquitetura de Computadores
Módulo 5 Arquitetura de Computadores
 

LinuxCon 2010: Tutorial - Reverse Engineering on GNU/Linux Systems

  • 1. 1/2 Tutorial: Engenharia Reversa em sistemas GNU/Linux Fernando Mercês LinuxCon 2010 Brazil
  • 2. 2/2
  • 3. 3/2 Lançamento na LinuxCon ● Suporte ao CentOS – 0800xxx – Todo território nacional – 24x7 – SLA – Lançamento oficial dia 01/09 às 12:30h no Stand da 4Linux – Sorteio de 03 cursos de CentOS aos presentes no stand.
  • 4. 4/2 No final da minha palestra ● As 5 melhores perguntas ganharão um botton do TUX ● Sortearei o curso EaD “Segurança em Servidores Linux: Norma ISO 27002” – Preencham o cupom que está no folheto da 4Linux dentro da bolsa da LinuxCon – Se você já preencheu, ele já está aqui na urna – O ganhador deve estar presente até o quinto sorteio. Se não estiver presente ganhará o sexto sorteado
  • 5. 5/2 Agenda ● O que é ER? ● Por que reverter no GNU/Linux ● O formato ELF e ferramentas de análise ● Um pouco de arquitetura e Assembly ● Técnicas de ER – Fishing – Byte patching – Unpacking – Injeção de código
  • 6. 6/2 Agenda – Debugging ● Curiosidade: um keygen em shell script ● Considerações finais ● Documentação e recursos ● Perguntas
  • 7. 7/2 Engenharia Reversa ● É o processo de obter informações sobre o funcionamento de um dispositivo, objeto ou sistema através da análise de sua estrutura, funções e recursos. ● No caso de software, representa o aprendizado das funções e comportamento de um programa sem possuir seu código-fonte.
  • 8. 8/2 Por que reverter no Linux? ● Desenvolvimento de softwares livres com base em softwares proprietários, como os baseados em protocolos fechados ou drivers restritos. ● Análise de malware, estudo do comportamento de binários e debugging de aplicações sem código- fonte.
  • 9. 9/2 O formato ELF ● Formato padrão utilizado nos binários do *nix. ● Organiza o binário e estabelece regras para sua formação e interpretação no SO. ● O binário ELF apresenta um cabeçalho e uma área de dados que, na sua forma completa, contém:
  • 10. 10/2 O formato ELF ● Tabela de cabeçalhos do programa, que determina o offset onde um segmento inicia e termina. ● Tabela de cabeçalhos das seções, que especifica as seções dentro dos segmentos, como: – .text – .data – .bss
  • 11. 11/2 O formato ELF ● Os segmentos contém as seções. ● As seções abrigam bytes que podem ser código, dados ou até comentários. Porém, existem bytes fora de qualquer seção, os chamados bytes órfãos.
  • 12. 12/2 O formato ELF ● Especificação disponível na internet. ● Existem outros formatos de binários, inclusive para Linux como o FatELF (não nativo), além da especificação ELF64.
  • 13. 13/2 O formato ELF $ file /etc/resolv.conf  /etc/resolv.conf: ASCII text $ file /bin/ls /bin/ls: ELF 64­bit LSB  executable, x86­64, version 1  (SYSV), dynamically linked (uses  shared libs), for GNU/Linux  2.6.18, stripped
  • 14. 14/2 O formato ELF $ readelf ­h /lib/libc.so.6  ELF Header:   Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00  00 00 00    Class:                ELF64   OS/ABI:               UNIX­System V   Type:                 DYN (Shared object file)
  • 15. 15/2 O formato ELF ● O readelf pode exibir os cabeçalhos seções do binário com a opção -S e os cabeçalhos do programa com a opção -l. ● Também é possível fazer um dump em hexa do conteúdo das seções.
  • 16. 16/2 O formato ELF ● O readelf pode exibir os cabeçalhos seções do binário com a opção -S e os cabeçalhos do programa com a opção -l. ● Também é possível fazer um dump em hexa do conteúdo das seções.
  • 17. 17/2 O formato ELF $ objdump ­d tato 00000000004006c8 <_init>:   4006c8: sub    $0x8,%rsp   4006cc: callq  40079c <call_gmon_start>   4006d1: callq  400830 <frame_dummy>   4006d6: callq  400a70 <__do_global_ctors_aux>   4006db: add    $0x8,%rsp   4006df: retq 
  • 18. 18/2 O formato ELF ● strings é um programa capaz de localizar strings dentro de um binário. ● HT Editor (hte) é um poderoso editor interativo de binários ELF, capaz de analisar binários e interpretar o assembly em 32-bits.
  • 19. 19/2 Arquitetura ● Instruções, opcodes. ● Registradores de uso geral, contadores, flags de estado, apontadores. ● Pilha (stack). ● Modos de endereçamento, por exemplo: – Base + deslocamento – Por registrador – Indexado
  • 20. 20/2 Assembly ● Definida na arquitetura do microprocessador. ● A visualização depende da capacidade do disassembler. ● Sintaxes AT&T e Intel. ● Tire da cabeça que assembly é difícil! Quem programa em assembly é humano sim!
  • 21. 21/2 Assembly ● Empurrando para a pilha: PUSH ● Recuperando da pilha: POP ● Copiando dados: MOV ● Aritimética: ADD, SUB, MUL, DIV ● Incremento: INC ● Comparação: CMP / TEST ● Salto incondicional: JMP ● Saltos condicionais: JE, JNE, JG, JNG, JL...
  • 22. 22/2 Assembly ● Chamando sub-rotinas: CALL ● Return: RET ● Chamando interrupções: INT ● OU exclusivo: XOR ● Lendo um endereço: LEA
  • 23. 23/2 Fishing ● Pescar algo na memória principal ou em registradores. ● Útil para observar o que dado é usado em determinada operação ou o retorno de uma função específica. ● Algo um pouco mais paupável que um dump de memória.
  • 24. 24/2 Byte patching ● Modificar e salvar bytes num programa, modificando seu comportamento ou os dados com os quais trabalha. ● Útil para observar o que dado é usado em determinada operação ou o retorno de uma função específica.
  • 25. 25/2 Unpacking ● Comprime o executável. ● Dificulta/impossibilita a leitura direta por um disassembler. ● “Embaralha” as seções e em alguns casos, protege bem o binário. ● Quando o binário é executado, o código do packer descompacta o código original do binário em memória, permitindo sua execução.
  • 26. 26/2 Unpacking ● O processo automático conta com auxílio de programas que conhecem o packer para removê-lo. ● No processo manual o engenheiro reverso precisa chegar num estado onde todo o executável original esteja na memória e dumpá-lo para o disco, gerando um novo executável, descompactado, mas ainda é preciso fixar suas tabelas e endereços.
  • 27. 27/2 Injeção de código ● Consiste em injetar código ASM para realizar determinada tarefa como colocar um software para logar por exemplo. ● Uma técnica é buscar um hole (vários bytes 0 em seqüência), criar uma função ali e desviar o código do programa para lá, respeitando a pilha e os registradores.
  • 28. 28/2 Debugging ● Sempre aliado a um bom disassembler para um resultado melhor. ● gdb, IDA Pro e EDB. ● Permite execução instrução por instrução, observando-se o estado dos registradores e pilha de memória, além de recursos como breakpoints, memory breakpoints e tracing.
  • 29. 29/2 ● Projeto open source. ● Debugger de uso geral. ● Indicado para aplicações sem source. ● Similar ao OllyDbg.
  • 30. 30/2 KeyGen ● Um ótimo exercício para compreender um software compilado é vencer desafios chamados de “keygenme”. ● Para vencer, é preciso entender completamente a lógica do programa e descobrir sua chave. ● Lembrando que não se deve fazer isso em softwares protegidos. ;)
  • 31. 31/2 KeyGen ● É possível fazer um keygen com qualquer linguagem que se conheça, inclusive BASH scripting.
  • 32. 32/2 Documentação e recursos http://asm.sourceforge.net http://linuxreversing.org http://codef00.com www.reverse-engineering.net www.slideshare.net/nandu88
  • 33. 33/2 Oportunidade ● Espionagem é muito utilizada na área militar. ● A indústria de anti-vírus investe milhões para se antecipar às ameaças. ● Você é de segurança? Quer usar esse know-how para outra área? Inovação gera necessidade de ER. ● Quer um hobby que evolua mais seu conhecimento em segurança?
  • 34. 34/2 Obrigado Fernando Mercês fernando.merces@4linux.com.br www.4linux.com.br www.hackerteen.com twitter.com/FernandoMerces twitter.com/4LinuxBR Tel: 55-11-2125-4747