Anotações aula 03 - OPCODE #3

Open
opened 2025-07-07 20:57:49 -03:00 by victor_marinho · 0 comments

Anotações da aula 03

Utilizamos as seguintes ferramentas:

  • ndisasm
  • objcopy
  • hexedit
  • gdb
  • ld

Temos que ter estes programas como ferramentas apropriadas e estudar bastante o manual delas.

Infelizmente algumas dessas documentações não tão boas.

O principal uso que faremos delas é para analisar os códigos.

Em nosso curso, utilizaremos mais os registradores de propósito geral.

O que é segmentação?

Vamos pensar num processo na memória para ser executado. Os segmentos são divisões lógicas na memória.
Este mesmo espaço de endereçamento é fisicamente dividido em blocos minímos gerenciáveis pelo kernel. Eles são chamados de páginas. No Linux, nós vemos páginas de 4k. Em programas pequenos, a seção de texto vai parar em um segmento - divisão lógica - apenas para aquela área de texto. Já a seção de dados, vai pular mais 4k, para chegar no início de onde os próximos dados vai executar.
São faixas/espaços minímos de memória e os segmentos são divisões lógicas.
As divisões lógicas podem receber atributos.
E quando você excede o espaço de uma seção, você tem uma falha de segmentação. Você foi além daquele limite.

"A falha de segmentação é quando a gente pisa fora do cercadinho e leva uma invertida da polícia da memória", Felipe "Juca" Sanches.

Registradores

Temos 16 registradores de propósito geral, mas historicamente eles tinham usos específicos.
Exemplos: ax para acumulador, bx para base, cx para contador, dx destino, e por aí vai.
Na arquitetura 64 bits temos ainda mais oito registradores de r8 a r15. Suas partes são acessadas de forma diferente.

Registradores de flags

Vão receber operações. E alguns saltos condicionais vão ser feitos. Eu posso fazer a subtração, por exemplo, e condicionar um salto ao fato de a flag de sinal ter sido alterada para positivo ou negativo. Isto é usado como referência para saltos condicionais.
Esta subtração é feita com alguns comandos que fazemo o teste para alterar este registrador de flag. É o caso das comparações e teste.

Análise do código em binário/hexadecimal

Os códigos de operação são o ponto mais importante de hoje. E não como vismos nas aulas anteriores e sim com a dificuldade que teremos para consultar os manuais que temos para utilizar instruções minemônicas.

  • Intel 64 and 32 instruction Set Reference

01 /4 Add r32 to r/m32

Como podemos ler uma instrução dessas?

Ele apresenta várias combinação e variantes e ele apresenta mostra por exemplo que ele soma em r/m(registrador ou memória) e o segundo registrador apenas(r), com origem e destino. O resultado vai para o primeiro operando.

# Anotações da aula 03 Utilizamos as seguintes ferramentas: * _ndisasm_ * _objcopy_ * _hexedit_ * _gdb_ * _ld_ Temos que ter estes programas como ferramentas apropriadas e estudar bastante o manual delas. Infelizmente algumas dessas documentações não tão boas. O principal uso que faremos delas é para analisar os códigos. Em nosso curso, utilizaremos mais os registradores de propósito geral. ## O que é segmentação? Vamos pensar num processo na memória para ser executado. Os segmentos são divisões lógicas na memória. Este mesmo espaço de endereçamento é fisicamente dividido em blocos minímos gerenciáveis pelo kernel. Eles são chamados de páginas. No Linux, nós vemos páginas de 4k. Em programas pequenos, a seção de texto vai parar em um segmento - divisão lógica - apenas para aquela área de texto. Já a seção de dados, vai pular mais 4k, para chegar no início de onde os próximos dados vai executar. São faixas/espaços minímos de memória e os segmentos são divisões lógicas. As divisões lógicas podem receber atributos. E quando você excede o espaço de uma seção, você tem uma falha de segmentação. Você foi além daquele limite. >"A falha de segmentação é quando a gente pisa fora do cercadinho e leva uma invertida da polícia da memória", Felipe "Juca" Sanches. ## Registradores Temos 16 registradores de propósito geral, mas historicamente eles tinham usos específicos. Exemplos: _ax_ para acumulador, _bx_ para base, _cx_ para contador, _dx_ destino, e por aí vai. Na arquitetura 64 bits temos ainda mais oito registradores de r8 a r15. Suas partes são acessadas de forma diferente. ## Registradores de flags Vão receber operações. E alguns saltos condicionais vão ser feitos. Eu posso fazer a subtração, por exemplo, e condicionar um salto ao fato de a flag de sinal ter sido alterada para positivo ou negativo. Isto é usado como referência para saltos condicionais. Esta subtração é feita com alguns comandos que fazemo o teste para alterar este registrador de flag. É o caso das comparações e teste. ## Análise do código em binário/hexadecimal Os códigos de operação são o ponto mais importante de hoje. E não como vismos nas aulas anteriores e sim com a dificuldade que teremos para consultar os manuais que temos para utilizar instruções minemônicas. * Intel 64 and 32 instruction Set Reference _01 /4 Add r32 to r/m32_ Como podemos ler uma instrução dessas? Ele apresenta várias combinação e variantes e ele apresenta mostra por exemplo que ele soma em r/m(registrador ou memória) e o segundo registrador apenas(r), com origem e destino. O resultado vai para o primeiro operando.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: blau_araujo/pbn#3
No description provided.