Uma breve introdução a Engenharia Reversa e como isso pode ser aplicado na exploração de software para indentificarmos vulnerabilidades e criar exploits.
6. Os dois lados da moeda
Lado “bom”
Análise de malware
Procurar e corrigir erros em
software
Soluções anti-pirataria
Entre outras...
Lado “mal”
Exploração de vulnerabilidades
Quebra de patentes
Quebra de direitos intelectuais
Cheats
Pirataria
Entre outras...
14. Instruções
✘ Instruções são blocos que constroem
um programa
✘ Tradução do dissassembler
✘ Instrução MOV ECX, 0x42
✘ Opcodes B9 42 00 00
00
15. Registradores
✘ Registradores de uso geral são utilizados pela
CPU durante a execução do programa.
✘ Registradores segmentados são utilizados para
mapear seções da memória.
✘ Flags de status são utilizadas para a tomada de
decisões.
16. EIP (Instruction Pointer)
✘ Endereço da próxima instrução a ser
executada
✘ “Em um ataque, controle o EIP e seja
feliz”
17. Nosso objetivo é manipular o fluxo de execução do
programa para executar oque queremos.
Memória para funções: variáveis locais, parâmetros
Controle do fluxo do programa
PUSH (empilha), POP (desempilha)
LIFO, last in, first out
ESP (stack pointer) e EBP (base pointer)
Alocação de endereços top-down
O objetivo da Stack é chamar funções.
Existem 2 registradores na CPU associados à Stack, o EBP (Extended Base Pointer) e o ESP (Extended Stack Pointer)
ESP aponta para o topo da Stack, e o EBP aponta para o início do frame.
Quando uma função é chamada, argumentos, EIP e EBP são inseridos na stack.
EBP é “setado” para o ESP, e o ESP é diminuído para criar espaço para as variáveis locais das funções.