A mágica do dc

50 views
Skip to first unread message

Elgio Schlemer

unread,
Dec 22, 2010, 8:05:29 AM12/22/10
to tche...@googlegroups.com
Fiquei devendo a alguns da lista uma explicação detalhada de como eu gerei aquela mensagem, aparentemente criptografada. Não enviei antes pois pretendia fazê-lo com riqueza de detalhes. Pensei até em escrever um artigo no Viva o Linux (onde contribuo) e talvez ainda o faça.

O dc, para quem não conhece, é uma calculadora de notação polonesa.

Como qualquer aluno de programação sabe, pois certamente já teve que implementar algo em Linguagem de Programação ou Estrutura de Dados, a notação polonesa funciona sobre uma pilha.

Se para somar 200 com 500 se faz no bc (outra calculadora):

echo "200 + 300" | bc

No dc é um pouco diferente:

echo "200 300 + p" | dc

Onde se lê:
  • Empilha o 200
  • Empilha o 300
  • Operador + precisa de dois parâmetros. Desempilha dois parâmetros e soma (200 e 300)
  • Empilha o resultado da operação (500)
  • Imprime (sem desempilhar) o valor do topo da pilha (comano 'p'). No caso 500

Ao final da operação a pilha está vazia

Um exemplo mais completo para ilustrar de vez o conceito:

echo "200 3 4 5 6 7 + * - + + p" | dc

  • "200 3 4 5 6 7" são todos EMPILHADOS. A pilha está com o 7 sendo o TOPO
  • Operador de +, desempilha o 7 e o 6 e soma: 7+6 = 13. Empilha o 13. A pilha está agora com "200 3 4 5 13"
  • Operador de *, desempilha o 13 e o 5 e multiplica: 13*5 = 65. Empilha. A pilha agora está com "200 3 4 65"
  • Operador de -, desempilha o 65 e o 4 e faz 4-65= -61. Empilha. A pilha está agora com "200 3 -61"
  • Operador de +, desempilha o 3 e o -61 e soma: 3+ (-61) = -58. Empilha. A Pilha está agora com "200 -58"
  • Operador de +, desempilha o 200 e o -58 e soma: 200 + (-58) = 142. Empilha. A pilha está agora com "142"
  • Operador p, imprime o valor do topo. Imprime 142
Ok. Isto quanto ao dc.

Lembrando o mais importante neste caso: o comando 'p', minúsculo, apenas imprime o que está no topo da pilha. Apenas um valor, não importa quantos estão na pilha.

Já o comando P (Maiúsculo) faz uma impressão diferente. Ele imprime interpretando ASCII.

Veja:

echo "65 p" | dc # irá imprimir 65
echo "65 P" | dc # irá imprimir a letra A


O dc é um interpretador de comandos. Se você apenas digitar "dc" ele irá aguardar comandos. Por isto que se usa o echo junto com o pipe para evitar que ele aguarde que você digite algo.

Ou então pode-se usar o parâmetro -e, passando o que se quer digitar como parâmetro:

dc -e "65p"
dc -e "65P"


O último dc, se você está me acompanhando e reproduziu em seu terminal, imprimiu um A perdido, quase não notado antes do prompt.

Seria interessante ter uma quebra de linha, certo?

No mundo Unix a quebra de linha é reproduzida apenas com o caractere LF (Line Feed) que na tabela ASCII corresponde ao valor 10.

No mundo DOS uma quebra de linha precisa de LF+CR (Line Feed + Enter) que na tabela ASCCI é 10 e 13. Para quem não entendeu, isto explica porque o teu código em bash feito no Linux não abre corretamente no (sic) notepad. Isto é tão comum que já existem nas distribuições aplicativos como dos2unix e unix2dos apenas para converter de e para o formato de texto DOS.

Então para termos a nossa quebra de linha:

dc -e "65 P 10 P"

Meu nome neste formato:

dc -e "69P 108P 103P 105P 111P 32P 83P 99P 104P 108P 101P 109P 101P 114P 10P"

Deixei espaço em branco para facilitar, mas ele não é necessário:

dc -e "69P108P103P105P111P32P83P99P104P108P101P109P101P114P10P"

Isto já é um pouco nerd, mas ainda não tem graça. Tem muito 'P' ai e quem conhece ASCII logo iria sacar: "69 => 'E'

