UNIVERSIDADE CATÓLICA DE GOIÁS DEPARTAMENTO DE COMPUTAÇÃO GRADUAÇÃO EM CIÊNCIA DA COMPUTAÇÃO

Tamanho: px
Começar a partir da página:

Download "UNIVERSIDADE CATÓLICA DE GOIÁS DEPARTAMENTO DE COMPUTAÇÃO GRADUAÇÃO EM CIÊNCIA DA COMPUTAÇÃO"

Transcrição

1 UNIVERSIDADE CATÓLICA DE GOIÁS DEPARTAMENTO DE COMPUTAÇÃO GRADUAÇÃO EM CIÊNCIA DA COMPUTAÇÃO EXPLORANDO FALHAS DE SEGURANÇA EM SOFTWARE PEDRO ROURE MALTA DE SÁ GOIÂNIA 2007

2 UNIVERSIDADE CATÓLICA DE GOIÁS DEPARTAMENTO DE COMPUTAÇÃO GRADUAÇÃO EM CIÊNCIA DA COMPUTAÇÃO EXPLORANDO FALHAS DE SEGURANÇA EM SOFTWARE Trabalho de Projeto Final de Curso apresentado por Pedro Roure Malta de Sá à Universidade Católica de Goiás, como parte dos requisitos para a obtenção do título de Bacharel em Ciência da Computação aprovado em 07 / 12 / 2007 pela Banca examinadora: Professor Cláudio Martins Garcia, UCG Orientador Professor Ulisses Rodrigues Afonseca Professor Iwens Gervásio Sene Júnior

3 EXPLORANDO FALHAS DE SEGURANÇA EM SOFTWARE PEDRO ROURE MALTA DE SÁ Trabalho de Projeto Final de Curso apresentado por Pedro Roure Malta de Sá à Universidade Católica de Goiás, como parte dos requisitos para obtenção do título de Bacharel em Ciência da Computação. Professor Claúdio Garcia Orientador Professor Jeovah Martins Coordenador de Projeto Final de Curso

4 RESUMO De acordo com o CERT, a maior parte dos ataques realizados com sucessos resultam da exploração de vulnerabilidades em software conhecidas, cuja uma correção não foi desenvolvida e se foi desenvolvida não foi aplicada ao software, e devido a configurações inseguras do software, como opções de configurações padrões amplamente conhecidas pelos atacantes e que não são alteradas pelo administrador do sistema. Softwares devem ser desenvolvidos com a segurança deste em mente. É impossível desenvolver software que sejam totalmente ausente de falhas, no entanto, é possível minimizar a ocorrência destas no software e/ou minimizar o impacto que elas terão uma vez que foram encontradas. Vulnerabilidades em software podem ser introduzidas neste durante diferentes fases do ciclo de vida do software. No entanto, as fases mais comuns são: Design: Quando você esta pensando sobre o software. Implementação: Quando você está escrevendo a aplicação. Manutenção: Depois que a aplicação está em produção. Como uma regra geral, as vulnerabilidades em software mais difíceis de serem consertadas, são aquelas provenientes de decisões na fase de design do software. Por exemplo, vamos supor que durante o design de uma aplicação cliente-servidor que será utilizada para transferir dados sigilosos entre uma empresa matriz e suas filiais via Internet, o engenheiro de software opte por não utilizar nenhum tipo de criptografia ( nem para os dados, nem para

5 autenticação que permitira acesso ao sistema ). Essa decisão de design pode ter grandes impactos no futuro. Pois os dados que trafegarem pela rede poderam facilmente serem interceptados por um hacker, utilizando de um sniffer. Dependendo dos dados que são manipulados por essa aplicação, o prejuízo pode ser de milhares de dólares. Uma mudança nessa decisão de design ( a não utilizaçao de criptografia ) depois que esse software estivesse pronto, poderia exigir tantas alterações no software, inclusive na implementação deste, que talvez fosse necessário recomeçar todo o ciclo de desenvolvimento do software. As vulnerabilidades introduzidas durante a fase de implementação são as mais comuns de serem encontradas, e são dependentes da linguagem na qual a aplicação será escrita. O que implica que a escolha da linguagem na qual a aplicação será escrita, implicará na conjunto de técnicas utilizadas para exlorar vulnerabilidades introduzidas nesta fase. Vulnerabilidades também podem ser introduzidas no software mesmo depois que esse se encontra em operação, quando alterações são feitas a esse. São comuns os casos onde vulnerabilidades foram introduzidas no software durante a fase de manutenção do software, quando correções ( patches ) são aplicadas ao software. Ou seja, uma correção aplicada ao software com o intuito de corrigir uma vulnerabilidade existente acaba por introduzir uma outra vulnerabilidade. Ou seja, a segurança de um software não pode ser incorporada a este depois que este estiver pronto assim como se fosse um plugin. Para que um software seguro seja construído, a segurança deste deve ser pensada em todas as fases do ciclo de desenvolvimento do software, e mesmo depois que este for entrege e estiver em operação, quando manutenções forem feitas a este.

6 As vulnerabilidades introduzidas durante a fase de implementação é que serão o foco de nossos estudos. Mostraremos vulnerabilidades comuns de serem encontradas em aplicações escritas em linguagem C. Focaremos nas vulnerabilidades que permitem aos atacantes controlarem a execução da aplicação sendo explorada e possivelmente executar códigos arbitrários no sistema sendo atacado. No capítulo 1, mostraremos como o os códigos arbitrários que serão executados no sistema sendo atacado, uma vez que a execução da aplicação for controlada, são constrúidos pelos atacantes. Esses códigos arbitrários, são comumente chamados de shellcodes. No capítulo 2, mostraremos como algumas técnicas de programação segura e a utilização de firewalls podem ser usadas para evitar que shellcodes simples, como os mostrados no capítulo 1, sejam inseridos e executados com sucesso no sistema sendo atacado. Mostraremos também técnicas mais avançadas para escrita de shellcodes, que podem ser usadas para burlar as técnicas de programação descritas e a proteção oferecida por firewalls. No capítulo 3, falaremos sobre estouro de buffer, um tipo comum de vulnerabilidade de implementação encontrada em aplicações escritas em linguagem C. Estouros de buffer podem ocorrer em diferentes áreas de memória no espaço de endereçamento do processo, discutiremos técnicas para exploração de vulnerabilidades de estouro de buffer que ocorrem na área de pilha e heap do processo. Mostraremos também alguns avanços nessa área, tanto por parte da comunidade de segurança, quanto por parte dos atacantes. Palavras-Chave: Shellcode, Exploits, Estouro de Buffer, Estouro de Pilha, Estouro de Heap, Segurança em Software.

7 ABSTRACT In accordance with the CERT, most of the attacks carried through with successes results of the exploration of vulnerabilities in software known, whose a correction was not developed and if it was developed was not applied to software, and had the unsafe configurations of software, as standard configurations options widely known by the aggressors and that they are not modified by the system administrator. Softwares must be developed with the security of this in mind. It is impossible to develop software that is total absent of flaws, however, it is possible to minimize the occurrence of these in software and/or to minimize the impact that they will have a time that they had been found. Vulnerabilities in software can be introduced in this during different phases of the software life cycle. However, the phases most common are: Design: When you are thinking about the software. Implementation: When you are writing the application. Maintenance: Later that the application is in production. As a general rule, the most difficult vulnerabilities in software to be fixed, are those proceeding from decisions in the phase of design of software. For example, we go to assume that during design of an application client-server who will be used to transfer secret data between a first company and its branch offices using Internet, the software engineer opts to

8 not using no type of cryptography (nor for the data, nor for authentication that allows access to the system). This decision of design can have great impacts in the future. Because the data that pass through the network could be easily be intercepted for hacker, using a sniffer. Depending of the data that are manipulated by this application, the damage can be of thousand of dollars. A change in this design decision (the no use of cryptography) later that this software was ready, could demand as many alterations in the software, also in the implementation of this, that perhaps was necessary to recommence all the software development cycle. The vulnerabilities introduced during the implementation phase are most common to be joined, and are dependents of the language in which the application will be written. What it implies that the choice of the language in which the application will be written, will imply in the set of used techniques to explore vulnerabilities introduced in this phase. Vulnerabilities also can be introduced in the same software later that this if finds in operation, when alterations are made to this. It is common to happen cases where vulnerabilities had been introduced in software during the phase of maintenance of software, when corrections (patches) are applied to software. That is, a correction applied to software with intention to correct an existing vulnerability finishes for introducing one another vulnerability. That is, the security of a software cannot be incorporated later when the job is done as it was a plugin. So that a safe software is constructed, the security of this must be thought about all the phases of the software development cycle, and same later that this will be entrege and be in operation, when maintenances will be made to this. To write a secure software, the

