Uma pequena introdução ao Assembly para Linux

Paper publicado no zine Cogumelo Binário ( http://cogubin.leet.la/ ), sobre programação Assembly na sintaxe AT&T para Linux.

[ Hits: 37.338 ]

Por: Luiz Vieira em 19/12/2011 | Blog: http://hackproofing.blogspot.com/


Introdução



Muitas pessoas questionam a necessidade de aprender e conhecer o Assembly, que é uma das linguagens de programação de mais baixo nível que um ser humano, ao interagir com um sistema computacional, pode utilizar para codificar instruções.

Sabemos que existem basicamente três grande grupos de linguagens:
  • Baixo nível;
  • Alto nível;
  • Altíssimo nível.

E por incrível que pareça, nos cursos de computação atuais, os alunos costumam aprender linguagens de alto nível, quando não, apenas de altíssimo nível.

Por mais que eu seja fã de Python, Ruby ou Perl, sei que estas linguagens não são as melhores quando precisamos compreender como um sistema funciona realmente e como tratar diretamente com as instruções executadas pelo processador.

Logo, digamos que, quem aprende a programar hoje em dia, começa pela cereja do bolo, ao invés de debulhar o trigo para fabricar a farinha.

Este tipo de aprendizado, mesmo que seja com o foco no mercado de trabalho, pode ser danoso a longo prazo, pois estes profissionais possuem um conhecimento bem menor de Debugging e otimização de código, do que aqueles que sabem como funciona o Core de um sistema.

Daí surgiu a ideia deste pequeno material sobre Assembly. Em primeiro lugar, precisamos entender um pouco mais sobre como um processador funciona, de forma 'en passant' e depois vamos às instruções específicas desta linguagem.

Sei que muitos acham que os dados que os programas manipulam ficam todo residentes na memória RAM, o que é um grande engano. Nessa memória primária, e volátil, ficam apenas os dados maiores e que não estão sendo utilizados pelo processador em dado momento para a realização de algum tipo de operação.

Imaginem o trabalho que não seria para o processador ir até a memória, pegar os dados, processá-los e devolvê-lo, sempre trabalhando fora de seu núcleo. Isso demandaria um poder de processamento muito maior e também maior gasto de energia.

Nesse tipo de situação, a arquitetura adotada quando da criação dos processadores foi a seguinte: criar pequenos containers dentro do próprio processador, para que os dados utilizados em determinadas operações naquele dado momento, pudessem ser armazenados temporariamente para agilizar o processamento e aumentar a rapidez nas respostas.

Daí surgem os denominados registradores.
    Próxima página

Páginas do artigo
   1. Introdução
   2. Os registradores
   3. Primeiro programa
   4. Explicação e Segundo Programa
   5. Mais dois programas e conclusão
Outros artigos deste autor

Bypass de firewall com tunelamento por DNS

Ferramentas de segurança - uma pequena compilação

Metasploit Framework

PNL para Hacking

Vulnerabilidade em mais de 6 milhões de sites com flash

Leitura recomendada

Udev - Funcionamento e Regras

Treze razões pelas quais uma rede wireless é lenta

Interface Gráfica e Ambiente Integrado p/ Free Pascal

NagVis - Gestor de mapas pra lá de especial

VIM avançado (parte 1)

  
Comentários
[1] Comentário enviado por JJSantos em 19/12/2011 - 22:12h

Muito bom, mesmo....

[2] Comentário enviado por dimasdaros em 20/12/2011 - 16:35h

Ossa, eu aprendi assembly para PIC há uns 5 anos atrás, quando cursei um técnico em Eletrônica, não me lembro de quase nada, mas era meio diferente ainda hehe

Ótimo artigo.
Uma pergunta, não tive como ler o artigo ao todo, pois estou em horário de trabalho, mas existe alguma linguaguem de programação de baixo nível para web? Que os navegadores podem interpretar? Fiquei com essa dúvida agora, que estou estudando web.

Mas de qualquer forma excelente conteúdo, como todos os que você posta.
Parabéns

Abraço
dimasdaros.

[3] Comentário enviado por sacioz em 21/12/2011 - 13:25h

Sempre acompanho os artigos desse Senhor com interesse , éle é de dar medo de tanto que sabe.

[4] Comentário enviado por Lisandro em 22/12/2011 - 07:57h

Excelente artigo. Meus parabéns!

[5] Comentário enviado por firebits em 22/12/2011 - 14:47h

Faaaaaaala, Luiz. Brother, você usou o NASM para compilar os fontes dos programas?

[6] Comentário enviado por taiar em 22/12/2011 - 14:55h

Estranho é dizer algo como "Assembly para Linux" sendo que uma linguagem de montagem é algo utilizado para se controlar processadores e não sistemas.

Qual a plataforma desse código Assembly? Intel 8086? Sparc?????? Sem saber isso, esse artigo não tem nada haver...

[7] Comentário enviado por renan16 em 22/12/2011 - 15:28h

Muito bom

[8] Comentário enviado por 9u31220 em 24/12/2011 - 14:20h

Parabéns Luiz Vieira, o artigo está bom.

Na página 4 no comando de linkedição do programa leia foi usado #lf... ao invés de #ld...

Eu testei os programas aqui e o último não funcionou, ele não cria nenhum arquivo arquivo.txt.

Você poderia citar as fontes no final, posso estar enganado mas acho que tudo o que foi dito sobre a sintaxe AT&T, o ciclo de execução de instrução do processador e os registradores pode ser encontrado em http://download.savannah.gnu.org/releases/pgubook/

[9] Comentário enviado por luizvieira em 28/12/2011 - 18:50h

Valeu pessoal!

Rafael, além do Programming From the Ground Up, que inclusive indiquei em minha palestra sobre Exploits no Hack'n Rio, utilizei o livro abaixo como fonte:

The Art of Assembly Language - http://www.amazon.com/Art-Assembly-Language-Randall-Hyde/dp/1886411972/ref=cm_lmf_tit_9

E com relação a sintaxe AT&T e o ciclo de execução, confesso que sempre tenho em mente as explicações do livro citado (Programming From the Ground Up), mas o conteúdo não foi retirado ipsis literis do referido livro, posto que não há muito o que acrescentar nessas informações. Logo, o conteúdo deve estar bem parecido :-)

