Author Archive

Esta entrada es parte no. 9 de 10 en la serie Practicas C

2º Programa que lea dos números por teclado y calcule el valor de la suma, resta producto y división.

Solución 1.

// Inclusion de librerias

#include <stdio.h>

#include <stdlib.h>

 

// Funcion principal

int main(int argc, char *argv[])

{

  // Definicion de variables

  int A;

  int B;

  long int Suma;

  int Resta;

  float Division;

  long int Multiplicacion;

 

  // Solicitud de datos por consola

  printf(“Numero A ……: “);

  scanf(“ %d”,&A);

  printf(“Numero B ……: “);

  scanf(“ %d”,&B);

  // Realizar calculos

   Suma=A+B;

   Resta=A-B;

  Division=A/B;

  Multiplicacion = A*B;

  // Visualización de resultados

  printf(“\nLa suma es igual a %d”,Suma);

  printf(\nLa resta es igual a %d”,Resta);

  printf(“\nLa division es %.2f”,Division);

  printf(“\nLa multiplicacion es %d”,Multiplicacion);

  system(“PAUSE”);

  return 0;

}

 

Si observas detenidamente el programa en su ejecución podrás observar que la división es posible no salga correctamente y eso es debido a que una división entre enteros produce un entero, por lo tanto quizás para resolver mejor este programa deberías emplear otro tipo de dato para los números y que la resolución del mismo sea mas adecuada.

 

Esta entrada es parte no. 10 de 10 en la serie Practicas C

Iniciamos los ejercicios y practicas resueltas en el lenguaje de programación C.

 

1º Realizar un programa que pide un dato de entrada que se ha de corresponder a la longitud de un radio, calcula y visualiza la longitud de la circunferencia, el área del círculo y el volumen de la esfera que se corresponda con el radio dado.

Formulas a emplear:

Siendo r = radio y ^= elevado

Longitud circunferencia = 2·PI·r

Área círculo = PI·r^2

Volumen esfera = 4/3 · PI · r ^3

 

Solución (1)

#include <stdio.h>

#include <stdlib.h>

int main(int argc,char *argv[])

{

  // Creación de variables a utilizar

  int radio;

  float longitud;

  float area;

  float volumen;

  // Solicitar el radio por teclado

  printf(“Introduzca radio…: “);

  scanf(“ %d”,&radio);

  // Realizar los calculos

  longitud = 2*PI*radio;

  area = PI*(radio*radio);

  volumen = (4/3)*PI*(radio*radio*radio);

  // Visualizar los resultados

  printf(“\nLongitud del radio = %.2f”,longitud);

  printf(“\nArea = %.2f”,area);

  printf(“\nVolumen = %.2f”,volumen);

  system(“PAUSE”);

  return 0;

}

 

Si quieres realizar tu aporte hazlo utilizando los comentarios

 

Esta entrada es parte no. 8 de 10 en la serie Practicas C

 

Nuevo articulo para que sigas tus estudios online con nosotros, solucionando problemas, practicas y ejercicios realizados con el lenguaje de programación c.

 

Saber si un numero es primo o no

Planteamiento del ejercicio:

Se ha de solicitar por teclado un numero entero positivo, para finalizar el programa se ha de teclear el valor –1, en caso de ser el numero valido se ha de indicar si el numero es primo o no.

Solución al ejercicio propuesto:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    // Variables a utilizar en el programa
    int numero=0;
    int divisores=0;
    int primo=0; // primo = 0 no primo = 1

    // Solicitar numero entero hasta valor -1
    do
    {
        printf("\nNumero.....: ");
        scanf(" %d",&numero);
        if(numero!=-1 && numero>0)
        {
            // el numero es valido comprobar si es primo
            primo=0;
            divisores=2;
            while(divisores<numero  && primo!=1)
            {
                if(numero%divisores==0) primo=1;
                divisores++;
            }
            // Si primo vale 0 es que el numero es primo
            if (primo==0)
            {
                printf("\nEl numero %d es primo",numero);
            }
            else
            {
                printf("\nEl numero %d no es primo",numero);
            }
        }
    } while(numero!=-1);
    return 0;
}