9 security of this must be thought in all the phases of the cycle of the development of the software, even when the software is delivered and in operation when maintenances will be made to this. The vulnerabilities introduced during the implementation phase is what will be the focus of our studies. We will show common vulnerabilities to be joined in applications written in language C. We Will focus in the vulnerabilities that allows the hackers to control the execution of the application being explored and to execute arbitrary codes in the attacked system being been. In chapter 1, we will show how the arbitrary codes that will be executed in the attacked system, once the execution of the application will be controlled, are constructed by the hackers. These arbitrary codes, are often called shellcodes. In chapter 2, we will show how some techniques of safe programming and the use of firewalls can be used to prevent that simple shellcodes, as the shown in chapter 1, can be inserted and executed successfully in the attacked system. We will also show more advanced techniques for writing of shellcodes, that they can be used to dupe the described techniques of programming and the protection offered for firewalls. In chapter 3, we will speak about buffer overflow, a common type of vulnerability of implementation found in applications written in language C. Buffers overflow can occur in different areas of memory in the addressing space of the process, we will argue techniques for exploration of vulnerabilities of buffer overflow that occur in the stack area and heap of the process. We will also show some advances in this area, as much on the part of the security community, how much on the part of the hackers.

10 Keywords: Shellcode, Exploits, Buffer Overflow, Stack Overflow, Heap Overflow, Software Security.

11 EXPLORANDO FALHAS DE SEGURANÇA EM SOFTWARE SUMÁRIO 1. SHELLCODE BÁSICO INTRODUÇÃO BÁSICO DE ASSEMBLER REGISTRADORES CHAMADAS DE SISTEMA BÁSICO DE SHELLCODE PROBLEMA DO ENDEREÇAMENTO TÉCNICA DO JUMP E CALL USANDO A PILHA PROBLEMA DOS BYTES NULOS ESCREVENDO SHELLCODES ESCREVENDO UMA MENSAGEM NA TELA REINICIANDO O SISTEMA OBTENDO UM SHELL LOCALMENTE OBTENDO UM SHELL REMOTAMENTE ENCONTRANDO O SHELLCODE SHELLCODE AVANÇADO ESCREVENDO PROGRAMAS SEGUROS MINIMIZANDO PRIVILÉGIOS USUÁRIOS GRUPOS E PROCESSOS PROGRAMAS SET-UID E SET-GID PRINCÍPIO DO MENOR PRIVILÉGIO CHAMADAS DE SISTEMAS RELACIONADAS RESTAURANDO PRIVILÉGIOS TEMPORARIAMENTE RETIRADOS 26

12 LIMITANDO OS ARQUIVOS DO SISTEMA VISIVEIS PELO PROCESSO QUEBRANDO UMA CHROOT USANDO A SYS_CHROOT DE FORMA SEGURA VALIDAÇÃO DE ENTRADA CENÁRIO CENÁRIO BLOQUEANDO SHELLCODES NA REDE FIREWALLS O QUE É UM FIREWALL FIREWALLS E O LINUX NETFILER E IPTABLES ESCOLHENDO UMA POLÍTICA PADRÃO BLOQUEANDO SHELLCODES COM FIREWALLS CENÁRIO CENÁRIO CENÁRIO CENÁRIO CENÁRIO ESTOURO DE BUFFER PRINCIPAIS CAUSAS ESPAÇO DE ENDEREÇAMENTO DE UM PROCESSO CÓDIGO DADOS INICIALIZADOS DADOS NÃO-INICIALIZADOS HEAP PILHA TIPOS DE ESTOURO DE BUFFER HISTÓRICO ESTOURO DE PILHA CHAMADAS DE PROCEDIMENTO VARIÁVEIS LOCAIS E PARÂMETROS DE UM PROCEDIMENTO 59

13 COLOCANDO TUDO EM PRÁTICA LIBSAFE LIBVERIFY STACKGUARD POINTER SUBTERFUGE ALTERANDO PONTEIROS NOS ARGUMENTOS DE UMA FUNÇÃO ALTERANDO PONTEIROS PARA FUNÇÕES ALTERANDO PONTEIROS PARA DADOS STACK SMASH PROTECTOR ( SSP ) ESTOURO DE HEAP ALOCADOR DE MEMÓRIA DINÂMICA NO LINUX: DOUG LEA MALLOC CHUNKS DE MEMÓRIA BOUNDARY TAGS CAMPO SIZE BINS ADICIONANDO E REMOVENDO CHUNKS DE UMA BIN EXPLORANDO A MACRO UNLINK() SEÇÃO.DTORS GLIBC CONCLUSÃO REFERÊNCIAS BIBLIOGRAFICAS ANEXOS EXPLOIT PARA ESTOURO DE PILHA 101

14 LISTA DE FIGURAS Figura 1.1 Técnica do Jump e Call 04 Figura 1.2 Usando a Pilha Figura 1.3 Usando a Pilha Figura 1.4 Arquivo - write-push.s 08 Figura 1.5 Arquivo - test-write-push.c 09 Figura 1.6 Arquivo - reboot.s 11 Figura 1.7 Arquivo - test-reboot.c 11 Figura 1.8 Arquivo - execve-push.s 13 Figura 1.9 Arquivo - port-bind.s 15 Figura 1.10 Arquivo - test-port-bind.c 17 Figura 1.11 Seção NOP Sled Tradicional 19 Figura 2.1 Arquivo - test-setuid.c 24 Figura 2.2 Arquivo - setuid-execve.s 27 Figura 2.3 Arquivo - break-chroot1.c 29 Figura 2.4 Arquivo: break-chroot2.c 30 Figura 2.5 Arquivo test-toupper.c 35 Figura 2.6 Arquivo - execve-iptables.s 40 Figura 2.7 Arquivo - connect-back.s 42 Figura 2.8 Arquivo - test-connect-back.c 43 Figura 2.9 Arquivo port-bind-fork-stop.s 49 Figura 2.10 Arquivo - test-port-bind-fork.c 51 Figura 3.1 Espaço de Endereçamento de Um Processo 56 Figura 3.2 Protótipo das Instruções CALL e RET 59 Figura Arquivo vuln-buf.c 60 Figura 3.4 Estado da Pilha Durante a Chamada de um Procedimento 61 Figura 3.5 Arquivo - vuln-buf.c - Modificado 65 Figura 3.6 Estado da Pilha Durante a Chamada de um Procedimento Aplicação Protegida Pelo StackGuard 70

15 Figura 3.7 Funções do GCC Alterados pelo StackGuard 71 Figura 3.8 Arquivo pointer-subterfuge1.c 73 Figura 3.9 Arquivo pointer-subterfuge2.c 74 Figura 3.10 Arquivo heap1.c 77 Figura 3.11 Boundary Tag de um Chunk 80 Figura 3.12 Chunk de Memória Alocado 80 Figura 3.13 Chunk de Memória Livre 81 Figura 3.14 Macro Unlink() 85 Figura 3.15 Macro Frontlink() 85 Figura 3.16 Arquivo heap2.c 87 Figura 3.17 Buffer Utilizado Para Estourar buff1 89 Figura 3.18 Figura 3.18 Arquivo exploit_malloc.c 90

16 LISTA DE TABELAS Tabela 1 Subdivisões dos registradores EAX, EBX, ECX e EDX 02 Tabela 2 Chamadas de Sistema SYS_EXIT e SYS_WRITE Tabela 3 Chamadas de Sistema SYS_EXIT e SYS_WRITE Tabela 4 Chamadas de Sistema SYS_SYNC e SYS_REBOOT 1 10 Tabela 5 Chamadas de Sistema SYS_SYNC e SYS_REBOOT 2 10 Tabela 6 Opções de Ações Para SYS_REBOOT 10 Tabela 7 Chamadas de Sistema SYS_EXECVE 1 12 Tabela 8 Chamadas de Sistema SYS_EXECVE 2 12 Tabela 9 Chamadas de Sistema SYS_SOCKETCALL 1 14 Tabela 10 Chamadas de Sistema SYS_SOCKETCALL 2 14 Tabela 11 Sub-funções da Chamada de Sistema SYS_SOCKETCALL 14 Tabela 12 Chamadas de Sistema SYS_DUP Tabela 13 Chamadas de Sistema SYS_DUP Tabela 14 Minimização de Privilégios Chamadas de Sistemas 23 Tabela 15 Limitando os arquivos do sistema visíveis pelo processo Chamadas de Sistemas 28 Tabela 16 Chamadas de Sistema SYS_FORK 1 47 Tabela 17 Chamadas de Sistema SYS_FORK 2 48 Tabela 18 Sub-função SYS_SETSOCKOPT 48

