Cuando estamos trabajando bajo C/C++ en Unix, normalmente podríamos tener varias tareas a realizar concurrentemente y que habría que esperar hasta completarlas, una posible solución es utilizar concurrencia de procesos usando fork.

Aquí expongo un ejemplo donde, un proceso padre crea 4 procesos y espera a que terminen, estos procesos, se han creado mediante la función fork , para más info: http://en.wikipedia.org/wiki/Fork_%28operating_system%29

Aquí el código:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
const int MAX_PROC = 4;
int main(int argc, char *argv[])
{
	/* VAR */	
	pid_t whichone;
	int howmany;
	int status;
	int i = 0;
	/* MAIN */
	for( ; i < MAX_PROC; i++)
	{
		if( fork() == 0 )
		{
			int pid = getpid();
			printf("create \n",pid);
			sleep(  (pid%2==0)?5:10);
			return 0;		
		}
	}  
    i = 0;
    while (i < MAX_PROC)
    {
        whichone=wait(&status);
        i++;
        printf("estado  ",whichone); 
        if ((status & 0xffff)==0)
           printf("end ok \n");
        else
           printf(" WARNING END ko \n");
    }
    return 0;
}



La función fork() como bien se puede leer en wikipedia, devuelve 0 si es un hijo, 1 si es el padre y -1 si ha ocurrido un error, la función wait esperará a que todos los hijos terminen.


En este ejemplo, los procesos con pid par se ejecutarán más rápidos, si quieres personalizar este código para tus necesidades, deberás de escribir el código dentro del bucle for, añadiendo las tareas que necesites o bien llamando a fork tantas veces como quieras.


Espero que sirva de ayuda.
 
Un saludo.

Ya es hora de meterse un poco con Android que ya  toca…… Particularmente lo primero que hago después del hola mundo, es un hola mundo en  un “MessageBox de toda la vida” o una caja de texto emergente, expongo aquí el código para hacer esto:

El paquete que hay que importar es el siguiente:

import android.app.AlertDialog;



El código para mostrar el mensaje emergente es el siguiente ( Nota:el ejemplo lo he implementado dentro de un Activity, no ha sido probado en otro contexto):

		AlertDialog alertDialog;
		alertDialog = new AlertDialog.Builder(this).create();
		alertDialog.setTitle("Hola");
		alertDialog.setMessage("Hola mundo");
		alertDialog.show();



También puede ser útil para hacer depuraciones en ciertos puntos del programa en ejecución cuando no se dispone de otro método más limpio como un log, un label de texto etc.
Para más información consultar la página del manual del SDK de Android. http://developer.android.com/guide/topics/ui/dialogs.html

Espero que os sirva.

Un saludo.

Valiente temporada de ataques de fuerza bruta y de diccionario han tenido los servidores, y las paradas que eso han provocado, para ello he realizado un pequeño script usando iptables.

iptables, es un pequeño firewall que tiene un  sistemas GNU/Linux incluido y muy fácil de automatizar en este caso de banear ips:

Este ejemplo está probado y funciona en un CentOS.

Script:

#!/bin/bash 
case "$1" in
banear)
	echo "baneando a la ip=$2"
	echo "-------------------"
	/sbin/iptables -A INPUT -s $2  -j DROP
	;; #
desbanear)
	echo "desbaneando a la ip=$2"
	echo "-------------------"
	iptables -D INPUT -s $2 -j DROP
	;;
ver)
	echo "Viendo a los baneados";
	echo "-------------------"
	/sbin/iptables -L INPUT -v -n 
	;;
*)
	echo "Usage: $0  {banear|desbanear|ver}"
	exit 1
esac
exit

Se debería añadir:

  1. El script debería ser ejecutado por root o con sudo
  2. Comprobar que el segundo argumento es una ip.

Fuentes:

  • http://www.cyberciti.biz/faq/rhel-fedorta-linux-iptables-firewall-configuration-tutorial/
  • http://es.tldp.org/Manuales-LuCAS/doc-iptables-firewall/doc-iptables-firewall-html/

Espero que os sirva
Un saludo.

La orden find es, a mi gusto, muy amplia y su explicación a fondo haría de este post muy extenso, en mi humilde opinión este tipo de órdenes al final se usan en tu vida diaria para ejecutar acciones más rápidas si las sabes usar bien, puedes sacarles un buen partido.

Te puede ahorrar incluso el uso de un script, en mi caso necesitaba buscar  todos los ficheros  que no  tengan la extensión mp3 , mp4 y jpg

Al final use  la orden find con estos parámetros:

find  / -type f  -not  \( -iname “*\.mp3*” -o -iname “*\.mp4*” -o -iname  “*\.jpg*”  \)

Podríamos usando estas operaciones hacer muchas cosas curiosas, lo más inmediato es cambiar los permisos por ejemplo:

find  / -type f  -not  \( -iname “*\.mp3*” -o -iname “*\.mp4*” -o -iname  “*\.jpg*”  \)  -exec chmod 755 {} \;

Vayamos por partes:

  • / # directorio en el que busco
  • -type f  #  el tipo ficheros
  • -not \( -iname “*\.mp3*” -o -iname “*\.mp4*” -o -iname  “*\.jpg*”  \) # operación equivalente a -> no sea ni mp3 ni mp4 ni jpg
    • - not ( )  # se niega todo lo que hay dentro
    • -iname “\.*mp3* # todos los mp3 el iname es sensible a las mayúsculas y minúsculas
    • -o  # un or lógico

Fuente y más información:

  • http://content.hccfl.edu/pollock/Unix/FindCmd.htm
  • http://www.devdaily.com/unix/edu/examples/find.shtml
  • http://linux.about.com/od/commands/l/blcmdl1_find.htm

