5.8 KiB
- 0 – Introdução à linguagem Assembly (NASM)
- 1 – Arquitetura de computadores
- 2 – Linguagens, montagem e compilação
- 3 – O formato binário ELF
- 4 – Mapeamento de memória
- 5 – Pilha de hardware e pilha de memória
- 6 – Vetor de argumentos de linha de comando
- 7 – Vetor de ambiente
- 8 – Fluxos de dados
0 – Introdução à linguagem Assembly (NASM)
- O que é Assembly
- Linguagem dependente da arquitetura
- Linguagem de montagem
-
Classificações da linguagem
- De baixo nível de abstração (segunda geração)
- Imperativa
- De tipagem inexistente
- Com gerenciamento manual de memória
- Compilada via montagem
- Paradigmas
- De uso específico
-
Comparação com outras linguagens
- Não há estruturas de controle
- Não há o conceito de variáveis
- Ponteiros, só por analogia
- Em vez de tipos, quantidades de bytes
-
Por que aprender Assembly?
- Entendimento do funcionamento de computadores
- Depuração e análise
- Integração com C
- Aprendizado
-
Principais sintaxes
- Sintaxe AT&T
- Sintaxe Intel
- Compatibilidade
-
O Netwide Assembler (NASM)
- Sintaxe de instruções
- Sintaxe de metaprogramação da montagem
- Operadores e símbolos
- Seções no NASM
- Importação e exportação de símbolos
- Tipos de operandos em instruções
-
Instruções essenciais
- Instrução
mov
- Instrução
lea
- Instruções aritméticas básicas (
inc
,dec
,add
esub
) - Instruções de multiplicação e divisão (
mul
,imul
,div
eidiv
) - Instrução
jmp
(salto incondicional) - Instruções de salto condicional
- Instrução
cmp
- Instrução
test
- Instruções
call
eret
- Instrução
syscall
- Padrões frequentemente utilizados
- Instrução
-
Montagem e execução de programas em Assembly NASM
- Requisitos
- Exemplo: "Salve, simpatia!"
1 – Arquitetura de computadores
-
Modelo de von Neumann
- Influência nas arquiteturas modernas
- Gargalo de Von Neumann
-
Arquiteturas x86
- Características
- Gerações da família x86:
- Comparativo com outras arquiteturas
- Componentes de uma CPU x86_64
-
Principais registradores e seus propósitos (64 bits)
- Relação com outras arquiteturas x86
-
Primeiro exemplo em Assembly x86_64
- Seção do código executável
- O ponto de entrada
- Chamada de sistema
- Montagem e execução (no terminal)
2 – Linguagens, montagem e compilação
-
Do código-fonte ao binário
- Arquivos texto e binários
- Formato de binário executável
- Programação em código de máquina
- Linguagens de baixo e alto nível
-
Sistemas de tradução de linguagens
- Linguagens interpretadas
- Linguagens compiladas
- Linguagens de montagem
-
Um programa em Assembly
- Tamanho do binário em bytes
- Informações gerais do arquivo
- Cabeçalho do formato ELF
- Lista de seções do programa
- Despejo do conteúdo (em hexa) da seção .text
- Despejo do conteúdo (em hexa) da seção .rodata
-
Uma versão equivalente em C
- Tamanho do binário em bytes:
- Informações gerais do arquivo
- Cabeçalho do formato ELF
- Lista de seções do programa
- Despejo do conteúdo (em hexa) da seção .text
- Despejo do conteúdo (em hexa) da seção .rodata
- Desmontagem comparativa
3 – O formato binário ELF
-
O que é o formato ELF
- Principais tipos de arquivos objeto
- Formato do arquivo
- Seções especiais
- Tipos de segmentos
-
Definindo seções ELF em NASM para Linux 64 bits
- Uma nota sobre alinhamento de dados
- Inspecionando a seção .rodata
- Inspeção da seção .data
- Inspecionando a seção .bss
4 – Mapeamento de memória
-
Como programas são executados
- O que são processos
- Layout da memória virtual de um processo
- Explorando os espaços de endereços de processos
-
Mapeamento de memória de um programa em C
- Análise com 'pmap'
- Análise com o arquivo /proc/<pid>/maps
-
Mapeamento de memória de um programa em Assembly
- Análise com o GNU Debugger (GDB)
- Executáveis independentes de posição (PIE)
5 – Pilha de hardware e pilha de memória
- Objetivos
-
O conceito de pilha (stack)
- Implementação da pilha como estrutura de dados
- Aplicações típicas
- Operações associadas às pilhas
- Pilha de memória
- Pilha de hardware
- Registradores e a pilha de memória
-
Convenções de chamadas de funções (System V AMD64 ABI)
- Ordem dos argumentos
- Valor de retorno
- Registradores preservados e não preservados
- Exemplo em C
- Quadro de pilha (stack frame)
-
Convenções de chamadas de sistema
- Exemplo em Assembly
- Preservação de registradores com a pilha
- Resumo comparativo com chamadas de funções
6 – Vetor de argumentos de linha de comando
- O quadro inicial da pilha do processo
-
Inspecionando argumentos e variáveis exportadas
- Contador de argumentos
- Primeiro elemento do vetor de argumentos
- Separador nulo do vetor de argumentos
- Primeiro elemento do vetor ambiente
- Resultados com mais de um argumento
-
Acesso aos argumentos em baixo nível
- Acesso direto à pilha
- Acesso em Assembly exportando main
-
Listando todos os dados de argumentos
- Exemplo em Assembly com main e gcc
- Exemplo com acesso direto à pilha
7 – Vetor de ambiente
- Revisão: o quadro inicial da pilha do processo
- Localizando o vetor de ambiente
- Extraindo valores de variáveis exportadas
- Implementação com funções da linguagem C
8 – Fluxos de dados
-
Tabela de descritores de arquivos
- Uma nota sobre tipos de arquivos
- Descritores de arquivos padrão
- Abstração em alto nível (stream)
-
Uso dos fluxos de dados padrão no shell
- Mecanismo de redirecionamento
- Mecanismo de pipe
- Captura da entrada padrão
-
Uso dos fluxos de dados padrão em programas
- Demonstrando um redirecionamento interno
- Demonstrando um pipe interno
- Demonstrando a leitura da entrada padrão
- Identificando a origem do fluxo de leitura
- Criação e manipulação de fluxos de dados
-
Armazenamento temporário (bufferização)
- Bufferização em alto nível
- Bufferização no nível do kernel
- Bufferização em Assembly