17 1 CAPÍTULO 1 Shellcode Básico 1.1 Introdução Shellcode corresponde a um conjunto de instruções de máquina, normalmente, sem conter bytes NULOS que será inserido no espaço de memória de um processo em tempo de execução. Uma vez que, não é possível se determinar exatamente onde o shellcode se encontrara na memória, este deve ser escrito como um código de maquina independente de posição (PIC Position Independent Code). A técnica de escrita de shellcodes tem de desenvolvido bastante nos últimos anos, e isso se deve principalmente aos avanços concorrentes nas técnicas para impedir que shellcodes possam ser inseridos e executados em programas. O nome shellcode foi dado inicialmente, devido ao fato de que normalmente essas instruções visavam obter uma Shell (interpretador de comandos) no sistema sendo atacado, no entanto, essas instruções podem executar praticamente qualquer tarefa no sistema sendo atacado. Ataques de corrupção de memória que objetivam o ganho sobre o controle da execução do programa quando bem sucedidos fazem o uso do shellcode para executarem instruções no alvo comprometido com permissões do usuário sobre o qual o processo estava sendo executado. De forma geral, quando conseguimos controlar a execução do programa devemos desviar a execução deste para o nosso shellcode. Uma exceção a regra, é quando desviamos a execução do programa para instruções já se encontram na memória do processo, nesse caso o uso de shellcode não é necessário. 1.2 Básico de Assembler Os shellcodes aqui trabalhados serão escritos em Assembler, e posteriormente terão seus opcodes extraídos para então poderem ser utilizados. Introduziremos apenas os conceitos básicos necessários para escritas de nossos shellcodes. Conhecimentos avançados de Assembler serão introduzidos à medida que nossos shellcodes forem se tornando mais complexos. Uma vez que o shellcode é escrito em assembler, podemos concluir que este é

18 2 dependente da arquitetura sobre a qual o sistema está sendo executado, uma vez que o conjunto de instruções disponíveis é diferente entre arquiteturas diferentes. Nos concentraremos em shellcodes para a arquitetura x Registradores Os processadores Intel x86 possuem oito registradores de propósito geral de 32 bits. Apesar de serem chamados de registradores de propósito geral, algumas tarefas são especificas de cada um e não podem ser realizadas por nenhum outro. O uso correto desses registradores é que tornam os shellcodes eficientes e otimizados, veremos por exemplo, que o uso de registradores menores diminuem o tamanho do shellcode e evitam bytes NULOS em nosso shellcode. Desses oito registradores, os registradores EAX, EBX, ECX e EDX possuem subdivisões de 16 bits e 8 bits, como mostrado na tabela abaixo: 32 Bits 16 Bits 8 Bits ( Alto ) 8 Bits ( Baixo) EAX AX AH AL EBX BX BH BL ECX CX CH CL EDX DX DH DL Tabela 1 Subdivisões dos registradores EAX, EBX, ECX e EDX Os registradores EAX, AX, AH, AL são conhecidos como acumuladores, esses são utilizados principalmente em cálculos, muitas operações implicitamente fazem uso desses registradores, como por exemplo a instrução MUL que realiza uma multiplicação nãosinalizada do valor contido em um dos registradores EAX, AX, AL, com o valor de um operando que é passado para instrução. Esses registradores também são utilizados para armazenar o numero de uma chamada do sistema quando necessitamos de um recurso do kernel. Os registradores EBX, BX, BH, BL são conhecidos como registradores base. Normalmente, eles são utilizados para armazenar ponteiros. Os registradores ECX, CX, CH, CL são conhecidos como contadores, eles são utilizados implicitamente por instruções que realizam loops como, LOOP, LOOPZ, e

19 3 LOOPNZ. Os registradores EDX, DX, DH, DL são conhecidos como registradores de dados, eles são utilizados em conjunto com os registradores acumuladores em instruções como MUL. Após uma instrução MUL a parte dos bits mais significativos do resultado é armazenado nesses registradores e a parte menos significativa é armazenada nos registradores acumuladores. O registrador ESP é utilizado para armazenar o topo da pilha. O registrador EBP é utilizado para armazenar o endereço do stack frame corrente. O registrador ESI e EDI são utilizados respectivamente como índices de origem e destino quando estamos trabalhando com strings. 1.3 Chamadas de Sistema Os processadores Intel x86 possuem 4 níveis de proteção, o nível 0 é nível de maior privilégios, também conhecido como modo supervisor, onde todas as instruções estão disponíveis ( incluindo instruções privilegiadas ), no Linux o kernel executa com este nível de proteção, enquanto os programas de usuários executam no nível 3, que é o nível com menor privilégios, onde certas instruções não estão disponíveis. Essa separação entre modo usuário e modo kernel utilizando-se de níveis do processador teve por objetivo tornar o sistema mais seguro e confiável, evitando que problemas em programas de usuários pudessem parar todo o sistema. Quando programas em modo usuário precisam acessar recursos de baixo nível oferecidos pelo kernel isso deve ser feito por meio de uma chamada de sistema. Normalmente, chamadas de sistemas não são realizadas diretamente por um processo, bibliotecas em C é que oferecem esse recurso, no Linux a glibc é que oferece funções para acesso a chamadas de sistema. Em arquiteturas x86 o Linux implementa as chamadas de sistemas usando interrupções de software. Para executar uma chamada de sistema o processo em modo usuário deve colocar o numero desta no registrador EAX e seus respectivos parâmetros nos demais registradores de propósito geral (EBX, ECX, EDX, ESI, EDI) e executar int 0x80. O funcionamento das chamadas de sistemas e seus respectivos números é dependente do sistema operacional em questão. Por exemplo, no FreeBSD os parâmetros devem ser

20 4 passados na pilha e exige-se a interrupção seja chamada dentro de outra rotina. Como vimos no Linux os parâmetros para a chamada de sistema são passados nos registradores de propósito geral. Chamadas de sistemas são fornecidas pelo kernel do sistema operacional, o que implica que diferentes sistemas operacionais possuem diferentes conjuntos de chamadas de sistemas e formas de a utilizá-las. 1.4 Básico de Shellcode Usaremos o NASM (Netwide Assembler), para montar nosso shellcode, e então, usaremos o NDISASM (Netwide Disassembler) para extrair os opcodes em hexadecimal. Quando desenvolvendo shellcodes usaremos chamadas de sistemas, não podemos usar funções de bibliotecas externas, pois o endereço destas são resolvidos dinamicamente, em tempo de ligação (compilação estática) ou em tempo de execução (usando bibliotecas compartilhadas). Estaremos desenvolvendo shellcodes para sistemas Linux em arquiteturas x Problema do Endereçamento Quando escrevemos shellcode muitas vezes será necessário fazer referências à strings e ponteiros, porém não é possível utilizar nomes de variáveis, muito menos endereços estáticos, pois como dissemos anteriormente, o shellcode deve ser um código de maquina independente de posição e que será inserido em tempo de execução. Existem duas técnicas que podem ser utilizadas Técnica do JUMP e CALL Está técnica explora o funcionamento das instruções JMP e CALL. Analisemos o código a seguir: 1: jmp short data 2: code: 3: pop esi

21 5.. 8: data: 9: call code db 'Hello World#' Figura 1.1: Técnica do Jump e Call Na linha 1 fazemos o desvio para o rótulo data ( linha 8), logo em seguida chamados a rotina code ( linha 9 ), quando chamamos essa rotina o endereço correspondente a instrução seguinte é colocada na pilha, esse endereço corresponde ao da string. Dentro da rotina code, usamos a instrução pop esi, para obtermos o endereço da string, que agora se encontra no registrador ESI. Podemos então trabalhar com a string utilizando o registrador ESI como um ponteiro para ela Usando a PILHA O problema da técnica descrita acima é que ela pode tornar o shellcode imenso, e o tamanho do shellcode é um fator importante quando o espaço em que o shellcode será inserido é relativamente pequeno. Para contornarmos esse problema usamos a pilha para armazenar as strings e ponteiros que utilizaremos em nosso shellcode. Veja o exemplo a seguir: push byte 0x00 push 0x21646c72 push 0x6f57206f push 0x6c6c6548 mov ecx, esp Figura 1.2 Usando a Pilha - 1 Repare que primeiramente inserimos um byte NULO que será o terminador da string, depois colocamos a string na pilha usando a instrução PUSH. Observe que a string é colocada em sua ordem inversa, isso se deve ao funcionamento da pilha. O problema do código acima é que a instrução em negrito leva à presença de um byte NULO em nosso shellcode e como

