viernes, 8 de abril de 2011

Nos mudamos

Después de año y pico con Blogger el blog se muda a un Wordpress, el tema es que da mucho más juego para cacharrear ( los de HelioHost permiten cgi's y en ruby, python, perl y demás golosinas ), ser un poco más libres y de paso queda todo ordenado, falta adaptar algunos posts que dan problemas con la indentación del código y cosas así, pero ya está operativo en:

http://codigoparallevar.co.cc/blog/

(La principal aún está por hacer xD)
Y eso es todo, nos vemos

miércoles, 6 de abril de 2011

Un bot eliza para IRC

Bueno, pues me encontré en [ http://www.jezuk.co.uk/cgi-bin/view/software/eliza ] un bot eliza programado en python que puede ser usado directamente o como módulo, así que traducido a español y con la librería de IRC pues ya está listo un bot para hacer la gracia.

Todo junto aquí [ wilson.zip ]  (hay que ejecutar a wilson.py)

lunes, 4 de abril de 2011

Suma y resta en Tubes [ desvarío ]

Por si alguien se pensaba que el intérprete de Tubes iba en broma (la elección del día quizá no fue la mejor xD), aquí va una pequeña calculadora (suma y resta módulo 4) [ http://pastebin.com/qrU4wWMT ]

Saludos

viernes, 1 de abril de 2011

Intérprete de Tubes

Actualizado: el intérprete tenía un bug en una tabla, ya está arreglado [ http://pastebin.com/1zQQD0a4 ]

El otro día, rondando por esolang.org me encontré con un lenguaje de esos que hay que probar, Tubes, donde la lógica del programa se escribe en forma de cañerías, por ejemplo, un bucle que va mostrando 012301230123...

 ┌┐
 ◉◆
 ║║
▶┤│
 └┘


Pero había un problema, aún no había una implementación, así que hubo que ponerse manos a la obra, y de paso aprovechar para probar Python 3 que se maneja mejor que la versión 2 con las cadenas Unicode (todos los "dibujos" del código son unicode :P), este es el resultado[ http://pastebin.com/1zQQD0a4 ].

Como parámetro necesita el código a ejecutar, pero luce más si se le pasa la opción -d para que muestre el estado actual, se puede regular el retardo entre operaciones especificandolo después de -d (sinó no muestra el estado no hay retardo) y... eso es todo, chim pum!
Nos vemos

Internacionalizando un programa

Hoy veremos como hacer posible que se traduzca un programa a distintas lenguas ( internacionalización ), esto lo haremos con la librería gettext de GNU

miércoles, 30 de marzo de 2011

Evolvotron, un programa que hay que probar [offtopic]

Me voy a salir un poco de tema para recomendar un programa de "arte generativo", Evolvotron, lo que hace es mostrar al usuario unas imágenes de la que tiene que seleccionar una, así continuamente para encontrar con un algoritmo genético una imágen a gusto del usuario (requiere un poco de paciencia para cojerle el truco), la única parte mala es que según la web parece que no funciona en el SO de Microsoft (aunque es GPL y usa Qt y BOOST, no debería ser difícil portarlo).

Y con un poco de paciencia acabas con un wallpaper o con una galería como esta[ gigrafx - deviantart ]

Enfin, que si andais aburridos ya teneis que hacer :P

lunes, 28 de marzo de 2011

Programa para manejar archivos .torrent

La idea era escribir un programa que manejara archivos .torrent ( añadir, modificar y eliminar datos ) y de paso un mini-libreria ( tres archivos ).

 Por partes, aquí está el código [ btcat.zip ], se compila con make o compilando directamente btcat.c

Los argumentos son estos:

./btcat -f <file> -l [-b]
./btcat -f <file> -e <element> {-s|-a <type>|-r|-m <value>} -o <output> [-b]
./btcat -n -o <output>
./btcat -h
-h: Shows this help
-l: Lists the *.torrent file content
-s: Shows an element
-r: Deletes an element
-a: Adds an element
-n: Creates a new file
Types:
  d: Dictionary
  l: List
  i: Integer
  s: String
  Note: Dictionaries and lists ignore the value
-m: Modify an element
-e: File element
-o: Output file
-b: Shows also the binary information
-f: Set's the target file

jueves, 24 de marzo de 2011

Comprobación de números primos con el FIPS186

Que no se diga, aquí está el código del algoritmo y una comprobación para ver el número de falsos positivos y negativos:




#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import random

""" FIPS186
Step 1. Set i = 1 and n > or = to 50.
Step 2. Set w = the integer to be tested, w = 1 + 2 a m, where m is odd and 2 a is m, where m is odd and 2 is the largest power of 2 dividing w - 1

Step 3. Generate a random integer b in the range 1 < b < w
Step 4. Set j = 0 and z = b**m mod w mod w
Step 5. If j = 0 and z = 1, or if z = w - 1, go to step 9
Step 6. If j > 0 and z = 1, go to step 8
Step 7. j = j + 1. If j < a, set z = z 2 mod w and go to step 5 mod w and go to step 5

Step 8. w is not prime. Stop.
Step 9. If i < n, set i = i + 1 and go to step 3. Otherwise, w is probably prime
"""

from math import sqrt
# Comprobación real
def rchk(n):
    for i in xrange(2,int(sqrt(n))+1):
        if not n % i:
            return False
    return True
     
# Especificada en el FIPS186
def chkprime(w, n = 50):
    m = w-1
    a = 0
    while not m & 1:
        m >>= 1
        a += 1
    i = 0
    while True:
        b = random.randint(2, w-1)
        j = 0
        while True:
            z = (b**m) % w
            if ( j == 0 and z == 1) or \
              z == w-1:
                if (i<n):
                    i += 1
                    break

                else:
                    return True

            if j > 0 and z == 1:
                return False

            j += 1
            if j < a:
                z = ( z * z ) % w

            else:
                return False

fn = 0
fp = 0
pr = 0
inicio = 10
fin = 10000
import sys
for i in xrange(inicio,fin):
    c = chkprime(i)
    r = rchk(i)
    if not i%100:
        sys.stdout.write("\r"+str(i)+" "+str(pr))
        sys.stdout.flush()
    if c:
        pr += 1
    if c != r:
        if c:
            fp += 1
            pr -= 1
        else:
            fn += 1
            pr += 1

print ""
print "Primos:", pr
print "Falsos negativos:", fn
print "Falsos positivos:", fp


Por ejemplo:


Primos: 1225
Falsos negativos: 608
Falsos positivos: 0


ps: se me pasó poner la licencia, como siempre está bajo WTFPL

Saludos

miércoles, 23 de marzo de 2011

Introduccion a la criptografia, con Python: DSA (V -2)

Después de 8 meses de demorar el momento de enfrentarse a DSA, continúa esta introducción a la criptografía ( aaaleluyaaaa... )

Pues seguimos con la introduccion a la criptografia... acababamos de ver el cifrado usando ElGamal y quedaba pendiente el algoritmo de firmado usando DSA para pasar a la sexta parte ( hashes de nuevo ), así que ahí vamos, documentación y código intercalado:


Obtener el número de bits de un número en Python [tip]

Perdón a los que les estoy rallando con esto de los tips, son cosas que cuando no se te ocurren no sabes de donde sacarlas, pero ya escritas son simples y obvias, sin más dilación:

def bitN(i):
    return len(bin(i)[2:])


Me explico, se pasa a binario bin(i), se separa el número del indicador de formato [2:] (0b) y se muestra su longitud len( )

Saludos

martes, 22 de marzo de 2011

Humo y espejos con el terminal y `cat`

Cross-posteado en el blog de HackXCrack

Si alguna vez se te ocurrió lanzar un cat a un archivo que no fuera de texto, como una imágen o un ejecutable hay ciertas posibilidades de que notaras que había pasado algo raro cuando el comando volvió, el terminal "pensó" que habías escrito algunos caracteres... es más, si pulsaste [enter] para pasar a una línea limpia pensando que solo es basura que dejó el archivo, el terminal había intentado ejecutar el comando!

Me atreveré a decir que lo que pasó fue que en algún momento el cat mostró el par de caracteres \x1b Z  ( \x1b es ESC ), mostrando algo como "62;9;c", hay más combinaciones que producen estos eventos pero esta, por ser la más corta, es la que tiene más probabilidades de darse por casualidad.

Todo esto viene porque el terminal emula un procolo antiguo, que acepta ciertas combinaciones de datos como caracteres de control (algo similar era en lo que se basaba el phreaking analógico :P ), aprovechando esto y esperando que el usuario también pulse instintivamente [enter] para pasar a una línea en blanco intentaremos que el usuario que lea un archivo ejecute un comando :), aunque la verdad sea dicha, estamos muy limitados.

Nota: aquí hablo del comando cat, pero pasa lo mismo con cualquiera que muestre algo directamente por pantalla, head, tail, un echo preparado o el programa que muestra un archivo que escribiste cuando aprendías.

Nota2: realmente todo esto tiene un motivo, pero si hay que profundizar en el protocolo el día de hoy se nos queda corto, si quieres hecharle un vistazo a sus entrañas revisa los links del final.

jueves, 17 de marzo de 2011

Adivina el lenguaje [solución]

Se ve que andamos con poca imaginación hoy, así que mientras tanto aquí va un pequeño reto, a ver si alguien consigue adivinar en que lenguaje esotérico está escrito este código: http://pastebin.com/Lb4qJtjY

Pista: lo que hace el código es mostrar por pantalla CodigoParaLlevar (sin el salto de línea de rigor :P )

Actualización: ya pasó un tiempo, así que esta es la solución

Suerte

miércoles, 16 de marzo de 2011

Cifrando con autómatas celulares

Hoy traigo un pequeño experimento, este es un cifrado que se basa en el mismo concepto que otro código anterior [ Un autómata celular para generar números pseudo-aleatorios ], pero en vez de generar números aleatorios, sirve como cifrado de flujo [ http://pastebin.com/uX1WpGjF ] .

lunes, 14 de marzo de 2011

Como monitorear un terminal desde otro [tip]

En el terminal que se quiere monitorear

mkfifo tunel
script -q -f tunel


En el terminal donde se quiere mostrar ( se podría enviar a través de la red o lo que fuera )

cat tunel


Una ventaja (o un inconveniente) es que el que monitorea no puede hacer cambios en el terminal. Por otro lado, si se hace esto, el comando script no devuelve el control hasta que alguien se conecte.

ps: si solo quisieramos guardar las sesiones, sin monitorearlas, solo habría que hacer script -f <archivo de log>

A portarse bien ;)

viernes, 11 de marzo de 2011

Escapando caracteres especiales en Python [tip]

Supongamos que tenemos un texto como este:
Bla
blablabla\ /
blabla
Y queremos representarlo todo en una línea sin perder información, como hacerlo?

def miniscape(s):
    return str([s])[2:-2]


Resultado:
\nBla\nblablabla\\ /\nblabla\n

Y para darle la vuelta?

def miniunscape(s):
    i = 0
    while True:
        try:
            x = s.index("\\x", i)
            if not((x > 0) and (s[x-1] == "\\")):
                s = s[:x]+chr(int(s[x+2:x+4],16))+s[x+4:]
            i = x + 1
        except:
            break

    reptable = [("\\\\","\\"),("\\n","\n"),("\\'","'"),("\\a","\a"),
                ("\\b","\b"),("\\f","\f"),("\\r","\r"),("\\t","\t"),
                ("\\v","\v")]

    for r in reptable:
        i = 0
        while True:
            try:
                x = s.index(r[0], i)
                if not((x > 0) and (s[x-1] == "\\")):
                    s = s[:x]+r[1]+s[x+2:]
                i = x + 1
            except:
                break

    return s


En pastebin [ http://pastebin.com/5uvf3tBK ]



Y ya está, nos vemos

miércoles, 2 de marzo de 2011

[Cheatsheet] de variables inseguras en PHP

Hoy algo de carne, una chuleta sobre las variables superglobales (woh!) no fiables, donde el cliente puede meter mano:

domingo, 27 de febrero de 2011

Un tracker BitTorrent en un .php y una tabla MySQL

Esto lleva un rato sin actualizar, así que traigo una cosilla que puede resultar interesante, un tracker de BitTorrent que solo ocupa un archivo .php de 250 líneas y que necesita únicamente una tabla en una base de datos MySQL, además logicamente del servidor web [ announce.php ]

martes, 22 de febrero de 2011

Haciendo un iterador a medida en Python

Mientras no van llegando cosas que requiren más tiempo aquí va algo que puede resultar interesante, vamos a hacer nuestro propio iterador dinámico, que permita modificar su comportamiento desde el propio script, por ejemplo, si hacemos:

for i in my_iterator(1,1000,"<<1"):
    print i


my_iterator( inicio, límite, paso ) Mostraría esto:

1
2
4
8
16
32
64
128
256
512


viernes, 18 de febrero de 2011

Como evitar que un hilo de pyGTK bloquee a los demás [ tip ]

Si alguien ha intentado programar un script que use pyGTK lanzándolo en un hilo aparte se habrá dado cuenta de que bloquea  a todo el proceso, lo que es bastante molesto. La solución es hacer esto desde ese hilo antes de levantar la interfaz:

gtk.gdk.threads_init()


Hay más sobre hilos y pyGTK ( esto en concreto no ) en: http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html

Saludos

jueves, 17 de febrero de 2011

Adivinando las contraseñas de la Wifi desde Android

Después de mucho pelearse con Netbeans y Eclipse, presento la primera aplicación para móviles de este blog :D, una que a partir de la SSID ( el nombre de la red ) y la BSSID puede en algunos casos "adivinar" la clave por defecto de la red:


La aplicación aún está en pañales, no he tenido la ocasión de probarla con redes reales, de ahí que exista la opción de introducir datos manualmente ( obviamente la forma normal de hacerlo es seleccionar la red en la lista que muestra ) , para realizar pruebas, y falta por implementar el algoritmo de las redes SpeedTouch ( aunque es bastante lento, ya que hay que hacer fuerza bruta contra SHA ).

Otra cosa que queda por acabar, es la lista de redes, por ahora se marcan las que se pueden adivinar con un "[o]" al final, o con la contraseña entre '[]' si se adivinó, además los datos sobre las redes adivinadas se guardan en una Base de Datos SQLite que está desaprovechada ( quizá se podría añadir la opción de guardar todo en un TXT para guardarlo ).

lunes, 14 de febrero de 2011

Descargando el manual 'La guía definitiva de PNG' con bash

Pues eso, hoy va a ser algo corto, el "problema" es simple, tenemos estos ingredientes:
- Un manual sobre el formato PNG [ http://www.libpng.org/pub/png/book/toc.html ]
- Una conexión a Internet intermitente, así que no es una posibilidad leerlo online
- Pereza suficiente para no ponerse a descargarlo a mano
- Ganas de trastear con bash

Y la receta, comentadita [ vacuum.sh ] o coloreado:

domingo, 13 de febrero de 2011

Introducción a NetKit ( IV ): Un puente a Internet


Pues llegamos a la última parte de esta introducción a NetKit, donde simplemente veremos como hacer un laboratorio con una máquina que se conecte a el anfitrión ( y con ello a Internet ), queda como ejercicio para el lector añadir y configurar otras máquinas a la red que aprovechen esa conexión.

viernes, 11 de febrero de 2011

Compilando en entornos hostiles: Dia

No, no penseis nada raro, con "compilar en entornos hostiles" me refiero a hacerlo donde no tenemos a mano las librerías necesarias para compilar un programa en concreto, ni permisos para instalarlas, la idea es mostrar como se puede hacer para quien necesite usar algún programa cuando solo dispone de una cuenta con acceso mínimo.

Pero volvamos al principio, Dia es un software para hacer diagramas desarrollado por el proyecto Gnome, supongamos que quremos usarlo en una máquina, una opción sería descargar el paquete ya compilado y ejecutarlo, pero... sorpresa! , utiliza una librería que no esta instalada ( libxml2 en este caso) .

jueves, 10 de febrero de 2011

Gráficos de tortuga sobre imágenes en Python

Pues hoy traigo una mini-libraría que se apoya en PIL para hacer gráficos de tortuga directamente sobre imágenes [ imgturtle.py ]:
Dibujado con este script [  dragon.py ]

miércoles, 9 de febrero de 2011

Introducción a NetKit( III ): switches y enrutado


Bueno, pues seguimos con esto, como dijimos la última vez, ahora lo que queremos es crear una red de 4 máquinas, dos switches conectados entre sí y cada uno a otra máquina, y que se puedan comunicar entre ellos sin problemas, el esquema en general sería este:
 No es tanto un problema con NetKit ya que se puede hacer con lo que ya sabemos, como un ejercicio sobre como hacer tablas de enrutado.


martes, 8 de febrero de 2011

A un día de la 'Ley Sinde'

Mañana, día 9  de febrero se vuelve a votar la "Ley Sinde" en el Senado, después de no pocas protestas por parte de los cuidadanos. Aunque la ley fue rechazada en el congreso volvió al Senado después de un pacto entre el PSOE, PP y CiU.

No tiene sentido otro post aquí cuando gente que sabe más del tema ya ha escrito sobre ello, en cualquier lugar que se dedique a las noticias se encontrará mucho material relacionado con el tema, pero ahí van links que me parecen recomendables:

http://xmailer.hacktivistas.net/
http://red-sostenible.net/

Solo me pregunto esto ¿ quién después de descargarse una canción dijo que es obra suya ?, ¿ no estarán confundiendo ( ¿ a propósito ? ) derechos de autor y derechos de explotación ?, ¿ no se estarán utilizando a los artistas como escudo ?

Saludos y suerte...

lunes, 7 de febrero de 2011

Introducción a NetKit( II ): creando redes

Introducción a Netkit( I ): Instalación

Lo dicho es hecho, y a lo hecho...  seguimos con la segunda parte de la introducción a NetKit, ahora veremos como crear y configurar laboratorios pequeños ( sin routers, que es lo mismo pero hay que enrutar ), las conexiones hacia internet se demorarán probablemente hasta el fin de semana ya que se necesitan permisos de root en el host :P .


domingo, 6 de febrero de 2011

Arkanoid con Pygame

Este juego lo había escrito para un concurso de programación hace varios meses, pero no conseguí que las colisiones funcionaran bien, ahora que ya he conseguido arreglarlo minimamente y he añadido un par de cambios, este es el resultado:

viernes, 4 de febrero de 2011

PyIC ( Librería IRC para python ) 0.2

Pues eso, habemus nueva versión de PyIC ( una librería para clientes IRC ), ya está subida en GitHub [ https://github.com/kenkeiras/PyIC ]

Se puede ver como quedan las funciones en el README, pero los cambios básicamente son estos:

jueves, 3 de febrero de 2011

Nueva versión de GUIml, añadido Tktinter

Pues eso, que ya está listo el soporte para Tkinter en GUIml:
Desluce un poco al lado de los otros,¿verdad?

Solo resaltar una cosa, da "X Window System error" cuando las ventanas de "About" no se cierran antes que el programa principal ( no pongais about's y todos contentos ), esto se arreglará cuando sepa que lo provoca.

Se puede descargar desde aquí: guiml02.zip

ps: está en camino una batería de nuevas versiones, stay tuned

Hasta pronto.

martes, 1 de febrero de 2011

Disionario morrasense en fortunes [ desvario ]

Bue, hoy vamos a dejar de hablar de programación y si me apuras vamos a hacer un cambio temporal de público objetivo, que no creo que nadie de la 5ª provincia lea esto :P así que...

Presentamos la fortune del "Disionario da revolusionaria academia morrasense da lingua: morrasense - jodechincho".

El archivos es este: disionario ( dadle a "download" )
Para instalarlo hay que seguir estos pasos:

domingo, 30 de enero de 2011

Añadiendo el Wiimote a los scripts de PyGame

Pues eso, veamos como podemos hacer para añadir de forma fácil la posibilidad de usar el Wiimote en los scripts que usan PyGame modificando mínimamente el código.

La idea es muy simple, el sistema de eventos de PyGame permite añadir eventos desde fuera, mezclando eso con el sistema de callbacks de cwiid ( la librería para manejar el Wiimote ) podemos hacer como si se pulsasen teclas del teclado desde el Wiimote, los eventos se pueden crear así:


ev = pygame.event.Event( <tipo de evento>, { "key": <tecla> } )


Y después solo hay que añadirlos con:

pygame.event.post( ev )


Entonces el script quedaría algo como esto [ wii4pygame.py ], solo hay que hacer bind_wiimote(), opcionalmente mandando el número del led a activar ( 1 por defecto ), por ejemplo:

viernes, 28 de enero de 2011

Controlando el reproductor Totem desde el Wiimote

Al principio la idea no era exactamente esa, de hecho era sobre rhythmbox... pero empecemos desde el principio.

Hablando con un colega sobre nosequé salió la idea de controlar el Rhythmbox ( reproductor de música de gnome bastante usado ). Al volver sobre la idea días ¿ semanas ? más tarde, leyendo la documentación sobre como hacer un plugin llegue a esta web: http://redjunasun.blogspot.com/2010/11/wiimote-for-controlling-rhythmbox.html a ver... compila perfectamente con "gcc archivo.c -o loquesea -lcwiid" y funciona bien.

Y no es un plugin, hmmm... parece ser que lo que usa para controlarlo es el DBus y uno pensando que solo servía para cosas de bajo nivel, mola controlar el reproductor así, enfin, eso ya está hecho, habrá que buscar otra cosa, probemos con el Totem.

Actualización: corregidos botones que no deberían hacer nada pero hacían play/pause

miércoles, 26 de enero de 2011

Montando un sistema de descargas oculto ( 2 ): cifrando y pensando a lo grande

[ Montando un sistema de descargas oculto ( 1 ): las bases ]

Seguimos avanzando, está claro que aunque los datos se ocultan dentro de una imágen, si tiras de esteganografía para esto, dejar los datos simplement así es casi como que vayan en *****, si alguien busca datos ocultos en una imágen LSB es lo primero que se probaría, hay  que reforzarlo con un cifrado, con un simple ARC4 con una clave segura y suficiente padding basta para darle en los morros a los cotillas y para desalentar a algun bot que analice la red en busca de algo sospechoso, este cifrado ya se explico anteriormente, así que vamos con lo siguiente.

Una sola imágen está bien para cosas pequeñas, pero hasta una relativamente grande no puede soportar más de 1 mega, hay que buscar una forma de dividir el archivo y mantener una lista de las ubicaciones de las partes, digamos por ejemplo que queremos dividir el archivo cifrado entre las imágenes y subir estas a un hosting de imágenes como Imageshack.us, habría que guardar las URL donde quedan las imágenes, ya puestos la clave se podría sacar de "/dev/urandom" para que sea lo suficientemente cerca y de paso guardar el tamaño del archivo original, en esta implementación, el formato usado es este:

Actualización: corregido un error muy tonto que podía ocurrir al guardar la clave en el gzip :P

lunes, 24 de enero de 2011

Cambiando seriesyonkis por Twitter

Después de ver cosas como este post en Freesoftwareando uno no puede menos que intentar estirar un poco más la goma, si ellos consiguieron subir tantos enlaces a twitter, aquí presento un programa que permite acceder a ellos directamente... vaaale, solo una excusa para probar el twitter4j.

Por partes, si quieres compilar tu mismo el programa, vas a necesitar el mentado twitter4j, aquí ya se explicó como hacerlo ( y sin compilarlo tampoco estoy seguro que se pueda prescindir de el, así que va también en el paquete ) .

Instalando twitter4j en Gnu/Linux

Twitter4j es un envoltorio (wrapper) del API de twitter para Java, veamos como instalarlo rápidamente:

Lo primero es instalar maven, esto se puede hacer con

sudo apt-get install maven2


Descargamos la última versión desde Twitter4j - GitHub



Ahora hay que descomprimirlo y ejecutar el package.sh

bash package.sh


Y por último copiar los .jar que se generaron en el directorio "twitter4j-core/target/" al directorio de librerías de java, en mi caso ( openjdk-6 ) sería:

sudo cp *.jar  /usr/lib/jvm/java-6-openjdk/jre/lib/ext/


Y dar permisos de lectura ( no vaya a ser )

sudo chmod +r /usr/lib/jvm/java-6-openjdk/jre/lib/ext/twitter4j*.jar


Ya podemos usar esta librería tan completa en nuestro código.

domingo, 23 de enero de 2011

Montando un sistema de descargas oculto ( 1 ): las bases

La idea era mostrar primero un posible escenario de control total de internet, pero se volvió demasiado post-apocalíptico. Na' , imaginaos simplemente que queremos distribuir eh...código fuente, pero sin que nadie se dé cuenta de que su servidor lo aloja.
Una opción es utilizar algo conocido como esteganografía, como dice en la Wikipedia:

La esteganografía es la disciplina en la que se estudian y aplican técnicas que permiten el ocultamiento de mensajes u objetos, dentro de otros, llamados portadores, de modo que no se perciba su existencia. Es una mezcla de artes y técnicas que se combinan para conformar la práctica de ocultar y enviar información sensible en un portador que pueda pasar desapercibido.

Vamos, que así como la criptografía intenta que los datos no sean recuperables sin una contraseña, la esteganografía apunta a pasar mensajes sin que se interpreten como tales.

Por ejemplo, hay imágenes en casi cualquier página de Internet, podemos introducir nuestros datos en una imágen y después subirla a un foro, un host de imágenes o donde nos de la gana.


jueves, 20 de enero de 2011

Resolviendo dominios .42 en un servidor BIND9 casero (DNS)

Pues nada, veamos como hacer que nuestro DNS casero resuelva direcciones con el TLD .42, si no sabes que es esto, mejor hechale un vistazo al proyecto https://www.42registry.org/faq-es.php

"42 Registry es, principalmente, una experiencia como otras tantas de las que abundan en Internet hoy en día. Es una organización sin ánimo de lucro, orientada a proponer un TLD (Dominio de Primer Nivel) para agrupar a una comunidad concreta."

Voy a suponer una distro basada en Debian ( Ubuntu, Trisquel ... Debian... ), pero la idea es la misma para todos, solo hay que cambiar un par de cosas (que avisaré cuando se tercie).


martes, 18 de enero de 2011

jueves, 13 de enero de 2011

GUI's en python con [ GTK | QT4 ] y [XML | HTML... ]

Hoy traigo una librería que aún no está acabada, pero puede que interese a la gente que no le guste complicarse lo más mínimo con las interfaces, pero que aún así le interese hacer unas GUI para los script [ guiml.zip ].

La idea es simple, le pasas un pedazo de HTML a la "librería" y esta selecciona el Toolkit disponible (por ahora solo soporta Gtk y Qt4, cuando le heche el guante a algo que tenga tk instalado lo añado ) hace una GUI basandose en eso, por ejemplo, para

<title>Simple test</title>
<form action="test">
Decide <br>
<input type="submit" value="SI" name="Si"><input type="submit" value="NO" name="No">

Con Gtk:

Con Qt4:

martes, 11 de enero de 2011

La curva del dragón con Logo

Nada, que después de encontrarse uno con que alguien se las arreglo para hacer este fractal con redcode [ http://impomatic.blogspot.com/2011/01/dragon-curve-in-redcode.html ] (para quitarse el sombrero, vaya :P !) no se puede menos que intentarlo en otro lenguaje, y a falta de poder tirar de los gráficos de tortuga el python por cosas de la vida, la siguiente opción es logo.


domingo, 9 de enero de 2011

Historias desde los confines de random()

Pues eso, hoy toca un script al estilo de cierto juego analógico, ese en el que hay que escribir una frase en un trozo de papel sabiendo sólo con que palabra empezar (última palabra que escribió la persona anterior) y pasarsela a la siguiente hasta que vuelva a la primera.

Lo que hace el script [ randomstories.zip ] es tomar un número cualquiera de palabras de una página de wikipedia, y repetir el proceso haciendo que la primera palabra encaje con la última hasta alcanzar el tamaño máximo del mensaje. El archivo que hay que ejecutar es randomstories.py .


viernes, 7 de enero de 2011

Rompiendo captchas

Por cosas de la vida, últimamente ando trasteando con las arañas, crawleando cosas varias... y al final era inevitable toparse con los CAPTCHAs, así que se me ha presentado la ocasión de intentar vencerlos, por ahora esto es lo poco que he conseguido [ captcha_baker.py ], lo poco que hace el propio script es leer los pixels de la primera línea y pasar a blanco los que estén cerca de estos, y a negro el resto. Después corta las letras por las columnas en blanco.

El valor de la "cercanía" es modificable (de hecho la idea viene del parámetro "umbral" de la selección de color de GIMP).

Depende de Image Magick para convertir las imágenes a BMP, Python Image Library para recortar las letras y tesseract-ocr para reconocer las letras.

No funciona demasiado bien, pero estoy bastante contento con el resultado para ser una primera prueba.

Los parámetros son:


./captcha_baker.py <imágen> <número de letras> [<umbral>]


El número de letras no es realmente necesario, se puede poner a 0 para no considerarlo. El umbral por defecto es 15. Por último unas muestras.

martes, 4 de enero de 2011

Acelerenado `route`, `netstat` y parecidos [tip]

Los comandos de red como `route`, `netstat`, e incluso programas como `nmap` tienen la constumbre de intentar convertir las IP's en nombres de red después de realizar su función principal. Por muy útil que sea a veces, en otros momentos es excesivamente pesado, por ejemplo si utilizamos:

netstat

Para descubrir las conexiones activas, después de obtenerlas intentará convertir las IP en nombres de red, y en muchos normales no resultará en nada útil (seguramente acabe mostrando las IP o nombres genéricos).

Estos mismos comandos suelen aceptar el flag -n que evita esa resolución, el cambio salta a la vista:

Hasta otra

lunes, 3 de enero de 2011

Escaneando un servidor FTP

Para hacer una araña que explore un servidor FTP se puede aprovechar el ftplib de python... solo tiene un impedimento, que cuando se pide la lista de archivos en un directorio se devuelve por stdout, lo que es bastante molesto para algo como esto.

La solución más sencilla es substituir la salida estándar ( sys.stdout ) por un objeto que almacene los datos, el único método que hace falta en el objeto es objeto.write(string) , el que se usa para mostrar strings por la pantalla, esto puede servir: