Mazel Tov!
Hoje vou mostrar como inverter os bits dos valores em assembly:
Vamos ao codigo:
#forum.guiadohacker.com.br
.section .text
.globl _start
_start:
nop
movl $0x12345678, %ebx
bswap %ebx
movl $1, %eax
int $0x80
Salve como algo.s ou algo.asm
Vamos usar o assembler:
as -gstabs -o algo.o algo.s
Vamos linkar:
ld -o algo algo.o
Mais uma vez esse programa nao faz nada, mas vamos usar nosso debugger
para analisar melhor:
gdb -q algo
Vamos setar um breakpoint para ele parar a execução:
break *_start
Execute-o com o "run" e aperte "s" ou "next" para percorrer o programa:
Analisando o valor de EBX antes do BSWAP:
print/x $ebx
Nos retorna seu valor: 0x12345678
Depois do BSWAP o registrador EBX tem seu valor alterado:
EBX = 0x78563412
E isso que o BSWAP faz: inverte os bytes.
Vou ressaltar que ele não muda os bits em si e sim os bytes, exemplo:
EBX = 0x12345678
BSWAP EBX
ERRADO --> EBX = 0x87654321
CORRETO->> EBX = 0X78563412
Pense que como são numeros em hexa cada caractere equivale a 4bits.
E como o BSWAP Inverte os BYTES e não os bits o valor apresentado esta certo.
Mas para que isso afinal?
Well... Isso vai produzir um valor big-endian de um valor little-endian, isso
eh util quando vamos trabalhar em computadores e sistemas diferentes.
Para esclarecer um pouco oque é big e little endian vou citar um exemplo:
Temos o valor 0x04030201
Big-Endian: Armazena o byte mais significativo(maior) antes:
04 | 03 | 02 | 01
X | X+1 | X+2 | X+3
Sendo X um local de memoria, percebe-se que 04(maior valor) foi armazenado no
menor endereco.
Little-Endian:
Valor: 0x04030201
01 | 02 | 03 |04
X | X+1 | X+2 |X+3
O LE armazena o byte menos significante no menor endereco.
Para melhor entendimento, troque os valores a serem armazenados e rode no GDB.
Att. p0w3ll
Hoje vou mostrar como inverter os bits dos valores em assembly:
Vamos ao codigo:
#forum.guiadohacker.com.br
.section .text
.globl _start
_start:
nop
movl $0x12345678, %ebx
bswap %ebx
movl $1, %eax
int $0x80
Salve como algo.s ou algo.asm
Vamos usar o assembler:
as -gstabs -o algo.o algo.s
Vamos linkar:
ld -o algo algo.o
Mais uma vez esse programa nao faz nada, mas vamos usar nosso debugger
para analisar melhor:
gdb -q algo
Vamos setar um breakpoint para ele parar a execução:
break *_start
Execute-o com o "run" e aperte "s" ou "next" para percorrer o programa:
Analisando o valor de EBX antes do BSWAP:
print/x $ebx
Nos retorna seu valor: 0x12345678
Depois do BSWAP o registrador EBX tem seu valor alterado:
EBX = 0x78563412
E isso que o BSWAP faz: inverte os bytes.
Vou ressaltar que ele não muda os bits em si e sim os bytes, exemplo:
EBX = 0x12345678
BSWAP EBX
ERRADO --> EBX = 0x87654321
CORRETO->> EBX = 0X78563412
Pense que como são numeros em hexa cada caractere equivale a 4bits.
E como o BSWAP Inverte os BYTES e não os bits o valor apresentado esta certo.
Mas para que isso afinal?
Well... Isso vai produzir um valor big-endian de um valor little-endian, isso
eh util quando vamos trabalhar em computadores e sistemas diferentes.
Para esclarecer um pouco oque é big e little endian vou citar um exemplo:
Temos o valor 0x04030201
Big-Endian: Armazena o byte mais significativo(maior) antes:
04 | 03 | 02 | 01
X | X+1 | X+2 | X+3
Sendo X um local de memoria, percebe-se que 04(maior valor) foi armazenado no
menor endereco.
Little-Endian:
Valor: 0x04030201
01 | 02 | 03 |04
X | X+1 | X+2 |X+3
O LE armazena o byte menos significante no menor endereco.
Para melhor entendimento, troque os valores a serem armazenados e rode no GDB.
Att. p0w3ll