22 veremos em seguida isso pode impedir que o shellcode seja inserido corretamente no programa. Para resolver o problema, modificamos o nosso shellcode para: 6 xor eax, eax push eax push 0x21646c72 push 0x6f57206f push 0x6c6c6548 mov ecx, esp Figura 1.3 Usando a Pilha - 2 Observe, em ambos os casos que na última instrução ( mov ecx, esp ) o registrador ECX passa a armazenar o ponteiro para string Problema dos bytes NULOS Normalmente, o nosso shellcode será inserido no programa através de alguma função que faz manipulação de strings, essas funções normalmente param de processar a string quando um byte NULO é encontrado, pois este é considerado o delimitador de fim da string. Para evitarmos a presença de bytes NULOS alguns cuidados devem ser tomados. Seguem alguns exemplos: 1. Quando queremos zerar um registrador devemos usar a instrução XOR, ao invés da instrução MOV. Por exemplo, a instrução mov eax,0x0 coloca 4 bytes NULOS em nosso shellcode, enquanto a instrução xor eax,eax evita a presença destes. 2. Devemos evitar mover um valor pequeno para dentro de registradores grandes ( 32 bits ). Por exemplo, a instrução mov eax,0x01 coloca 3 bytes NULOS em nosso shellcode, enquanto a instrução as instruções xor eax,eax e mov al,0x01 tem o mesmo efeito mas sem colocar bytes nulos em nosso shellcode. 3. Normalmente, quando definimos uma string em Assembler fazemos da seguinte forma: db 'Hello World', 0x00 O problema é que desta forma um byte nulo será inserido no shellcode. O correto

23 7 seria: db 'Hello World#', e quando obtivermos o endereço da string ( como demonstrado acima ), nós zeramos o sustenido, xor eax,eax mov byte [esi + 11],al 1.5 Escrevendo Shellcodes Nesta seção serão vistos quatro exemplos básicos de shellcodes. O primeiro apenas escreverá uma mensagem na tela, o segundo se executado com privilégios de super-usuário reiniciará o sistema, o terceiro obterá uma shell no sistema quando usado localmente e o quarto obterá uma shell remota em um sistema. Shellcodes avançados serão discutidos no Capitulo Escrevendo uma mensagem na tela Para escrevermos uma mensagem na tela usaremos duas chamadas de sistema: sys_exit e sys_write. Analisemos a sintaxe de cada chamada de sistema, para entendermos como os parâmetros devem ser passados. Nome sys_exit sys_write Sintaxe int sys_exit(int status) ssize_t sys_write(unsigned int fd, const char * buf, size_t count) Tabela 2 Chamadas de Sistema SYS_EXIT e SYS_WRITE - 1 sistema: Agora, vamos ver como esses parâmetros devem ser passados para a chamada de Nome EAX EBX ECX EDX sys_exit 1 int status - - sys_write 4 unsigned int const char * size_t

24 8 Tabela 3 Chamadas de Sistema SYS_EXIT e SYS_WRITE - 2 seguir: O nosso shellcode escreverá a mensagem Hello World! na tela. Veja o shellcode a BITS 32 xor eax,eax ; EAX = 0 xor ebx,ebx ; EBX = 0 xor ecx,ecx ; ECX = 0 xor edx,edx ; EDX = 0 mov al,0x0a ; AL = \n push word ax ; Inserimos o terminador da string push 0x21646c72 ;!dlr push 0x6f57206f ; ow o push 0x6c6c6548 ; lleh mov ecx,esp ; ECX = Ponteiro para string mov bl,1 ; BL = STDOUT mov dl,13 ; DL = Tamanho da String mov al,4 ; sys_write int 0x80 dec bl ; BL = status = 0 mov al,1 ; sys_exit int 0x80 Figura 1.4 Arquivo - write-push.s #nasm -o write-push write-push.s #ndisasm -u./write-push C0 xor eax,eax DB xor ebx,ebx C9 xor ecx,ecx D2 xor edx,edx B00A mov al,0xa A 6650 push ax C 68726C6421 push dword 0x21646c F20576F push dword 0x6f57206f C6C push dword 0x6c6c B 89E1 mov ecx,esp D B301 mov bl,0x1

25 F B20D mov dl,0xd B004 mov al,0x CD80 int 0x FECB dec bl B001 mov al,0x CD80 int 0x80 ficaria: Agora podemos extrair os opcodes referentes a cada instrução e o nosso shellcode "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x0a\x66\x50\x68\x72\x6c" "\x64\x21\x68\x6f\x20\x57\x6f\x68\x48\x65\x6c\x6c\x89\xe1\xb3" "\x01\xb2\x0d\xb0\x04\xcd\x80\xfe\xcb\xb0\x01\xcd\x80" Agora vamos testar nosso shellcode: char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x0a\x66\x50\x68\x72\x6c" "\x64\x21\x68\x6f\x20\x57\x6f\x68\x48\x65\x6c\x6c\x89\xe1\xb3" "\x01\xb2\x0d\xb0\x04\xcd\x80\xfe\xcb\xb0\x01\xcd\x80"; int main(void) { void (*func)(void); func = (void (*)(void))shellcode; (*func)(); } Figura 1.5 Arquivo - test-write-push.c #gcc test-write-push.c -o test-write-push #./test-write-push Hello World! # Reiniciando o Sistema Esse shellcode usa duas chamadas de sistemas: sys_sync e sys_reboot. A sys_sync é utilizada para forçar o sincronismo do sistema de arquivos no disco rígido com o estado

26 10 interno do sistema de arquivos, utilizaremos essa chamada de sistema para evitar perda de dados quando o sistema for reiniciado com a chamada de sistema sys_reboot. A sys_reboot pode ser usada tanto para reiniciar o sistema, quanto para habilitar/desabilitar o Ctrl+Alt+Del no sistema. Veja a sintaxe de ambas as chamadas de sistema a seguir: Nome Sintaxe sys_sync int sys_sync(void); sys_reboot int sys_reboot(int magic, int magic_too, int flag) Tabela 4 Chamadas de Sistema SYS_SYNC e SYS_REBOOT - 1 sistema: Agora, vamos ver como esses parâmetros devem ser passados para a chamada de Nome EAX EBX ECX EDX sys_sync sys_reboot 88 int int int Tabela 5 Chamadas de Sistema SYS_SYNC e SYS_REBOOT - 2 A página de manual da chamada de sistema sys_reboot especifica que magic e magic_too devem obrigatoriamente ter os respectivos valores, 0xfee1dead e Se as duas variáveis estiverem corretamente configuradas a variável flag especifica qual ação será realizada. Os possíveis valores para a variável flag podem ser: Flag Ação 0x Reinicia o sistema 0x89abcdef Ctrl+Alt+Del é habilitado 0 Ctrl+Alt+Del é desabilitado e um sinal é enviado para init. Tabela 6 Opções de Ações Para SYS_REBOOT Então, vamos escrever nosso shellcode.

How to write Shellcodes por Luiz Fernando Camargo

How to write Shellcodes por Luiz Fernando Camargo How to write Shellcodes por Luiz Fernando Camargo 1. Introdução Shellcode é um grupo de instruções assembler em formato de opcode para realizar diversas funções como chamar uma shell, ou escutar em uma

Leia mais

http://www.risesecurity.org Rodrigo Rubira Branco rodrigo@kernelhacking.com rodrigo@risesecurity.org

http://www.risesecurity.org Rodrigo Rubira Branco rodrigo@kernelhacking.com rodrigo@risesecurity.org Ataques Polimórficos Rodrigo Rubira Branco rodrigo@kernelhacking.com rodrigo@risesecurity.org A idéia - Detectores de intrusos utilizam-se de assinaturas de ataques para identificação dos mesmos - Sistemas

Leia mais

INTRODUÇÃO BUFFER OVERFLOWS

INTRODUÇÃO BUFFER OVERFLOWS BUFFER OVERFLOW INTRODUÇÃO As vulnerabilidades de buffer overflow são consideradas ameaças críticas de segurança, apesar de ser uma falha bem-conhecida e bastante séria, que se origina exclusivamente na

Leia mais

Assembly na arquitetura IA-32 com NASM no Linux

Assembly na arquitetura IA-32 com NASM no Linux Assembly na arquitetura IA-32 com NASM no Linux Prof. Dr. Luciano José Senger 1 Introdução A Figura 1 mostra os registradores principais para a arquitetura IA-32. Essa arquitetura trabalha com palavras

Leia mais

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org Breve Histórico A linguagem de programação C foi criada na década de 70, por Dennis Ritchie, que a implementou,

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Conceitos Edson Moreno edson.moreno@pucrs.br http://www.inf.pucrs.br/~emoreno Sumário Introdução Arquitetura de Sistema Operacional Chamadas de sistema. Processos Basicamente, um

