O documento apresenta um tutorial sobre engenharia reversa em sistemas GNU/Linux, abordando tópicos como o formato ELF de binários, técnicas como fishing, byte patching e unpacking, além de debugging e um exemplo de keygen em shell script.
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/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/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/2
Agenda
– Debugging
● Curiosidade: um keygen em shell script
● Considerações finais
● Documentação e recursos
● Perguntas
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/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/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/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/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/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/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
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/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.
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/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/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/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/2
Assembly
● Chamando sub-rotinas: CALL
● Return: RET
● Chamando interrupções: INT
● OU exclusivo: XOR
● Lendo um endereço: LEA
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/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/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/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/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/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/2
● Projeto open source.
● Debugger de uso geral.
● Indicado para aplicações sem source.
● Similar ao OllyDbg.
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/2
KeyGen
● É possível fazer um keygen com
qualquer linguagem que se conheça,
inclusive BASH scripting.
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/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?