LinuxCon 2010: Tutorial - Reverse Engineering on GNU/Linux Systems
-
Upload
fernando-merces -
Category
Documents
-
view
1.135 -
download
0
description
Transcript of LinuxCon 2010: Tutorial - Reverse Engineering on GNU/Linux Systems
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 64bit LSB executable, x8664, 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: UNIXSystem 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ê[email protected]
www.4linux.com.brwww.hackerteen.com
twitter.com/FernandoMercestwitter.com/4LinuxBR
Tel: 55-11-2125-4747