1/2
Tutorial: Engenharia Reversa em sistemas GNU/Linux
Fernando Mercês VOL DAY II
2/2
3/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
●
Básico com NASM
●
Técnicas de ER –
Fishing
–
Byte patching
–
Unpacking
4/2
Agenda –
Debugging
●
Considerações finais
●
Documentação e recursos
●
Perguntas
5/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.
6/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ódigofonte.
7/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:
8/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
9/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.
10/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.
11/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
12/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)
13/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.
14/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.
15/2
O formato ELF $ objdump d tato 00000000004006c8 <_init>: 4006c8:
sub $0x8,%rsp
4006cc:
callq 40079c
4006d1:
callq 400830
4006d6:
callq 400a70 <__do_global_ctors_aux>
4006db:
add $0x8,%rsp
4006df:
retq
16/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.
17/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
18/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!
19/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...
20/2
Assembly ●
Chamando sub-rotinas: CALL
●
Return: RET
●
Chamando interrupções: INT
●
OU exclusivo: XOR
●
Lendo um endereço: LEA
21/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.
22/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.
23/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.
24/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.
25/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.
26/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.
27/2
●
Projeto open source.
●
Debugger de uso geral.
●
Indicado para aplicações sem source.
●
Similar ao OllyDbg.
28/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. ;)
29/2
KeyGen ●
É possível fazer um keygen com qualquer linguagem que se conheça, inclusive BASH scripting.
30/2
Documentação e recursos http://asm.sourceforge.net http://linuxreversing.org http://codef00.com www.reverse-engineering.net www.slideshare.net/nandu88
31/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?
32/2
Obrigado
Fernando Mercês [email protected] www.4linux.com.br www.hackerteen.com twitter.com/FernandoMerces twitter.com/4LinuxBR Tel: 55-11-2125-4747