Esta entrada es parte no. 7 de 10 en la serie Practicas C



Nuevo ejercicio de programación en c, para que puedas practicar este lenguaje base en el aprendizaje de programación. Los ejercicios resueltos no tienen un orden especifico en su complejidad, por lo tanto te puedes encontrar con ejercicios que para personas noveles en la programación resulten dificiles de comprender, busca las practicas que mas se ajusten a tus necesidades en base a tu nivel. Gracias por visitar el sitio web, un saludo y aprende desde tu casa.

Planteamiento de la practica de programación

El ejercicio planteado hoy es que el programa realice una serie de peticiones de notas de alumnos, hasta que se teclee un valor –1 para finalizar la introducción de notas. Una vez finalizada la introducción de notas se han de visualizar cuantos alumnos han aprobado y suspendido, asi como cuantos han sacado notas englobadas de la siguiente forma:

de 5 a 6 – suficiente

de 6 a 7 – bien

de 7 a 8 – notable

de 9 o superior – sobresaliente

Vuelvo a recordaros, que no pretendo dar lecciones de como se ha de programar un ejercicio, ya que puede haber muchas formas de resolverlo, esto no significa que la practica resuelta que aqui planteamos sea la mas correcta, de hecho siempre estoy dispuesto a añadir correcciones o nuevos planteamientos a la misma, si me los dejais en un comentario…

Practica resuelta de programacion en c

#include <stdio.h>
#include <stdlib.h>
int main()
{
    // Declaracion de variables
    int nota=0;
    int positivos=0;
    int negativos=0;
    int aprobados=0;
    int suspendidos=0;
    int bien=0;
    int notable=0;
    int sobresaliente=0;
    int suficiente=0;

    // Solicitar notas hasta teclear -1
    printf("\nNotas de los alumnos. (Para finalizar -1 )\n");
    do
    {
        printf("Nota...: ");
        scanf(" %d",&nota);
        // controlar si se quiere finalizar o no
        if(nota!=-1)
        {
            // controlar valores positivos y negativos
            if(nota>0)
                positivos++;
            else if(nota<0)
                negativos++;
            // controlar aprobados suspendidos
            if(nota<5)
                suspendidos++;
            else
                aprobados++;
            // controlar calificaciones
           if(nota>=5 && nota<6)
                suficiente++;
            else if(nota>=6 && nota<=7)
                bien++;
            else if(nota>=7 && nota<9)
                notable++;
            else if(nota>=9)
                sobresaliente++;
        }
    } while(nota!=-1);

    // Visualizar resultados
    printf("\nNOTAS DE LOS ALUMNOS");
    printf("\nAlumnos aprobados ...............: %d",aprobados);
    printf("\nAlumnos suspendidos .............: %d",suspendidos);
    printf("\nAlumnos con nota suficiente .....: %d",suficiente);
    printf("\nAlumnos con nota bien ...........: %d",bien);
    printf("\nAlumnos con nota notable ........: %d",notable);
    printf("\nAlumnos con nota sobresaliente ..: %d",sobresaliente);
    // Realizar calculos correspondientes

    return 0;
}





Esta entrada es parte no. 6 de 10 en la serie Practicas C





Un ejercicio nuevo de c sobre ficheros, para complementar tu formación en nuestro portal de cursos online y de teleformacion.

El ejercicio consiste en realizar un programa el cual ha de leer de un archivo 10 valores numéricos y a continuación crear un vector en memoria de forma dinámica. Se ha de solicitar un valor numérico por consola y multiplicar cada uno de los elementos del vector por dicho valor numérico, una vez realizado todos los procesos cerrar el archivo y liberar la memoria utilizada por el vector.

 

