quinta-feira, 16 de outubro de 2008

ShellCoding parte 2 - asm básico > 2.1 sistemas numéricos

Não tem, ou melhor, não deveria ter outra forma de introduzir alguém a uma linguagem sem passar por esse tema.
Sinta-se livre para passar por ele se já o conhecer.
Vou passar bem rápido por esse tema, ele é simples demais para perdermos tempo nele.
 Um sistema numérico, é uma representação visual de uma contagem seqüencial.
Cada símbolo representa o número seguinte a ser contado, quando não há mais símbolos nós repetimos o segundo da seqüência ao lado esquerdo do número que estamos escrevendo e voltamos o número inicial ao seu primeiro símbolo.(famoso esquema do “vai um”)
A base que normalmente usamos para representar números é a decimal, logo nós temos:
1, 2, 3, 4, 5, 6, 7, 8, 9 e 10
Certo?
Errado!
0, 1, 2, 3, 4, 5, 6, 7, 8 e 9
É a seqüência certa... 
Quando chegamos o no número nove (9) nós voltamos ao zero (0) e colocamos um ao seu lado para representar que já ultrapassamos da nossa seqüência uma vez e assim em diante.
Isso é fácil, mas é a base para qualquer base numérica, como a binária.
A base binária só tem dois números, o zero e o um e subseqüentemente segue a mesma lógica que a decimal para representar os mesmos números...
Vamos ver algumas representações em binário
Binário | Decimal
0            | 0
1             | 1
10          | 2
11           | 3
100        | 4
101         | 5
110         | 6
111         | 7
1000     | 8
1001      | 9

1010      | 10


Como podemos ver, cada vez que passamos do número de símbolos que temos, aumentamos um número a esquerda tanto na base decimal quanto na binária.
Parece bobeira de tão fácil, e é. Lolz
Geralmente nós temos que trocar de uma base para outra... Para trocar da base decimal para a binária e vice-versa eu uso uma tabela comum para técnicos e engenheiros eletrônicos, mas pouco comum no mundo da informática.
Ela é lógica e bem simples.
Vou fazer um exemplo da conversão do número 9 para binário utilizando ela.

16 | 8 | 4 | 2 | 1 <- cabeçalho  

0   | 1 | 0 | 0 | 1

Essa tabela é composta por um cabeçalho, esse cabeçalho define colunas baseando-se em potencias de dois:

2 ^ 0 (^ significa “elevado a”) = 1

2 ^ 1 = 2

2 ^ 2 = 4

2 ^ 3 = 8

Esse cabeçalho pode ter quantos números você desejar.

Depois o que fazemos é pegar o número do cabeçalho que mais se aproxima do número que queremos transformar pra binário( 9 ), no nosso caso pegamos o oito. Depois nós pegamos um número que possamos somar com o oito para se tornar nove.( o um/1) Nas colunas dos números que nós pegamos nós colocamos o número um (1), em todas as outras, zero.

Vamos transformar o número 512 em binário para treinarmos. (PS: essa tabela é ótima para fazer em concursos porque ela é rápida e prática, melhor do que dividir milhares de vezes por dois e pegar o resto) 

512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1  

  1    |   0   |  0    | 0   | 0   | 0   | 0 | 0 | 0 | 0

Isso mesmo! Como já achamos o 512 de primeira, o resto é tudo zero... Acreditem, da outra maneira vocês iriam gastar muito tempo dividindo por dois até o final de suas vidas. Lolz

E se o número fosse 511.. bem como temos um número antes de uma potencia de dois, é só marcar 1 em todas as colunas anteriores.. vejam:

512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 

  0   |   1    |   1    |  1     |  1   |  1  | 1  | 1 | 1 | 1

111111111 é a resposta... Se quiserem somar todos os números anteriores com a calculadora de seus computadores verão que eu estou certo. E para fazer o processo inverso?! Isso é, transformar um número binário em decimal? Usamos nossa tabela novamente. Digamos que queiramos converter o número 111 para decimal...

8 | 4 | 2 | 1 <- cabeçalho

0 | 1 | 1 | 1

Agora é só somarmos os números que estão acima de cada 1 binário...

4+2 = 6

6 + 1 = 7

E pronto.

Nós também temos a base hexadecimal, que tem a seguinte seqüência simbólica: 0 1 2 3 4 5 6 7 8 9 A B C D E F Com ‘A’ representando o ‘10’, ‘B’ o ‘11’, ‘C’ o ‘12’ e assim por diante...  Converter binário para hexadecimal e vice-versa é muito simples.

O maior número individual hexadecimal é igual ao maior número contido em um nibble(4 casas binárias/ 1 1 1 1) Então, cada número hexadecimal, nós convertemos para um nibble.. por exemplo “FF”(255) O primeiro F é o mesmo que 15 em decimal e corresponde ao nibble 1 1 1 1 e o segundo outra sequencia de quatro 1’s.

Logo, 1 1 1 1 1 1 1 1.

Só mais uma para termos um melhor idéia da operação..

O número A1 para binário vira  

A 1

1010 0001

Eu normalmente faço a transformação de hexadecimal para decimal usando o deslocamento extra para não ter que ficar multiplicando fatores de 16.

Por exemplo o FF.

F = 15

E um dos F’s está uma casa a frente do primeiro.

150 > uma casa decimal acescentada + 15 = 165

O deslocamento é 90(15 * 6).
Logo, 90 + 165 = 255

Eu gosto dessa maneira porque me permite fazer de cabeça.. no entanto meus amigos acham ela de uma dificuldade absurda, talvez porque eu tenha criado ela de cabeça a um bom tempo atrás e acaba ficando mais fácil pra mim que visualizei a lógica por trás da conta do que para quem não visualizou a mesma. \=

Então não vou me ater a ela tanto assim.Vamos a técnica mais popular.Cada casa hexadecimal corresponde a uma quantidade de vezes que nós passamos dos 16 símbolos.

Logo, em FF 

Nós temos
F x 16^0
+
F x 16^1
O que dá 255.
O procedimento contrário(transformar números decimais em hexadecimais se dá através de divisões consecutivas do número por 16 até não podermos mais dividir o resultado.

Let’s see it.

255 / 16 = 15,9375
15 é igual a F.
Ai nós multiplicamos o resto
0,9375 x 16 = 15
15 é F também, logo ‘FF’.

Para quem não entendeu, é porque eu realmente estou correndo... Infelizmente nem sempre a minha explicação é o suficiente, então se sinta à vontade para procurar em outros lugares a explicação sobre essa mesma matéria, eu pessoalmente recomendo esse link>
http://www.numaboa.com.br/informatica/oiciliS/assembler/textos/binHexPort.php

Clique aqui para ler a continuação

Nenhum comentário:

Postar um comentário

><))).>