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.299 ]

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


Mais dois programas e conclusão



Vamos ver agora um terceiro programa. Simples também, mas que resgata uma informação que já se encontra em determinados segmentos de memória do processador: o seu fabricante.

 #OBJETIVO: escrever algo dentro de um arquivo txt
 #
 #ENTRADA: nenhuma
 #
 #OUTPUT: arquivo open.txt com uma frase de conteúdo
 #
 #VARIÁVEIS:
 # string1 = mensagem a ser exibida
 # string2 = o que será escrito dentro do arquivo
 # tam1   = tamanho de string1
 # tam2 = tamanho de string2
 # arq = path e nome do arquivo
 # perm = modo do arquivo, que estará como leitura/escrita
 #

 .section .data
 string1: .string "Criar um arquivo e inserir conteúdo \n"
 tam1: .long . - string1
 string2: .string "Cogumelo binário\n"
 tam2: .long . - string2
 arq: .string "/tmp/arquivo.txt" 
 perm: .string "O_RDWR"

 .section .text

 .globl _start
 _start:

 movl $4, %eax      # syscall write
 movl $1, %ebx
 leal string1, %ecx
 movl tam1, %edx
 int $0x80

 movl $5, %eax       # syscall open (5)
 movl $arq, %ebx    # arquivo que será aberto
 movl $perm, %ecx    # modo do arquivo
 movl $0, %edx       # Permissão 0 
 int $0x80

 movl %eax, %esi    # Move o retorno da funcao open para ESI


 movl $4, %eax      # syscall write, para efetuar a escrita no arquivo
 movl %esi, %ebx    # local de escrita, arquivo.txt
 leal string2, %ecx    # escrita do conteúdo de string2 para dentro do arquivo
 movl tam2, %edx    # O tamanho da variavel
 int $0x80


 movl $6, %eax      # syscall close (6)
 movl %esi, %ebx    # Fecha o arquivo
 int $0x80

 movl $1, %eax
 movl $0, %ebx
 int $0x80


Vamos ficar por aqui com esse paper, mas há muito mais coisas a serem ditas sobre Assembly. A gente nem sequer chegou nos loops e estruturas condicionais com JMP.

Mas acredito que tenha sido possível, ao menos, fazer com que tenham um primeiro contato com essa linguagem tão poderosa. Quem sabe em um outro paper, não nos aprofundamos mais no assunto?

Até a próxima!

Cogumelo Binário:
Previamente publicado em:
Página anterior    

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

Elevação de privilégios locais

SELinux - Security Enhanced Linux

Cheops: uma ótima ferramenta de rede

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

Distribuição CAINE Linux para forense digital: em Live-CD, pendrive, máquina virtual ou direto em seu Ubuntu 10.04

Leitura recomendada

Criando um LiveCD do FreeBSD

Gerenciamento de pacotes no Slackware Linux

Por que e como referenciar artigos nos sites de informática

Impressione seus amigos mudando as músicas no seu computador pelo celular

Sabayon 5.0 - Uma nova distro multimídia (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