Solución al ejercicio planteado:

#include <stdio.h>
#include <stdlib.h>
int main()

{

    // Variables a utilizar

    int cuantos;
    int *Vector;
    FILE *fichero;
    int numero;
    int contador;

    // Crear array dinamico de memoria
    cuantos=10;
    Vector=(int *)malloc(sizeof(int)*cuantos);

    // leer archivo de datos y asignar los valores al array dinamico
    fichero=fopen("archivo.dat","rt");
    if(!fichero) {
        printf("\nError en la apertura del archivo archivo.dat. Compruebe que exista.");
        exit(1);
    }

    // prelectura
    fscanf(fichero,"%d\n",&numero);
    contador=0;
    while(!feof(fichero) && contador<10)
    {
        Vector[contador]=numero;
        contador++;
        fscanf(fichero,"%d\n",&numero);
    }

    // Cerrar archivo
    fclose(fichero);

    // pedir valor numerico

    printf("\nTeclee valor numerico ...: ");
    scanf(" %d",&numero);

    for(contador=0;contador<10;contador++) {
        Vector[contador]*=numero;
        printf("\n-> %d ",Vector[contador]);
    }

    // liberar memoria y salir del programa
    free(Vector);

    return 0;

}





may
03

Seguridad sistemas y redes (10)

Posted by: admin | Comments (0)
Esta entrada es parte no. 10 de 10 en la serie Seguridad Sistemas

Cadenas identificativas y otros recursos (6)

Rastrear redes
Escaneo de puertos con UDP

Este tipo de escaneo se realiza utilizando paquetes de tipo UDP  (User Datagram Protocol) en vez de utilizar paquetes TCP. Los puertos UDP abiertos no realizan contestacion con el flag ACK activado a diferencia de los puertos TCP. Los puertos cerrados UDP no están obligados a responder con un paquete RST activado, pero responden con un mensaje de tipo ICMP_PORT_UNREACHABLE. Al igual que en los dos últimos tipos de escaneos tcp comentados se utiliza para realizar mapeos inversos y deducir así que puertos están abiertos.

Envio con el puerto cerrado

Equipo A ————> UDP ————–> Equipo B

Equipo A <———— ICMP UNREACHABLE <——- Equipo B

Ejemplo con NMAP:

root@ubuntu:~# nmap -sU 192.0.2.1

Starting Nmap 5.00 ( http://nmap.org ) at 2010-05-03 11:35 CEST
Interesting ports on 192.0.2.1:
Not shown: 999 closed ports
PORT   STATE         SERVICE
53/udp open|filtered domain
MAC Address: 00:30:DA:XX:XX:XX (Comtrend CO.)

Nmap done: 1 IP address (1 host up) scanned in 1085.72 seconds

Ejemplo con Hping:

root@ubuntu:~# hping3 -V -c 4 -2 -p 2049 192.0.2.1
using eth0, addr: 192.0.2.245, MTU: 1500
HPING 192.0.2.1 (eth0 192.0.2.1): udp mode set, 28 headers + 0 data bytes
ICMP Port Unreachable from ip=192.0.2.1 name=UNKNOWN
status=0 port=1274 seq=0
ICMP Port Unreachable from ip=192.0.2.1 name=UNKNOWN
status=0 port=1275 seq=1
ICMP Port Unreachable from ip=192.0.2.1 name=UNKNOWN
status=0 port=1276 seq=2
ICMP Port Unreachable from ip=192.0.2.1 name=UNKNOWN
status=0 port=1277 seq=3

--- 192.0.2.1 hping statistic ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.6/250.6/1000.5 ms

Entre las ventajas de este método se puede destacar que es fácil detectar si una maquina esta activa y que puertos udp tiene abiertos, por el contrario se ha de tener privilegios de superusuario para realizar este tipo de escaneo, son bastante lentos y los paquetes que se envían no tienen porque garantizar respuestas positivas, ya que puede ser que se pierdan los paquetes al enviarlos o recibirlos.








Escaneo utilizando el puerto ECHO

El puerto ECHO (No. 7) es un tipo de conexión que los sistemas linux actualmente lo traen cerrado ya que no se utiliza, pero en otros sistemas vienen por defecto activado. Se utiliza para realizar comprobaciones de conexión, es decir si la maquina esta activa o no, actualmente se utiliza ping. Se puede utilizar TCP o UDP para realizar la conexión a este puerto. En cualquiera de los casos la función de este puerto ECHO (Eco) es devolver lo que se le envía, de ahí su nombre. En el caso de TCP se puede utilizar el programa telnet para probar si la maquina esta activa, de hecho la conexión a la maquina destino implica una negociación completa en tres pasos (Treeway-handshaking), lo cual significa que la maquina destino se encuentra en la red.

Ejemplo tcp con telnet:

#telnet 192.168.1.1   7

Trying 192.168.1.1…

Connected to 192.168.1.1.

Escape character is ‘^]’.

