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

1.355 visualizações

Publicada em

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

0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.355
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
40
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

×