* 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= e =sub=) - Instruções de multiplicação e divisão (=mul=, =imul=, =div= e =idiv=) - Instrução =jmp= (salto incondicional) - Instruções de salto condicional - Instrução =cmp= - Instrução =test= - Instruções =call= e =ret= - Instrução =syscall= - Padrões frequentemente utilizados - 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//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