Patricio Domingues

Patrício Domingues é doutorado em Engenharia Informática e professor do Departamento de Engª Informática na Escola Superior de Tecnologia e Gestão (ESTG) do Instituto Politécnico de Leiria (IPLeiria). Tem lecionado, entre outras, a disciplina de Programação Avançada da Licenciatura em Engenharia Informática. É ainda responsável pelo GPU Education Center (antigo NVIDIA CUDA Teaching ) da ESTG/IPLeiria.

Programação de aplicações cliente/servidor assentes no protocolo de transporte UDP

A pilha protocolar TCP/IP

A pilha protocolar TCP/IP é considerada o standard de facto na área das comunicações informáticas, sendo praticamente obrigatório o seu uso em aplicações distribuídas. A referida pilha tem mecanismos próprios que possibilitam o envio, encaminhamento e receção de dados entre duas ou mais entidades comunicantes. Um dos elementos chaves da pilha TCP/ IP é o endereço IP que identifica um sistema computacional. Atualmente, existem dois tipos de endereços IP: IPv4 e IPv6. O IPv4 assenta em endereços de 32 bits (4 octetos), sendo comum a sua representação através de 4 números inteiros separados por ponto. Por exemplo, 192.168.120.12 é um endereço IPv4. O crescimento exponencial da internet tornou necessária a criação de um espaço de endereçamento alternativo, com capacidade para um maior número de endereços IP: o IPv6. Neste protocolo, cada endereço IP é composto por 128 bits (16 octetos). Exemplos de endereço IPv6 são 2001:0db8:85a3:0000:0000:8a2e:0370:7334 e ::1, este último representando o endereço local.

Continuar a ler

Programação (in)Segura – Transbordo de Memória

Introdução

O software assume cada vez mais uma importância primordial no nosso dia-a-dia. De facto, é crescente o número de dispositivos com o qual interagimos quotidianamente e cujo funcionamento está dependente de software. Exemplos incluem, obviamente, computadores e tablets, bem como dispositivos ditos inteligentes, como telemóveis, relógios e televisões. Outros exemplos abarcam sistemas de transportes como automóveis, aeronaves e barcos, e sistemas de domótica, para citar apenas alguns dos mais conhecidos. Dado a complexidade associada não só à criação e manutenção de programas informáticos como ainda dos sistemas que pretendem controlar, o software está sujeito a ocorrência de erros. Alguns desses erros podem ser aproveitados por indivíduos ou entidades com intenções maliciosas para subverter os dispositivos controlados, comprometendo deste modo, parcial ou totalmente, a segurança dos sistemas.

Este artigo analisa os erros do tipo transbordo de memória, em particular os que poderão ocorrer no segmento de pilha. O artigo foca alguns dos problemas de segurança que estão associados a situações de transbordo de memória afeta ao segmento de pilha. Os exemplos de código apresentados foram testados num sistema Linux – Lubuntu 14.04 / 32 bits, com kernel versão 3.13.04. Os exemplos foram compilados com a versão 4.8.2 do compilador de linguagem C GNU Collection Compiler (GCC).

Continuar a ler

Travessia de uma árvore de diretórios usando recursividade

Introdução

O diretório é um elemento familiar nos sistemas de ficheiros, sendo empregue para organizar o armazenamento de dados em suporte persistente como, por exemplo, discos rígidos. Uma operação relativamente comum num sistema de ficheiros é a travessia da árvore de diretórios, através da qual são visitados todos os subdiretórios e ficheiros. Este artigo foca o uso de recursividade e das funções stat e readdir para a travessia de uma árvore de diretório recorrendo à metodologia denominada de busca em profundidade (depth-first search na designação anglo-saxónica) (Knuth, 1968) (Wikipedia, 2015). Embora o artigo assente no ambiente Linux e na linguagem C, a metodologia utilizada pode ser empregue, com algumas adaptações, noutras plataformas e com outras linguagens de programação.

Continuar a ler

Manipulação ao nível do bit na Linguagem C

É sabido que um computador trabalha em modo binário, armazenando e manipulando bits, isto é, zeros e uns. Este artigo procura resumir as metodologias mais comuns para uso e manipulação de bits através da linguagem C.

Base binária, octal e hexadecimal

A designação bit identifica um valor da base binária. Como o nome sugere, a base binária é composta por dois valores distintos, representados por zero e um, daí também se designar por base dois. Assim, um bit pode assumir um desses dois valores, sendo muitas vezes empregue para representar um estado ativo (bit com o valor a 1) ou inativo (bit com valor a 0).

Continuar a ler