linuxcon 2010: tutorial - reverse engineering on gnu/linux systems

34
1/2 Tutorial: Engenharia Reversa em sistemas GNU/Linux Fernando Mercês LinuxCon 2010 Brazil

Upload: fernando-merces

Post on 24-May-2015

1.135 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

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

1/2 Tutorial: Engenharia Reversa em sistemas GNU/Linux

Fernando Mercês

LinuxCon 2010 Brazil

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

2/2

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

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.

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

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

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

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

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

6/2

Agenda– Debugging

● Curiosidade: um keygen em shell script● Considerações finais● Documentação e recursos● Perguntas

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

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.

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

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.

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

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:

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

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

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

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.

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

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.

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

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

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

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)

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

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.

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

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.

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

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 

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

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.

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

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

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

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!

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

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

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

22/2

Assembly

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

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

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.

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

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.

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

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.

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

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.

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

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.

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

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.

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

29/2

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

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

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. ;)

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

31/2

KeyGen

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

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

32/2

Documentação e recursos

http://asm.sourceforge.net

http://linuxreversing.org

http://codef00.com

www.reverse-engineering.net

www.slideshare.net/nandu88

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

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?

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

34/2

Obrigado

Fernando Mercê[email protected]

www.4linux.com.brwww.hackerteen.com

twitter.com/FernandoMercestwitter.com/4LinuxBR

Tel: 55-11-2125-4747