Envio de eco

Envio de ecotelnet>close

Ejemplo udp con netcat:

#nc –v –u 192.168.1.1 echo

192.168.1.1: inverse host lookup failed: Unknown host

(UNKNOWN) [192.168.1.1] 7 (echo) open

Envio de prueba

Envio de prueba
Envio de ICMP de tipo ECHO

El protocolo ICMP (Internet Control Message Protocol) es el que informa de posibles errores en la capa de red.  Este tipo de escaneo se puede considerar como la forma mas simple de saber si un equipo responde, ya que se utiliza para realizarlo el conocido comando ping, que genera un mensaje ICMP de tipo echo, al cual también se le llama de tipo 8 o simplemente ping. Al realizar el ping la maquina responde con un mensaje también de tipo ICMP pero esta vez de tipo REPLY, también denominado pong.

Ejemplo utilizando el comando ping:

root@ubuntu:~# ping -c 4 192.0.2.1
PING 192.0.2.1 (192.0.2.1) 56(84) bytes of data.
64 bytes from 192.0.2.1: icmp_seq=1 ttl=255 time=0.559 ms
64 bytes from 192.0.2.1: icmp_seq=2 ttl=255 time=0.562 ms
64 bytes from 192.0.2.1: icmp_seq=3 ttl=255 time=0.553 ms
64 bytes from 192.0.2.1: icmp_seq=4 ttl=255 time=0.566 ms

--- 192.0.2.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2998ms
rtt min/avg/max/mdev = 0.553/0.560/0.566/0.004 ms
Envio ICMP tipo broadcast

Este tipo de envíos o escaneos realizan una petición ICMP de tipo 8 o ping a broadcast , al realizar este tipo de envió al broadcast se esta solicitando respuesta a toda la red de forma que todos los equipos que la componga enviaran respuesta.  Es un tipo de escaneo peligroso también denominado smurf broadcast, ya que puede dar lugar a un bloqueo de la red por colapso.

Ejemplo utilizando el comando hping:

root@ubuntu:~# hping3 -1 -c 5 192.0.255.255
HPING 192.0.255.255 (eth0 192.0.255.255): icmp mode set, 28 headers + 0 data bytes
len=46 ip=192.0.255.255 ttl=32 id=39545 icmp_seq=0 rtt=0.3 ms
DUP! len=46 ip=192.0.3.201 ttl=255 id=25118 icmp_seq=0 rtt=0.4 ms
len=46 ip=192.0.3.201 ttl=255 id=25119 icmp_seq=1 rtt=0.2 ms
DUP! len=46 ip=192.0.255.255 ttl=32 id=39547 icmp_seq=1 rtt=0.2 ms
len=46 ip=192.0.3.201 ttl=255 id=25120 icmp_seq=2 rtt=0.4 ms

--- 192.0.255.255 hping statistic ---
3 packets transmitted, 5 packets received, -66% packet loss
round-trip min/avg/max = 0.2/0.3/0.4 ms