A grande vantagem o comando P é que ele pode pegar um inteiro qualquer e ler como uma string!!

Vamos com um exemplo pequeno: o 'A' seguido de quebra de linha:

dc -e "65P10P"

Se a gente pensar no 65 na memória (UM BYTE) e o 10 na memória (UM BYTE), porém pegar estes DOIS bytes juntos e ver qual inteiro dá, o que teríamos?

O caminho mais prático para isto é transformar em HEXA:

65 => 0x41
10 => 0x0A


(usei a notação 0x por ser a notação do C)

Então teriamos 0x410A como  a junção da letra 'A' (65) com um LF (10).

Qualquer calculadora me diz que 0x410A = 16650 em decimal.


Então:

dc -e "16650P"

Voalá!

Agora vem a parte divertida: fazendo a mesma coisa com o meu nome (estou usando agora fonte FIXA para dar uma ideia de tabela)

'E' lgio Schlemer

STRING => 'E' 'l' 'g' 'i' 'o' ' ' 'S' 'c' 'h' 'l' 'e' 'm' 'e' 'r' LF
DECIMAL=> 69  108 103 105 111  32  83  99 104 108 101 109 101 114 10
HEXA   => 45   6C  67  69  6F  20  53  63  68  6C  65  6D  65  72 0A

Agora temos que pegar este ENORME número em HEXA (456C67696F205363686C656D65720A) e ver qual é o ENORME inteiro que ele representa.

Tem várias maneiras de fazer isto. Neste tutorial irei sugerir o bc que é muito versátil na conversão de bases:

echo -ne "ibase=16\n456C67696F205363686C656D65720A\n"|bc
(indico que a entrada, ibase, é na 16).

Isto me dá o simpático número 360467176607105907189923076131615242

Então:

dc -e "360467176607105907189923076131615242P"

A medida que a string aumenta em caracteres, o número inteiro atinge proporções ALARMANTES.

dc -e "
277201296679637797555446024759571638996189735149437200489138275766068595461885161373164910801694181693794226357412355299879133847920069570025933844008821898437588589611533P"

Para evitar problemas com os contes, linhas muito longas, pode-se usar o contra barra. No bash, assim como no C, a contra barra indica que a linha ainda não acabou, continuando na linha de baixo.

dc -e "277201296679637797555446024759571638996\
1897351494372004891382757660685954618851613731\
6491080169418169379422635741235529987913384792\
0069570025933844008821898437588589611533P"


Você pode, agora, simplesmente copiar o trecho acima e colar no seu terminal. Nem precisa colocar em um arquivo. Só dê um ENTER final para enviar o comando.

Como o # é comentário, isto também é aceito:

# INICIO. Copie a partir daqui
dc -e "277201296679637797555446024759571638996\
1897351494372004891382757660685954618851613731\
6491080169418169379422635741235529987913384792\
0069570025933844008821898437588589611533P";\
# FIM. Copie ate aqui

Além dos caracteres em ASCII eu também coloquei na string sequências de ESCAPE que indicam limpar a tela e imprimir em colorido.

Isto pode ser demonstrado com qualquer echo:

echo -e "\033[2JLimpei a tela. \033[0;31;1mVermelho\033[m Normal\n"

