Códigos

Aprenda várias formas de representar dados no computador e suas aplicações em CTFs.

Dados e códigos

Nos computadores, todos os dados são guardados da mesma forma: em código binário. Esse código é como uma sequência de '0's e '1's, e essas sequências são agrupadas e sofrem modificações para representar tudo o que vemos em um computador.

Mas se tudo são apenas zeros e uns, o que diferencia um texto de uma música? A diferença é o modo como esses dados são representados.

Para cada tipo de dado existe uma codificação diferente aplicada a ela, e por isso um mesmo dado pode ter várias interpretações dependendo da codificação que você trabalha.

Um exemplo de uma representação de um valor binário é como um número.

Um número em binário pode ser convertido para um número em decimal. Por exemplo, 00101010 é o número 42 em decimal.

Uma representação mais comum para um código binário é a base hexadecimal, que tem a vantagem de que cada casa pode representar uma sequência de 4 bits. Por exemplo, o mesmo número 00101010 é 2A em hexadecimal (0010 = 2 e 1010 = A).

Nas próximas seções, você verá outras formas de representar os dados no computador.

Código ASCII

Nessa seção, vamos apresentar uma das codificações mas famosas para representar texto em um computador: o ASCII.

O nome ASCII vem do inglês American Standard Code for Information Interchange que significa "Código Padrão Americano para o Intercâmbio de Informação"

O ASCII, originalmente baseado no inglês, codifica 128 caracteres específicos com 7 bits. Como um computador normalmente trabalha na escala de bytes (8 bits), o ASCII é mais frequentemente encontrado numa representação de 8 bits.

A tabela abaixo mostra todos os caracteres do código ASCII.

ascii-table.png

Você pode usar essa tabela para decodificar uma sequência de números em binário, decimal ou hexadecimal para ASCII.

ASCII em Python

Uma maneira mais fácil de manipular a codificação ASCII, em vez de usar manualmente uma tabela, é por meio de códigos. Em Python, usamos as funções ord() e chr() para isso.

A função ord() recebe uma string de tamanho 1 e retorna um inteiro que representa o código da letra, se ela for ASCII, devolverá seu código ASCII. Por exemplo, ord('a') devolverá 97.

Já a função chr() é o inverso da anterior. Ela recebe um inteiro e devolve o caractere com o respectivo código ASCII. Por exemplo, chr(97) devolverá 'a'.

Exercícios

WeChall: ASCII

WeChall: URL

Referências

ASCII table

Python Built-in Functions

Base64

Agora que você já teve contato com o código ASCII, vamos conhecer o Base64, um método para codificar e decodificar dados binários em caracteres ASCII.

Esse método é utilizado frequentemente para transferir dados em meios que só suportam formatos ASCII, por exemplo, enviar anexos por e-mail (que usa o MIME).

O nome base64 origina-se do fato de que esse sistema é constituido de 64 caracteres, representando exatamente 6 bits de dados. Com isso, três bytes de 8 bits podem ser representados por 4 digitos de 6 bits em Base64.

A tabela abaixo mostra a equivalência entre os valores de um conjunto de 6 bits e os caracteres usados para codificação.

Quando os bits da mensagem original não são multiplos de 6, são adicionados zeros como padding. Assim, na mensagem codificada é colocado um = para cada dois zeros de padding. Aliás, esse = é uma forma bem comum de reconhecer um texto codificado em Base64.

Abaixo está um exemplo de um texto codificado em Base64:

texto:          M        |        a        |        n
8 bits:  0 1 0 0 1 1 0 1 | 0 1 1 0 0 0 0 1 | 0 1 1 0 1 1 1 0
6 bits:  0 1 0 0 1 1 | 0 1 0 1 1 0 | 0 0 0 1 0 1 | 1 0 1 1 1 0       
Valor:        19     |      22     |      5      |      46
texto:        T      |      W      |      F      |      u
(Base64)

E se tirarmos o n, a codificação vai necessitar de um padding:

texto:          M        |        a        |  
8 bits:  0 1 0 0 1 1 0 1 | 0 1 1 0 0 0 0 1 |  
6 bits:  0 1 0 0 1 1 | 0 1 0 1 1 0 | 0 0 0 1 0 0 | 0 0 0 0 0 0      
Valor:        19     |      22     |      5      |  (padding)
texto:        T      |      W      |      E      |      =
(Base64)

Ferramentas

Para manipular textos em Base64, pode-se usar o comando Unix base64.

Por exemplo, se tivermos uma arquivo sagan.txt com o texto The Cosmos is all that is or ever was or ever will be. Podemos convertê-lo para um arquivo sagan64.txt com o comando

base64 sagan.txt > sagan64.txt

O resultado será o arquivo sagan64.txt com o texto VGhlIENvc21vcyBpcyBhbGwgdGhhdCBpcyBvciBldmVyIHdhcyBvciBldmVyIHdpbGwgYmUK.

Agora, para decodificar o arquivo sagan64.txt, usamos o mesmo comando com a flag -d:

base64 -d sagan64.txt

Exercícios

OverTheWire: Krypton 0

Decodifique essa mensagem