📖
Introducao à segurança digital
  • Introdução à Segurança Digital
  • Introdução a Linux
  • Criptografia
    • Introdução
    • Definições e Objetivos
    • Criptografia Clássica
    • Criptografia Moderna
    • Guia de Python para criptografia
  • Redes
    • Ataques
      • Arp Cache Poisoning
      • DNS Cache Poisoning
      • Slow Loris
      • Syn Flood
      • WPA Cracking
      • Deauth
    • Ferramentas
      • Resumo das Ferramentas
      • Suíte Aircrack
      • Wireshark
      • Netcat
      • Nmap
      • Netstat
      • Kathará
    • Pacote & Protocolo
    • Camada de Rede
    • Camada de Transporte
    • IANA
    • Three-way Handshake
    • DHCP
    • DNS
    • NAT
    • Pentest
      • FTP
      • SMB
      • SSH
      • VPN
    • Avançado
  • Web
    • Semana 1
      • Introdução à Web
      • Entendendo as URLs
      • Introdução ao HTML e ao CSS
      • Directory Traversal
      • Introdução ao Javascript
      • Cross Site Scripting (XSS)
      • Cookies e sessões
      • Protocolo HTTP
      • Protocolo HTTPS
      • 2020 - XML External Entities (XML) Injection
    • Semana 2
      • Servidores Web
      • PHP (Programação server-side)
      • Command Injection
      • Cookie Poisoning
      • Bancos de Dados
      • SQL Injection
      • Insecure Direct Object Reference (IDOR)
      • 2020 - Portas e Serviços
      • 2020 - API's e Serviços Rest
  • CTF
  • Engenharia Reversa
    • Arquivos
    • Registradores e tipos de dados
    • Hello World em x86
    • Pilha
    • GDB
    • Ghidra
  • Pwning
    • Integer Overflow
    • Buffer Overflow
    • Pwntools
    • Shellcode
    • Proteções
  • Hardware
    • Introdução ao Hardware Hacking
    • Introdução ao Infravermelho
Powered by GitBook
On this page
  • Registradores e Tipos de Dados
  • Registradores
  • Set de Instruções

Was this helpful?

  1. Engenharia Reversa

Registradores e tipos de dados

Registradores e Tipos de Dados

Aqui estaremos estudando os registradores da arquitetura x86 e x86-64, seguindo principalmente o padrão da Intel.

Para guardar variáveis de forma no geral e passá-los de uma parte da memória para outra, a nossa principal ferramenta são os registradores.

Registradores

Na arquitetura x86 temos 8 registradores de propósitos gerais (ou GPR) de 32-bits, alguns deles também podem ser divididos em registradores de 8 e 16 bits.

Registradores de propósito geral

Como o próprio nome diz, esses registradores são de propósito geral, ou seja, podem ser usados para "qualquer coisa", mas usualmente seguem algumas convenções

Registrador

Convenção

16 - Bits

8 Bits

EAX

Acumulador, usado para operações aritméticas e para guardar resultados

AX

AH-AL

EBX

Registrador secundário, usado como "base" em operações de vetores

-

-

ECX

Contador em loops

-

-

EDX

Usado para guardar endereços de dados

-

-

Registradores de Endereços

Registrador

Propósito

16 - Bits

ESI

Fonte em operações de memória/strings

SI

EDI

Destino em operações de memória/strings

DI

EBP

Registrador base para a stack/pilha (frame atual)

BP

ESP

Pointeiro da stack/pilha

SP

Outros registradores

Registrador

Propósito

16 - Bits

EIP

Instruction Pointer (Program counter) - Indica em qual instrução a execução se encontra

-

EFLAGS

Guarda resultado de operações - Ex: Flag Zero

-

Set de Instruções

O conjunto de instruções x86 envolve o movimento de dados entre registradores e memória, classificados em 5 tipos:

  • Imediato para registrador

  • Registrador para registrador

  • Imediato para memória

  • Registrador para memória e vice-versa

  • Memória para memória - Somente nas arquiteturas RISC.

x86

O foco aqui será a sintaxe da Intel.

Intel vs AT&T

A AT&T prefixa os registradores com % e imediatos com $, o que não acontece na Intel. Eles também adicionam um prefixo à instrução para indicar o tamanho do dado da operação (long, byte, etc. ). Na sintaxe da Intel, o destino vem e, em seguida, a fonte (op dest source ), na AT&T é o contrário. (Pense em dest=fonte) As instruções têm comprimento variável (1 a 15 bytes ).

x86 usa colchetes ( [] ) para indicar acesso à memória (semelhante ao asterisco ( * ) em C / C ++ ) Para somar ou subtrair o endereço dentro de [] geralmente é usado hexadecimal, por exemplo: mov eax [ecx + 10h] - Onde h é usado para indicar notação hexadecimal.

Instruções

  • MOV - mov ecx, [eax]

    • Seta ecx = [eax]

  • ADD - inc dword ptr [eax]

    • Incrementa o valor no endereço eax.

  • SUB - sub eax, 0x20

    • Subtrai eax por 0x20 (32 em decimal).

  • PUSH - push eax

    • Coloca eax na stack.

  • POP - pop eax

    • Tira o endereço do topo da stack e salva em eax.

  • CMP - cmp eax, ebx

    • if (eax == ebx) seta eflags;

  • JNE - jne 0x400086

    • Pula para o endereço dado se eflags foi setado como igual.

  • CALL - call 0x400086

    • Pula para o endereço dado e salva a localização atual na stack. Equivalente às instruções:

      • push rip

      • jump 0x400086

  • RET - ret

    • Tira o endereço da stack e retorna o controle para aquela localização.

      • pop rip

  • LEA - lea eax, [esp+0x1c]

    • Move o endereço do registrador para outro. Usado para passar parâmetros para funções.

  • LEAVE - leave

    • Move ebp para esp e tira ebp da stack.

PreviousArquivosNextHello World em x86

Last updated 5 years ago

Was this helpful?