Leia mais

3 Introdução às chamadas ao sistema

3 Introdução às chamadas ao sistema 3 Introdução às chamadas ao sistema 3.1 Chamadas ao sistema e à BIOS As chamadas ao sistema ou System Calls consistem nos serviços disponibilizados pelo núcleo do sistema operativo. O principio é semelhante

Leia mais

Introdução à Arquitetura e Linguagem Assembly de Processadores IA-32

Introdução à Arquitetura e Linguagem Assembly de Processadores IA-32 Introdução à Arquitetura e Linguagem Assembly de Processadores IA-32 Sistemas da Computação Prof. Rossano Pablo Pinto, Msc. rossano at gmail com 2 semestre 2007 CHIP Ano MHz Transistors Mem 8086 1978 5

Leia mais

COMO FUNCIONAM OS EXPLOITS

COMO FUNCIONAM OS EXPLOITS COMO FUNCIONAM OS EXPLOITS Aléxis Rodrigues de Almeida 1 Resumo Este documento descreve o que são e como funcionam os exploits, procurando mostrar, através de um exemplo real, os riscos que essas ferramentas

Leia mais

Sistemas Operacionais Aula 03: Estruturas dos SOs. Ezequiel R. Zorzal ezorzal@unifesp.br www.ezequielzorzal.com

Sistemas Operacionais Aula 03: Estruturas dos SOs. Ezequiel R. Zorzal ezorzal@unifesp.br www.ezequielzorzal.com Sistemas Operacionais Aula 03: Estruturas dos SOs Ezequiel R. Zorzal ezorzal@unifesp.br www.ezequielzorzal.com OBJETIVOS Descrever os serviços que um sistema operacional oferece aos usuários e outros sistemas

Leia mais

LISTA DE COMANDOS DO LINUX 1

LISTA DE COMANDOS DO LINUX 1 LISTA DE COMANDOS DO LINUX 1 Comandos para manipulação de diretório 1. ls Lista os arquivos de um diretório. 2. cd Entra em um diretório. Você precisa ter a permissão de execução para entrar no diretório.

Leia mais

Arquitetura de Computadores. Prof. João Bosco Jr.

Arquitetura de Computadores. Prof. João Bosco Jr. Arquitetura de Computadores Prof. João Bosco Jr. Unidade II Aula 1 Nível ISA Posicionado entre a microarquitetura e o SO Define a arquitetura (Conjunto de Instruções) É a interface entre o Software e o

Leia mais

Unidade: Unidade Lógica e Aritmética e Registradores. Unidade I:

Unidade: Unidade Lógica e Aritmética e Registradores. Unidade I: Unidade: Unidade Lógica e Aritmética e Registradores Unidade I: 0 Unidade: Unidade Lógica e Aritmética e Registradores UNIDADE LÓGICA E ARITMÉTICA E REGISTRADORES O Processador é um chip com milhares de

Leia mais

Sistemas Operacionais II

Sistemas Operacionais II Sistemas Operacionais II Aula 1 Autor: Renê de Souza Pinto Orientação: Prof. Dr. Francisco José Monaco rene@grad.icmc.usp.br, monaco@icmc.usp.br Universidade de São Paulo Instituto de Ciências Matemáticas

Leia mais

Unix: Sistema de Arquivos. Geraldo Braz Junior

Unix: Sistema de Arquivos. Geraldo Braz Junior Unix: Sistema de Arquivos Geraldo Braz Junior 2 Arquivos Um arquivo é visto pelo SO apenas como uma seqüência de bytes: nenhuma distinção é feita entre arquivos ASCII, binários, etc.; Muitos programas

Leia mais

Gerenciador de Boot Simples

Gerenciador de Boot Simples Gerenciador de Boot Simples Este tutorial é uma simples caminhada através de um Gerenciador de Boot Hello World. Este, como qualquer outro gestor, tem que obedecer a algumas regras. Termos utilizados:

Leia mais

Visão Geral de Sistemas Operacionais

Visão Geral de Sistemas Operacionais Visão Geral de Sistemas Operacionais Sumário Um sistema operacional é um intermediário entre usuários e o hardware do computador. Desta forma, o usuário pode executar programas de forma conveniente e eficiente.

Leia mais

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira IFPE Disciplina: Sistemas Operacionais Prof. Anderson Luiz Moreira SERVIÇOS OFERECIDOS PELOS SOS 1 Introdução O SO é formado por um conjunto de rotinas (procedimentos) que oferecem serviços aos usuários

Leia mais

Entradas/Saídas. Programação por interrupções Conceitos gerais Programação da porta série Transmissão

Entradas/Saídas. Programação por interrupções Conceitos gerais Programação da porta série Transmissão Entradas/Saídas Programação por interrupções Conceitos gerais Programação da porta série Transmissão Problemas a resolver Como identificar a interrupção? Motivo da interrupção Que rotina executar? Como

Leia mais

28/3/2011. Família Intel 80x86. Arquitetura dos Processadores Intel 80x86

28/3/2011. Família Intel 80x86. Arquitetura dos Processadores Intel 80x86 Arquitetura de Computadores Arquitetura dos Processadores Intel 80x86 Prof. Marcos Quinet Universidade Federal Fluminense UFF Pólo Universitário de Rio das Ostras - PURO Família Intel 80x86 Ao se falar

Leia mais

3/9/2010. Ligação da UCP com o barramento do. sistema. As funções básicas dos registradores nos permitem classificá-los em duas categorias:

3/9/2010. Ligação da UCP com o barramento do. sistema. As funções básicas dos registradores nos permitem classificá-los em duas categorias: Arquitetura de Computadores Estrutura e Funcionamento da CPU Prof. Marcos Quinet Universidade Federal Fluminense P.U.R.O. Revisão dos conceitos básicos O processador é o componente vital do sistema de

Leia mais

Análise de vulnerabilidades de um código fonte escrito em linguagem C

Análise de vulnerabilidades de um código fonte escrito em linguagem C Análise de vulnerabilidades de um código fonte escrito em linguagem C Fausto Levandoski 1 1 Universidade do Vale do Rios dos Sinos (UNISINOS) Curso Tecnólogo em Segurança da Informação Av. Unisinos, 950

Leia mais

Notas da Aula 4 - Fundamentos de Sistemas Operacionais

Notas da Aula 4 - Fundamentos de Sistemas Operacionais Notas da Aula 4 - Fundamentos de Sistemas Operacionais 1. Threads Threads são linhas de execução dentro de um processo. Quando um processo é criado, ele tem uma única linha de execução, ou thread. Esta

Leia mais

Nível da Arquitetura do Conjunto das Instruções

Nível da Arquitetura do Conjunto das Instruções Nível da Arquitetura do Conjunto das Instruções (Aula 13) Fluxo de Controle Fluxo Seqüencial de Controle e Desvios (1) Fluxo de Controle: É a seqüência na qual instruções são dinamicamente executadas Isto

Leia mais

Experimentos com a memória cache do CPU

Experimentos com a memória cache do CPU Experimentos com a memória cache do CPU Alberto Bueno Júnior & Andre Henrique Serafim Casimiro Setembro de 2010 1 Contents 1 Introdução 3 2 Desvendando o cache 3 2.1 Para que serve o cache?.....................

Leia mais

SOFTWARE LIVRE. Distribuições Live CD. Kernel. Distribuição Linux

SOFTWARE LIVRE. Distribuições Live CD. Kernel. Distribuição Linux SOFTWARE LIVRE A liberdade de executar o programa, para qualquer propósito. A liberdade de estudar como o programa funciona, e adaptá-lo para as suas necessidades. Acesso ao código-fonte é um pré-requisito

Leia mais

Programação com Sockets TCP e UDP - Cliente. Gustavo Leitão

Programação com Sockets TCP e UDP - Cliente. Gustavo Leitão Programação com Sockets TCP e UDP - Cliente Gustavo Leitão 5/24/2010 INTRODUÇÃO Objetivo da Aula OBJETIVO DA AULA Apresentar ao aluno conceitos e prática em sockets INTRODUÇÃO O que é um socket? INTRODUÇÃO

Leia mais

SELinux. Security Enhanced Linux

SELinux. Security Enhanced Linux SELinux Security Enhanced Linux Segurança da Informação A segurança da informação é um conjunto de medidas que se constituem basicamente de controles e política de segurança Objetivando a proteção das

Leia mais

sockets interprocess communication Taisy Weber

sockets interprocess communication Taisy Weber sockets interprocess communication Taisy Weber Comunicação entre processos Mecanismos Pipes, FIFO (named pipes), semáforos, message queues. Memória compartilhada. Sockets Definição, chamadas de sistemas,