Una de las ventajas a destacar es que en la mayoría de redes Unix/Linux suelen responder a este tipo de petición, por el contrario en redes Windows este tipo de escaneo es omitido por defecto, en redes unix se puede llegar a producir el colapso de la red debido a este tipo de petición, es recomendable configurar o asegurar la red para que no responda a este tipo de peticiones.

envio ICMP tipo 10 o router

Este tipo de envió es el que realizan los routers para que las maquinas de la red detecten su presencia. El router envía mediante multicast o multidifusión (el envió de información en una red a múltiples destinos simultáneamente), una trama ICMP, de esta forma equipos en la red que no hubieran localizado su router darán con el suyo. Este tipo de envió se ha de generar con una aplicación especial, en este caso esta aplicación se denomina icmpush y es bastante fácil de localizar en cualquier distribución linux.

Ejemplo utilizando el comando icmpush:

nacho@ubuntu:~$ sudo icmpush -vv -rts 192.0.3.10
 -> Outgoing interface = 192.0.2.245
 -> ICMP total size = 8 bytes
 -> Outgoing interface = 192.0.2.245
 -> MTU = 1500 bytes
 -> Total packet size (ICMP + IP) = 28 bytes
ICMP Router Solicitation packet sent to 192.0.3.10 (192.0.3.10) 

Receiving ICMP replies ...
icmpush: Program finished OK
Envio ICMP de tipo 13 o marcas de tiempo

Las marcas de tiempo se utilizan como protección para evitar la falsificación de paquetes TCP que alteren la secuencia de conexión, existe un limite de tiempo de espera entre cada paquete de una misma conexión de forma que si se supera este limite de tiempo la conexión queda cancelada. Las marcas de tiempo o timestamps permiten obtener información de las maquinas activas, ya que si se envía una petición de tipo 13 a una maquina esta indicara si esta activa y resolverá también su zona horaria con lo que se puede determinan la zona geográfica a la cual pertenece dicha maquina. Para realizar este tipo de envíos se utiliza también la herramienta mencionada anteriormente denominada icmpush. Los sistemas Unix suelen responder a este tipo de peticiones mientras que los equipos windows no.

Ejemplo utilizando el comando icmpush:

nacho@ubuntu:~$ sudo icmpush -vv -tstamp 192.0.2.1
 -> Outgoing interface = 192.0.2.245
 -> ICMP total size = 20 bytes
 -> Outgoing interface = 192.0.2.245
 -> MTU = 1500 bytes
 -> Total packet size (ICMP + IP) = 40 bytes
ICMP Timestamp Request packet sent to 192.0.2.1 (192.0.2.1)

Receiving ICMP replies ...
192.0.2.1       -> Timestamp Reply transmited at 01:00:00
icmpush: Program finished OK
Envio ICMP de tipo 15

Este envió ya es obsoleto pero algunas versiones de sistema Unix antiguas todavía siguen respondiendo al mismo, al realizar el envió la maquina destino respondía con su dirección de red.

Ejemplo utilizando el comando icmpush:

nacho@ubuntu:~$ sudo icmpush -vv -mask 192.0.2.1
 -> Outgoing interface = 192.0.2.245
 -> ICMP total size = 16 bytes
 -> Outgoing interface = 192.0.2.245
 -> MTU = 1500 bytes
 -> Total packet size (ICMP + IP) = 36 bytes
ICMP Address Mask Request packet sent to 192.0.2.1 (192.0.2.1)

Receiving ICMP replies ...
icmpush: Program finished OK





Comments (0)

Calendario

septiembre 2010
L M X J V S D
« jun    
 12345
6789101112
13141516171819
20212223242526
27282930  

Referencias

Sitio seleccionado por
el Directorio Flesko


Blog Directory, Find A Blog, Submit A Blog, Search For The Best Blogs
Blog Directory