Espero que os sirva.

Un saludo.

Hay bucles que pueden ser peligros en C, sobre todo si tenemos una función que procesa un array que es estático y esta función lo recorre para procesarlo. Para procesarlo hay que conocer el tamaño.

int array[]= { 1, 2, 3, 4, 5, 6 };

Este bucle funciona:

 	int i = 0;
	for(;array[i];i++)
		printf("%d\n",array[i]);

Pero es peligroso ya que espera en array[i] un valor de fin de cadena , y puede en otro tipo de arrays que no sean de cadena pueden provocar un bucle infinito o desbordar el buffer.

Esta es la manera correcta:

int len=sizeof(array)/sizeof(int);
  	printf("Length Of Array=%d", len);
        int i = 0;
	for(;i

Explicación de int len = ( sizeof(array)/sizeof(int) )

Es la división entre el tamaño del array en bytes = 24 = sizeof(24) entre el tamaño de un entero sizeof(int) que es 4, la división es 6, que es el tamaño del array.

Mejora

La mejora es hacerlo genérico el cálculo del array, de manera que se puede aplicar a todo array estático, esto se  hace de la siguiente manera:

int len = ( sizeof(array)/sizeof(array[0]) );

sizeof(array[0] ) calcula el tamaño en bytes de ese elemento con lo cual no importaría de que tipo fuese el array para recorrerlo siempre podemos calcular su tamaño.

Fuentes:

  • http://roseindia.net/c-tutorials/c-array-length.shtml

Espero que os sirva.

Un saludo.

Un falso amigo: PATH en GNU/Linux

Posted: 19 marzo, 2012 in Seguridad

Investigando un poco sobre la programación segura en GNU/Linux, nos encontramos con el problema de las variables de entorno, en concreto una de las más peligrosas que veo es PATH.

PATH indica las rutas en las que se pueden encontrar los archivos ejecutables y bibliotecas cuando el programa los invoque, de manera que no hace falta que se especifique la ruta absoluta.

Es una variable que si por ejemplo abrimos un terminal y ponemos la siguiente orden:

$> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/game

Vemos como nos indica una serie de directorios separados por dos puntos, en donde por orden va buscando los ejecutables, de manera que si invocamos la orden ls o chmod, buscará de izquierda a derecha por los directorios hasta encontrar el ejecutable.

¿ Cual es el problema ?

Esa variable es modificable por el usuario y no por root, de manera que si se pone este comando:

PATH=/home/directorio_pirata:$PATH
export PATH

Se observa que ese directorio pirata, puesto en  el principio de la variable, cuando se invoque una orden  buscará primero en ese directorio, siendo ejecutadas nuestras falsas órdenes.

Si se tiene un poco de mala idea y se quiere inyectar código mediante la común orden “ls” se haría de la siguiente manera:

#!/bin/bash
echo "-----------------"
echo "CODIGO INJECTADO----- :( "
echo "-----------------"
#podría ir cualquier cosa
/bin/ls $@

Todo el que llame a ls ahora ejecutará primero nuestro código, que menos mal,  es un simple “echo” y luego la orden ls, de manera que si ejecutara un exploit etc sería lo mismo.

La cosa va a mayores si se edita como usuario el fichero .bashrc, y si algunas vez tenemos suerte puede que nos hagamos con el sistema, no es fácil pero ya tenemos algo.

Lo mejor en un script es llamar con el path absoluto a los ejecutables, si hay que llamar a ls, que sea /bin/ls, el PATH no es de fiar.

Espero que os sirva.

Un saludo.

Errores en PHP: Paamayim Nekudotayim

Posted: 14 marzo, 2012 in PHP

¿Paamayim Nekudotayim?

El dolor de cabeza comienza en al paso de producción al server final, accedo a mi bonita función y…. :

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /xxxx/xxxx/algun_controller.php on line 64

Como un tonto buscaba y buscaba en la línea 64 y nada, después de estar programando durante horas, ya saturadísimo accedí a stack overflow e investigando un poco pasé un buen rato:

Segun Wikipedia.org:

[..]In PHP, the scope resolution operator is also called Paamayim Nekudotayim (Hebrew: פעמיים נקודתיים‎, pronounced [paʔaˈmajim nəkudoˈtajim]), which means “twice colon” or “double dot twice” in Hebrew.[...]

Que traducido al español es que en “hebreo” Paamayim Nekudotayim es el operador de ámbito “::”

Vaya gracia que me hizo, ¿Qué se puede hacer para solucionarlo ?

Ejemplo de  código problematico, en este caso una función estática en PHP que para llamarla se puede utilizar el operador de ámbito, dependiento de tu versión de PHP instalada en algunos casos te funcionará y en otros no, en mi caso en el server final había una versión más antigua de PHP, vamos este código:

class Product
{
public static function funcion(){ ...... }
}

El fallo estaba al utilizar funciones estáticas y llamarlas usando el operador “::”:

// -------------
// - codigo que falla
// -------------
$p = new Product();
$p::funcion();

Para solucionarlo tan sencillo como utilizar el operador “->” y poner esto:

$p->funcion()

Versiones de PHP con ese problema:

A partir de PHP 5.3.0, es posible hacer referencia a una clase usando una variable. El valor de la variable no puede ser una palabra clave (por ej., self, parent y static).

Fuente:

  • http://en.wikipedia.org/wiki/Scope_resolution_operator
  • http://stackoverflow.com/questions/592322/php-expects-t-paamayim-nekudotayim
  • http://in2.php.net/distributions/manual/php_manual_es.html.gz

Espero que os sirva.

Un saludo