Leia mais

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO Conceitos básicos e serviços do Sistema Operacional Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO Tipos de serviço do S.O. O S.O.

Leia mais

Projeto 1 - Bootloader

Projeto 1 - Bootloader Projeto 1 - Bootloader IF677 - Infra-Estrutura de Software Centro de Informática - UFPE Autor: Thyago Porpino (tnp) Objetivos Desmistificar o processo de inicialização de um computador. Entender como um

Leia mais

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM 71 Introdução Difere dos níveis inferiores por ser implementado por tradução A tradução é usada quando um processador está disponível para uma mensagem fonte mas

Leia mais

EXEMPLO: Processo para atualização da hora Processo para monitoramento da necessidade de proteção de tela. Figura 4-1 - Exemplo

EXEMPLO: Processo para atualização da hora Processo para monitoramento da necessidade de proteção de tela. Figura 4-1 - Exemplo 4 PROCESSOS Os primeiros sistemas operacionais permitiam que apenas um processo fosse executado por vez. Dessa maneira, este processo tinha todo o sistema computacional a sua disposição. Os atuais sistemas

Leia mais

MC404: Organização de Computadores e Linguagem de Montagem Lista de Exercícios

MC404: Organização de Computadores e Linguagem de Montagem Lista de Exercícios MC404: Organização de Computadores e Linguagem de Montagem Lista de Exercícios 2 o semestre de 2014 - Turmas E/F Prof. Edson Borin Questão 1. Qual a diferença entre as formas de armazenamento de dados

Leia mais

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA Responda 1) Quem desenvolveu a linguagem C? Quando? 2) Existe alguma norma sobre a sintaxe da linguagem C? 3) Quais são os tipos básicos de dados disponíveis na linguagem C? 4) Quais são as principais

Leia mais

Sistemas Operacionais - Prof. Fabricio Alessi Steinmacher - email:fsteinmacher@gmail.com OBJETIVOS OPERACIONAIS. fsteinmacher@gmail.

Sistemas Operacionais - Prof. Fabricio Alessi Steinmacher - email:fsteinmacher@gmail.com OBJETIVOS OPERACIONAIS. fsteinmacher@gmail. SISTEMAS Introdução a Sistemas Operacionais Prof. Fabricio Alessi Steinmacher - email: OBJETIVOS Identificar as funções e os componentes de um Sistema Operacional; Diferenciar os tipos de Sistemas Operacionais

Leia mais

Prevenindo e solucionando ataques de Buffer Overflow

Prevenindo e solucionando ataques de Buffer Overflow Prevenindo e solucionando ataques de Buffer Overflow Helder Dias Costa Flausino, Luís Augusto Mattos Mendes FACEC Universidade Presidente Antônio Carlos (UNIPAC) Barbacena MG Brazil helderflausino@gmail.com,

Leia mais

Planejando uma política de segurança da informação

Planejando uma política de segurança da informação Planejando uma política de segurança da informação Para que se possa planejar uma política de segurança da informação em uma empresa é necessário levantar os Riscos, as Ameaças e as Vulnerabilidades de

Leia mais

ARQUITETURA DE COMPUTADORES

ARQUITETURA DE COMPUTADORES 01001111 01110010 01100111 01100001 01101110 01101001 01111010 01100001 11100111 11100011 01101111 00100000 01100100 01100101 00100000 01000011 01101111 01101101 01110000 01110101 01110100 01100001 01100100

Leia mais

Figura 01 Kernel de um Sistema Operacional

Figura 01 Kernel de um Sistema Operacional 01 INTRODUÇÃO 1.5 ESTRUTURA DOS SISTEMAS OPERACIONAIS O Sistema Operacional é formado por um Conjunto de rotinas (denominado de núcleo do sistema ou kernel) que oferece serviços aos usuários e suas aplicações

Leia mais

Notas da Aula 15 - Fundamentos de Sistemas Operacionais

Notas da Aula 15 - Fundamentos de Sistemas Operacionais Notas da Aula 15 - Fundamentos de Sistemas Operacionais 1. Software de Entrada e Saída: Visão Geral Uma das tarefas do Sistema Operacional é simplificar o acesso aos dispositivos de hardware pelos processos

Leia mais

Firewalls. Prática de Laboratório. Maxwell Anderson INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DA PARAÍBA

Firewalls. Prática de Laboratório. Maxwell Anderson INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DA PARAÍBA Firewalls Prática de Laboratório Maxwell Anderson INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DA PARAÍBA Sumário Firewall do Windows... 2 O que é um firewall?... 2 Ativar ou desativar o Firewall

Leia mais

Sistemas de Operação Sockets

Sistemas de Operação Sockets Sistemas de Operação Sockets O que é um socket? Uma interface de comunicação entre processos que podem ou não residir na mesma máquina, mas que não precisam estar relacionados. É usado normalmente para

Leia mais

Sistemas Operacionais. Conceitos de um Sistema Operacional

Sistemas Operacionais. Conceitos de um Sistema Operacional Sistemas Operacionais Conceitos de um Sistema Operacional Modo usuário e Modo Kernel Como já vimos são ambientes de execução diferentes no processador Há um conjunto de funções privilegiadas acessadas

Leia mais

Laboratório de Sistemas Processadores e Periféricos Lista de comandos de Assembly

Laboratório de Sistemas Processadores e Periféricos Lista de comandos de Assembly Laboratório de Sistemas Processadores e Periféricos Lista de comandos de Assembly Gustavo G. Parma Lista dos comandos assembly que serão utilizados ao longo das práticas. 1 Comandos 1. ADD destino, fonte

Leia mais

Linguagem de Montagem

Linguagem de Montagem Linguagem de Montagem Organização do PC Slides baseados em material associado ao livro Introduction to Assembly Language Programming, Sivarama Dandamudi 1 Processador Pentium Lançado em 1993 Versão melhorada

Leia mais

CONSTRUÇÃO DE UMA UCP HIPOTÉTICA M++ INTRODUÇÃO

CONSTRUÇÃO DE UMA UCP HIPOTÉTICA M++ INTRODUÇÃO CONSTRUÇÃO DE UMA UCP HIPOTÉTICA M++ INTRODUÇÃO O seguinte artigo apresenta uma UCP hipotética construída no software simulador DEMOWARE Digital Works 3.04.39. A UCP (Unidade Central de Processamento)

Leia mais

Os 3 principais tipos de Instruções (INSTRUTION SET) dos up são:

Os 3 principais tipos de Instruções (INSTRUTION SET) dos up são: Linguagem Assembly Os 3 principais tipos de Instruções (INSTRUTION SET) dos up são: INSTRUÇÕES DE TRANSFERÊNCIA DE DADOS - Movem dados entre Registradores, Registradores e Memória e Valores Fixos para

Leia mais

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti ESTRUTURAS DE DADOS I Notas de Aula 1 SUMÁRIO 1. INTRODUÇÃO... 2 1.1 Array (vetores)... 2 2. BUSCA DE ELEMENTOS... 3 2.1 Busca Seqüencial... 3 2.2 Busca Binária... 3 2.3 Busca Indexada... 3 2.4 Busca Hash...

Leia mais

Aula Prática 1 Introdução à programação Assembly no DOS usando TASM Bruno Silva bs@cin.ufpe.br lauro Moura lauromoura@gmail.com

Aula Prática 1 Introdução à programação Assembly no DOS usando TASM Bruno Silva bs@cin.ufpe.br lauro Moura lauromoura@gmail.com Interface Hardware Software Aula Prática 1 Introdução à programação Assembly no DOS usando TASM Bruno Silva bs@cin.ufpe.br lauro Moura lauromoura@gmail.com Conteúdo Visão geral do processo TASM / TLINK

Leia mais

SO - Conceitos Básicos. Introdução ao Computador 2010/01 Renan Manola

SO - Conceitos Básicos. Introdução ao Computador 2010/01 Renan Manola SO - Conceitos Básicos Introdução ao Computador 2010/01 Renan Manola Definição de SO É uma camada de software que opera entre o hardware e os programas aplicativos voltados ao usuário final. É uma estrutura

Leia mais

Compartilhamento de recursos de forma a racionar e otimizar o uso de equipamentos e softwares. Servidores e Workstations. Segurança é um desafio, por