A sequência ESC [0;31;1m configura o terminal para um vermelho negrito. No caso do echo o ESCAPE foi representado por \033, ou seja, o octal 33. Se for colocado do decimal do ESC mesmo não precisaria o -e do echo.

O \033[m
volta o terminal a configuração normal.

Assim como o Rafael Jeffman mostrou um código em python que transforma uma string em um inteiro gigante que a representa, eu tenho um programinha em bash mesmo para fazer isto.

Bem, era isto. Escrevi este email em um só fôlego, portanto é possível que tenham erros (não o revisei).


Por fim:

dc -e "2570P47124526397124574873853331168207446777\
76557321296532173690633106694284207747615688075869\
0137565983871170813168141
P2570P"

-- 
Elgio Schlemer - ULBRA - http://gravatai.ulbra.tche.br/~elgio 
Coordenador do curso de Ciência da Computação  Ulbra Gravataí 
http://www.vivaolinux.com.br/perfil/verPerfil.php?login=elgio
***** "Eu sei que foi pago um alto preço" (Asaph Borba) *****



Paulo Diovani

unread,
Dec 22, 2010, 9:40:59 AM12/22/10
to tche...@googlegroups.com
Ficou muito bom, Elgio.
Recomendo que coloque mesmo artigo no viva o Linux.

__
Paulo Diovani Gonçalves
http://diovani.com

Veja:

Meu nome neste formato:

dc -e "69P108P103P105P111P32P83P99P104P108P101P109P101P114P10P"

dc -e "65P10P"


Então:

dc -e "16650P"

Voalá!

'E' lgio Schlemer

Então:

dc -e "360467176607105907189923076131615242P"

dc -e "
277201296679637797555446024759571638996189735149437200489138275766068595461885161373164910801694181693794226357412355299879133847920069570025933844008821898437588589611533P"


Por fim:


--
Mensagem enviada para <http://groups.google.com/group/tchelinux>.

Leonardo Salvadori

unread,
Dec 22, 2010, 9:45:19 AM12/22/10
to tche...@googlegroups.com
Realmente muito bom artigo, de grande utilidade.

Marcos Carraro

unread,
Dec 22, 2010, 10:44:36 AM12/22/10
to tche...@googlegroups.com
Seu Elgio, coloque no Viva o Linux, pois garanto que não muito desses artigos na internet, ira ajudar muita galera...

Abraços

--
Mensagem enviada para <http://groups.google.com/group/tchelinux>.



--
att
Marcos Carraro
Linux user #511627

Paulo Diovani

unread,
Dec 22, 2010, 11:17:37 AM12/22/10
to tche...@googlegroups.com
Estive pensando em publicar no meu blog também, se o Elgio der permissão, claro. Daí depois faço um trackback para o post no viva-o-linux.

Que achas, Elgio?

__
Paulo Diovani Gonçalves
http://diovani.com

Elgio Schlemer

unread,
Dec 22, 2010, 1:12:33 PM12/22/10
to tche...@googlegroups.com
Mas claro, tch�.

At� porque um artigo exige mais detalhes.

irei fazer, mas com fim de semestre, filha chegando...

Acho que s� no meio de Janeiro

Em 22-12-2010 14:17, Paulo Diovani escreveu:
> Estive pensando em publicar no meu blog tamb�m, se o Elgio der permiss�o, claro. Da� depois fa�o um trackback para o post no viva-o-linux.
>
> Que achas, Elgio?
>
> __
> Paulo Diovani Gon�alves


> http://diovani.com
>
> From: tche...@googlegroups.com [mailto:tche...@googlegroups.com] On Behalf Of Marcos Carraro
> Sent: Wednesday, December 22, 2010 1:45 PM
> To: tche...@googlegroups.com

> Subject: Re: [TcheLinux] A m�gica do dc
>
> Seu Elgio, coloque no Viva o Linux, pois garanto que n�o muito desses artigos na internet, ira ajudar muita galera...
>
> Abra�os


>
> Em 22 de dezembro de 2010 12:45, Leonardo Salvadori <leo.sa...@brturbo.com.br> escreveu:
> Realmente muito bom artigo, de grande utilidade.
>
>
>
> Em 22 de dezembro de 2010 12:40, Paulo Diovani <pa...@diovani.com> escreveu:
>
> Ficou muito bom, Elgio.
> Recomendo que coloque mesmo artigo no viva o Linux.
>
> __

> Paulo Diovani Gon�alves


> http://diovani.com
>
> From: tche...@googlegroups.com [mailto:tche...@googlegroups.com] On Behalf Of Elgio Schlemer
> Sent: Wednesday, December 22, 2010 11:05 AM
> To: tche...@googlegroups.com

> Subject: [TcheLinux] A m�gica do dc
>
>
>

Henrique

unread,
Dec 22, 2010, 1:58:51 PM12/22/10
to tche...@googlegroups.com
Parabéns pela criatividade na msg trazendo um tanto de inteligência e perspicácia no atual momento do forum...

Certamente pedirei autorização para linkar o teu artigo caso seja oficialmente publicado..

Grande Abraço!!

Henrique
:: obiwan ::

Vinicius Mello

unread,
Dec 22, 2010, 2:05:24 PM12/22/10
to tche...@googlegroups.com
On 12/22/2010 04:12 PM, Elgio Schlemer wrote:
> Mas claro, tch�.
>
> At� porque um artigo exige mais detalhes.
>
> irei fazer, mas com fim de semestre, filha chegando...
>
> Acho que s� no meio de Janeiro

O artigo est� excelente. D� pra copiar e colar no viva o linux.

Tu vai deixar esperando milhares de pessoas ansiosas pra mandar msgs de
Feliz Natal com o dc. Em janeiro j� passou clima...

# echo 0 >/proc/cerebro/perfeccionismo


Abra�o,
vmm.

Elgio Schlemer

unread,
Dec 22, 2010, 2:06:00 PM12/22/10
to tche...@googlegroups.com
Aproveito o email para avisar a todos.

Tudo que eu escrevo, exceto opiniões pessoais, ou seja, tudo que eu escrevo do ponto de vista técnico, já está, desde a sua concepção, autorizado a ser amplamente divulgado.

Os artigos do Viva o Linux também.

Claro que a única coisa que se espera é a preservação dos créditos, mas conhecimento só faz sentido quando amplamente compartilhado.
(o que, nada mais é, do que a espinha dorsal do TchêLinux).

(Claro que uma rápida revisão ortográfica é bem vinda. Eu realmente escrevi o texto em uma tacada só e enviei. Já vi alguns erros :-D)

Quanto ao Viva o Linux: eu mantenho uma pequena lista de assuntos que desejo escrever no Viva o Linux. Esta lista está com 43 itens (e o dc não está na lista).

Mas haja tempo (OK é que já escrevi)

OK - estrutura iptables
OK - estrutura iptables 2 - nat
OK - Protecao conta SYN Flood
OK - A matematica das mascaras de rede
OK - senhas no Linux e Windows (salt numbers)
OK - Ponto Flutuante em C
OK - Sinais em Programacao C
OK - Introducao a criptografia
OK - Algoritmos simetricos de bloco e de fluxo
OK - Login por desafio e resposta no SSH
OK - Túneis com SSH
OK - Fundamentos da criptografia assimétrica
OK - Algoritmo Assimetrico RSA
OK - Parâmetros interessantes do scanf e do printf em C
OK - Programação com números inteiros gigantes
OK - Introcução a Firewall (Stateless  e Statefull)

- WPAD
- modulo owner iptables
- funcoes com varios parametros em C

- Como escrever artigos (dicas)
- Dois dominios x um certificado (Jefferson Pizzo)
- Gnupg
- Recursividade: um mal necessario
- Introducao a Seguranca (o que eh, pilha TCP, principais defesas)
- Continuacao do artigo de mascaras
- WEP
- Aumentando a seguranca com ARP estático
- Manual pratico do bom programador
- ataques de numero sequencial TCP
- ataques de fragmentacao de pacotes IP
- lstarr e chattr
- Tecnicas de sniffar em switch

- métodos de pesquisa (estrutura de dados)
- Criando Sockets em C
- scanner de portas (voce esta sendo constantemente sondado)
- Firewall modo bridge
- broadcast e multicast
- hubs, bridges, vlans e 802.1q
- estudo de sistemas de arquivos (inodes, vant, desv)
- Uso do Recent do Iptables para SSH force brute
- pam limits para freiar DoS Local
- Comparativo quebra N Java x C
- poderes do nmap
- poderes do hping
- Uso do sudo (http://www.vivaolinux.com.br/artigo/Comando-sudo-instalacao-e-configuracao/)
- 802.1q no Linux
- calculadoras do bash

- MINI servidor http para redirecionar trafego
- concorrencia em TCP
- concorrencia em UDP
- Autenticacao transparente em wireless
- protocolo ssl, chave publica e privada
- A pilha TCP/IP
  - enlace
  - rede
  - transporte
  - aplicacao

Elgio Schlemer

unread,
Dec 22, 2010, 2:10:54 PM12/22/10
to tche...@googlegroups.com

Os artigos do Viva o Linux s�o moderados.

Ao postar um moderador ir� verificar se n�o � pl�gio, se n�o tem erros
de portugu�s e se � relevante.

Como o artigo tem erros e eu sou um dos moderadores, fazer copy and
paste seria uma chamada recursiva a mim mesmo :-)

E estou com o artigo de WPAD no topo da minha lista (se bem que o WPAD
pretendia publicar via Seguran�a Linux, um fork do Viva o Linux)

[]'s


Reply all
Reply to author
Forward
0 new messages