Sobre o comando, ld, valeu pela correção, devo ter deixado o dedo escorregar hehehe, mas percebi que o erro consta apenas na linkedição do segundo código.

Quanto ao último programa, darei uma olhada no que pode ser... O mesmo foi testado em um Ubuntu 11.10, com proc. Core i7 e funcionou bem. Inclusive acabei de testar e verifiquei que o funcionamento está ok.

[ ]'s

[10] Comentário enviado por luizvieira em 28/12/2011 - 18:59h

firebits, meu brother, utilizei o GNU Assembler, que é o padrão do Linux.

taiar, realmente o artigo não deve ter nada "haver" :-)

Mas para informar, a arquitetura é x86, como explicado na resposta acima dado ao 9u31220. E com relação ao título de Assembly para Linux, é apenas para frisar que o foco é a sintaxe AT&T, já que deve ter ficado bem claro no artigo que há duas sintaxes: Intel (Windows) e AT&T (Unix like).

[ ]'s

[11] Comentário enviado por 9u31220 em 28/12/2011 - 21:44h

@liuzvieira

vlw pelas fontes

Deculpe a minha preguiça em não depurar o que aconteceu que o último programa não funcionou aqui, eu estou usando um crunch bang 10 com proc intel atom.
O arquivo arquivo.txt foi aberto com modo de arquivo "O_RDWR" que é uma string (não deveria ser um número?). Bastou substituir a linha 37:

movl $perm, %ecx # modo do arquivo
por
movl $03101, %ecx

que funcionou.

[ ]'s


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts