pbn/curso/contents.org

5.8 KiB
Raw Permalink Blame History

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/<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