Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,365 views

Published on

Slides do tutorial apresentado em 31/8/2010 na LinuxCon Brazil 2010, em Sao Paulo - SP.

  • Be the first to comment

  • Be the first to like this

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

  1. 1. 1/2 Tutorial: Engenharia Reversa em sistemas GNU/Linux Fernando Mercês LinuxCon 2010 Brazil
  2. 2. 2/2
  3. 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. 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. 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. 6/2 Agenda – Debugging ● Curiosidade: um keygen em shell script ● Considerações finais ● Documentação e recursos ● Perguntas
  7. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 22/2 Assembly ● Chamando sub-rotinas: CALL ● Return: RET ● Chamando interrupções: INT ● OU exclusivo: XOR ● Lendo um endereço: LEA
  23. 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. 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. 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. 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. 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. 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. 29/2 ● Projeto open source. ● Debugger de uso geral. ● Indicado para aplicações sem source. ● Similar ao OllyDbg.
  30. 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. 31/2 KeyGen ● É possível fazer um keygen com qualquer linguagem que se conheça, inclusive BASH scripting.
  32. 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. 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. 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

×