Compartilhamento de recursos de forma a racionar e otimizar o uso de equipamentos e softwares. Servidores e Workstations. Segurança é um desafio, por $XWDUTXLD(GXFDFLRQDOGR9DOHGR6mR)UDQFLVFR± $(96) )DFXOGDGHGH&LrQFLDV6RFLDLVH$SOLFDGDVGH3HWUROLQD± )$&$3( &XUVRGH&LrQFLDVGD&RPSXWDomR $8',725,$'$7(&12/2*,$'$,1)250$d 2 &\QDUD&DUYDOKR F\QDUDFDUYDOKR#\DKRRFRPEU

Leia mais

8. Instruções de multiplicação e divisão

8. Instruções de multiplicação e divisão Cap8.1 8. Instruções de multiplicação e divisão 8.1 Instruções de multiplicação MUL fonte IMUL fonte MUL (multiply) -> usada com números em representação não-sinalizada IMUL (integer multiply) -> usada

Leia mais

Unidade 10: A Unidade Lógica Aritmética e as Instruções em Linguagem de Máquina Prof. Daniel Caetano

Unidade 10: A Unidade Lógica Aritmética e as Instruções em Linguagem de Máquina Prof. Daniel Caetano Arquitetura e Organização de Computadores 1 Unidade 10: A Unidade Lógica Aritmética e as Instruções em Linguagem de Máquina Prof. Daniel Caetano Objetivo: Apresentar as funções o mecanismo de atuação da

Leia mais

Introdução à Ciência da Computação

Introdução à Ciência da Computação Faculdade de Ciências e Tecnologia Departamento de Matemática e Computação Bacharelado em Ciência da Computação Introdução à Ciência da Computação Aula 05 Rogério Eduardo Garcia (rogerio@fct.unesp.br)

Leia mais

Arquitetura de Computadores. Introdução aos Sistemas Operacionais

Arquitetura de Computadores. Introdução aos Sistemas Operacionais Arquitetura de Computadores Introdução aos Sistemas Operacionais O que é um Sistema Operacional? Programa que atua como um intermediário entre um usuário do computador ou um programa e o hardware. Os 4

Leia mais

Evolução dos Processadores

Evolução dos Processadores Evolução dos Processadores Arquitetura Intel Arquitetura x86 Micro Arquitetura P5 P6 NetBurst Core Processador Pentium Pentium Pro Pentium II Pentium III Pentium 4 Pentium D Xeon Xeon Sequence Core 2 Duo

Leia mais

7 Processos. 7.1 Introdução

7 Processos. 7.1 Introdução 1 7 Processos 7.1 Introdução O conceito de processo é a base para a implementação de um sistema multiprogramável. O processador é projetado apenas para executar instruções, não se importando com qual programa

Leia mais

A arquitectura IA32. A arquitectura de um processador é caracterizada pelo conjunto de atributos que são visíveis ao programador.

A arquitectura IA32. A arquitectura de um processador é caracterizada pelo conjunto de atributos que são visíveis ao programador. A arquitectura IA32 A arquitectura de um processador é caracterizada pelo conjunto de atributos que são visíveis ao programador. Tamanho da palavra Número de registos visíveis Número de operandos Endereçamento

Leia mais

Bibliotecas. Apoio à Programação Distribuída. Socket. Socket. bibliotecas bibliotecas+ferramentas linguagens de programação distribuídas

Bibliotecas. Apoio à Programação Distribuída. Socket. Socket. bibliotecas bibliotecas+ferramentas linguagens de programação distribuídas Apoio à Programação Distribuída bibliotecas bibliotecas+ferramentas linguagens de programação distribuídas flexibilidade de programação disponibilidade da ferramenta facilidade de desenvolvimento e reuso

Leia mais

Infraestrutura de Hardware. Memória Virtual

Infraestrutura de Hardware. Memória Virtual Infraestrutura de Hardware Memória Virtual Perguntas que Devem ser Respondidas ao Final do Curso Como um programa escrito em uma linguagem de alto nível é entendido e executado pelo HW? Qual é a interface

Leia mais

Gerência de Redes Segurança

Gerência de Redes Segurança Gerência de Redes Segurança Cássio D. B. Pinheiro cdbpinheiro@ufpa.br cassio.orgfree.com Objetivos Apresentar o conceito e a importância da Política de Segurança no ambiente informatizado, apresentando

Leia mais

Sistemas Operacionais 2014 Introdução. Alexandre Augusto Giron alexandre.a.giron@gmail.com

Sistemas Operacionais 2014 Introdução. Alexandre Augusto Giron alexandre.a.giron@gmail.com Sistemas Operacionais 2014 Introdução Alexandre Augusto Giron alexandre.a.giron@gmail.com Roteiro Sistemas Operacionais Histórico Estrutura de SO Principais Funções do SO Interrupções Chamadas de Sistema

Leia mais

TCP/IP TCP UDP IP HTTP HTTPS FTP TFTP TELNET POP3 IMAP SMTP SNMP DHCP

TCP/IP TCP UDP IP HTTP HTTPS FTP TFTP TELNET POP3 IMAP SMTP SNMP DHCP TCP/IP TCP UDP IP HTTP HTTPS FTP TFTP TELNET POP3 IMAP SMTP SNMP DHCP HTTP (Hypertext Transfer Protocol ) Protocolo usado na Internet para transferir as páginas da WWW (WEB). HTTPS (HyperText Transfer

Leia mais

Campus Capivari Análise e Desenvolvimento de Sistemas (ADS) Prof. André Luís Belini E-mail: prof.andre.luis.belini@gmail.com /

Campus Capivari Análise e Desenvolvimento de Sistemas (ADS) Prof. André Luís Belini E-mail: prof.andre.luis.belini@gmail.com / Campus Capivari Análise e Desenvolvimento de Sistemas (ADS) Prof. André Luís Belini E-mail: prof.andre.luis.belini@gmail.com / andre.belini@ifsp.edu.br MATÉRIA: SEGURANÇA DA INFORMAÇÃO Aula N : 09 Tema:

Leia mais

Guia de Inicialização para o Windows

Guia de Inicialização para o Windows Intralinks VIA Versão 2.0 Guia de Inicialização para o Windows Suporte 24/7/365 da Intralinks EUA: +1 212 543 7800 Reino Unido: +44 (0) 20 7623 8500 Consulte a página de logon da Intralinks para obter

Leia mais

ENDEREÇOS DE REDE PRIVADOS. 10.0.0.0 até 10.255.255.255 172.16.0.0 até 172.31.255.255 192.168.0.0 até 192.168.255.255. Kernel

ENDEREÇOS DE REDE PRIVADOS. 10.0.0.0 até 10.255.255.255 172.16.0.0 até 172.31.255.255 192.168.0.0 até 192.168.255.255. Kernel ENDEREÇOS DE REDE PRIVADOS Foram reservados intervalos de endereços IP para serem utilizados exclusivamente em redes privadas, como é o caso das redes locais e Intranets. Esses endereços não devem ser

Leia mais

Capítulo 2: Introdução às redes comutadas (configuração switch)

Capítulo 2: Introdução às redes comutadas (configuração switch) Unisul Sistemas de Informação Redes de Computadores Capítulo 2: Introdução às redes comutadas (configuração switch) Roteamento e Switching Academia Local Cisco UNISUL Instrutora Ana Lúcia Rodrigues Wiggers

Leia mais

Laboratório de Redes de Computadores e Sistemas Operacionais

Laboratório de Redes de Computadores e Sistemas Operacionais Laboratório de Redes de Computadores e Sistemas Operacionais Poderes da Conta Root Fabricio Breve Introdução Todo processo e arquivo em um sistema Linux pertence a uma conta de usuário em particular Os

Leia mais

x86 Assembly Mini-Course

x86 Assembly Mini-Course x86 Assembly Mini-Course Part 1 Bruno P. Evangelista bpevangelista@gmail.com Introdução Assembly é uma linguagem de programação de baixo nível em formato mnemonico Ela possibilita trabalhar diretamente

Leia mais

NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann

NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann Universidade Federal de Santa Maria NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann O modelo (ou arquitetura) de von

Leia mais

SEGURANÇA COM OPENBSD / Congresso de Tecnologia FATEC-SP 2006. AS2MWPC - Qualificação e Assessoria em Tecnologia de Informação Pedro Moura

SEGURANÇA COM OPENBSD / Congresso de Tecnologia FATEC-SP 2006. AS2MWPC - Qualificação e Assessoria em Tecnologia de Informação Pedro Moura SEGURANÇA COM OPENBSD / Congresso de Tecnologia FATEC-SP 2006 AS2MWPC - Qualificação e Assessoria em Tecnologia de Informação Pedro Moura Segurança com OpenBSD O mascote do OpenBSD é o Puffy, um peixe

Leia mais

MC404 - Organização de Computadores. e Linguagem de Montagem Instituto de Computação. Universidade Estadual de Campinas

MC404 - Organização de Computadores. e Linguagem de Montagem Instituto de Computação. Universidade Estadual de Campinas MC404 - Organização de Computadores Lab. e Linguagem de Montagem Instituto de Computação 01 Universidade Estadual de Campinas 1 Objetivo O objetivo deste laboratório é fazer com que o aluno se familiarize

Leia mais

2 Formalidades referentes ao trabalho

2 Formalidades referentes ao trabalho Bacharelado em Ciência da Computação DINF / UFPR Projetos Digitais e Microprocessadores 1 o Semestre de 2006 MICO-v12.r0 07/03/2006 Profs. Luis Allan Künzle e Armando Luiz Nicolini Delgado Atenção: Este

Leia mais

Comunicação entre pai e filho

Comunicação entre pai e filho Comunicação entre pai e filho Ao chamar um fork(), processos pai e filho deixam de compartilhar memória Como fazer então para que o resultado de um processo possa ser recebido pelo outro? Exemplos: Processo

Leia mais

Algoritmos e Programação Estruturada

Algoritmos e Programação Estruturada Algoritmos e Programação Estruturada Virgínia M. Cardoso Linguagem C Criada por Dennis M. Ritchie e Ken Thompson no Laboratório Bell em 1972. A Linguagem C foi baseada na Linguagem B criada por Thompson.

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais SISTEMAS DE ARQUIVOS MACHADO/MAIA: CAPÍTULO 11 Prof. Pedro Luís Antonelli Anhanguera Educacional SISTEMAS DE ARQUIVOS - INTRODUÇÃO O armazenamento e a recuperação de informações é

Leia mais

4 Estrutura do Sistema Operacional. 4.1 - Kernel

4 Estrutura do Sistema Operacional. 4.1 - Kernel 1 4 Estrutura do Sistema Operacional 4.1 - Kernel O kernel é o núcleo do sistema operacional, sendo responsável direto por controlar tudo ao seu redor. Desde os dispositivos usuais, como unidades de disco,

Leia mais

LABORATÓRIO DE SISTEMAS OPERACIONAIS. PROFª. M.Sc. JULIANA HOFFMANN QUINONEZ BENACCHIO

LABORATÓRIO DE SISTEMAS OPERACIONAIS. PROFª. M.Sc. JULIANA HOFFMANN QUINONEZ BENACCHIO LABORATÓRIO DE SISTEMAS OPERACIONAIS PROFª. M.Sc. JULIANA HOFFMANN QUINONEZ BENACCHIO Gerenciamento de Memória no Linux O Linux é um sistema operacional com memória virtual paginada, isto quer dizer que

Leia mais

Programação Concorrente Processos e Threads

Programação Concorrente Processos e Threads Programação Concorrente Processos e Threads Prof. Eduardo Alchieri Processos O conceito mais central em qualquer sistema operacional é o processo Uma abstração de um programa em execução Um programa por

Leia mais

Conceitos de Linguagens de Programação

Conceitos de Linguagens de Programação Conceitos de Linguagens de Programação Aula 07 Nomes, Vinculações, Escopos e Tipos de Dados Edirlei Soares de Lima Introdução Linguagens de programação imperativas são abstrações

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Aula 5 Estrutura de Sistemas de Computação Prof.: Edilberto M. Silva http://www.edilms.eti.br Baseado no material disponibilizado por: SO - Prof. Edilberto Silva Prof. José Juan Espantoso

Leia mais

Linguagem de Montagem

Linguagem de Montagem Linguagem de Montagem Procedimentos e a Pilha Slides baseados em material associado ao livro Introduction to Assembly Language Programming, Sivarama Dandamudi 1 O que é a pilha? A pilha é uma estrutura

Leia mais

1 REQUISITOS BÁSICOS PARA INSTALAR O SMS PC REMOTO

1 REQUISITOS BÁSICOS PARA INSTALAR O SMS PC REMOTO 1 ÍNDICE 1 REQUISITOS BÁSICOS PARA INSTALAR O SMS PC REMOTO... 3 1.1 REQUISITOS BASICOS DE SOFTWARE... 3 1.2 REQUISITOS BASICOS DE HARDWARE... 3 2 EXECUTANDO O INSTALADOR... 3 2.1 PASSO 01... 3 2.2 PASSO

Leia mais

Instruções de Instalação do IBM SPSS Modeler (Licença de Usuário Autorizado)

Instruções de Instalação do IBM SPSS Modeler (Licença de Usuário Autorizado) Instruções de Instalação do IBM SPSS Modeler (Licença de Usuário Autorizado) Índice Instruções de Instalação....... 1 Requisitos do sistema........... 1 Código de autorização.......... 1 Instalando...............

Leia mais

CRIANDO UM SISTEMA OPERACIONAL BÁSICO Por: Fernando Birck aka Fergo

CRIANDO UM SISTEMA OPERACIONAL BÁSICO Por: Fernando Birck aka Fergo CRIANDO UM SISTEMA OPERACIONAL BÁSICO Por: Fernando Birck aka Fergo 2 SUMÁRIO 1. Introdução 3 2. Aplicativos 4 3. Processo de boot 5 4. Interrupts 6 5. Criando o Loader 7 6. Criando o Kernel 9 7. Gravando

Leia mais

Modelo Cliente/Servidor e Introdução a Sockets

Modelo Cliente/Servidor e Introdução a Sockets Modelo Cliente/Servidor e Introdução a Sockets MC 833 Programação em s de Computadores Instituto de Computação UNICAMP Juliana Freitag Borin O modelo OSI de 7 camadas Nó origem Nó destino Apresentação

Leia mais

Guia de Prática. Windows 7 Ubuntu 12.04

Guia de Prática. Windows 7 Ubuntu 12.04 Guia de Prática Windows 7 Ubuntu 12.04 Virtual Box e suas interfaces de rede Temos 04 interfaces de rede Cada interface pode operar nos modos: NÃO CONECTADO, que representa o cabo de rede desconectado.

Leia mais

Estrutura de um Sistema Linux Moderno Padrões de um Sistema Linux. Prof. Claudio Silva

Estrutura de um Sistema Linux Moderno Padrões de um Sistema Linux. Prof. Claudio Silva Estrutura de um Sistema Linux Moderno Padrões de um Sistema Linux Estrutura de um Sistema Linux Por ter sua origem universitária, a forma como o Linux foi concebido é de perfeito agrado para o seu estudo.

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Sistemas de Entrada/Saída Princípios de Hardware Sistema de Entrada/Saída Visão Geral Princípios de Hardware Dispositivos de E/S Estrutura Típica do Barramento de um PC Interrupções

Leia mais

PROFESSOR ÉVERSON MATIAS DE MORAIS SISTEMAS OPERACIONAIS. Sistemas operacionais (so) Roteiro

PROFESSOR ÉVERSON MATIAS DE MORAIS SISTEMAS OPERACIONAIS. Sistemas operacionais (so) Roteiro PROFESSOR ÉVERSON MATIAS DE MORAIS Graduação em Processamento de Dados Especialização em Ciência da Computação Mestrado em Ciência da Computação SISTEMAS OPERACIONAIS Aula 1 Sistemas operacionais (so)

Leia mais

Configuração Definitiva do Samba

Configuração Definitiva do Samba Configuração Definitiva do Samba 1 2 Sumário 1. Vantagens... 5 2. Desvantagem... 5 3. Conclusão Final... 5 4. Vamos botar a mão na massa!... 6 5. Instalação... 6 6. Configuração Parte 1 (Criando os diretórios)...

Leia mais

Sistema Operacional Ex: Complexo Computador multiusuário com vários terminais Tem que administrar todos os pedidos de usuários e assegurar que eles

Sistema Operacional Ex: Complexo Computador multiusuário com vários terminais Tem que administrar todos os pedidos de usuários e assegurar que eles Sistema Operacional Conjunto de programas que inicializam o hardware do computador; Fornece rotinas básicas para o controle de dispositivos; Fornece gerência, escalonamento e interação de tarefas; Mantém

Leia mais

GUIA DE BOAS PRÁTICAS

GUIA DE BOAS PRÁTICAS GUIA DE BOAS PRÁTICAS Sumário Requisitos para um bom funcionamento...3 Menu Configurações...7 Como otimizar o uso da sua cota...10 Monitorando o backup...8 Manutenção de arquivos...12 www.upbackup.com.br

Leia mais

Sistemas Operacionais. Prof. André Y. Kusumoto andrekusumoto.unip@gmail.com

Sistemas Operacionais. Prof. André Y. Kusumoto andrekusumoto.unip@gmail.com Sistemas Operacionais Prof. André Y. Kusumoto andrekusumoto.unip@gmail.com Estruturas de Sistemas de Computação O sistema operacional precisa garantir a operação correta do sistema de computação. Operação

Leia mais