Saltar ó contido principal

Ahora en Freenet !

Este blog ya se puede leer desde Freenet añadiendo esto después de la dirección del FProxy ( normalmente http://127.0.0.1:8888 ):
USK@69aFOJiagwUh2c3s2a2V6qvdLSIspAmvDwwyyqSz3Pg,eyH2DiCXsHjp
5PdP9meBoVDMAUiSqTD1jYA-TozTDTc,AQACAAE/codigoparallevar/1

Y aunque parece que me cargé los CSS y los dos últimos posts aún no están subidos ( este y el anterior ), porque ni siquiera estaban previstos antes de empezar la subida, funciona.

Pero a lo interesante, no hay ganas de hacer todos los archivos a mano, así que este es un script que a partir de la base de datos de wordpress y un par de plantillas genera todo lo necesario para un blog sencillo ( posts individuales y páginas generales, nada de categorías aún ): wp2fnet.py Para usarlo hacen falta 3 archivos más, el primero es el de configuración y se le pasa como primer parámetro, contiene todo lo necesario para funcionar, este es un ejemplo con todos los campos necesarios ( si alguno falta fallará en medio de la ejecución ): readMoreText = <Moar!>

reloc_force = False

debug = True

overwrite = True

db_host = 127.0.0.1

db_user = asdasdasd

db_passwd = si....mañana...

db_name = knk_wordpress

db_prefix = wp_

plantilla_f = plantilla.htm

plantilla_post_f = plantilla_post.htm

savedExtensions = zip, gz, bz2, py, c, h, pl

savedDir = reloc

mainTitle = Código para llevar

post_per_page = 10

El formato es '=' , la mayoría de los valores son cadenas, excepto reloc_force, debug(realmente este no es necesario), overwrite ( los tres booleanos, True o False ), post_per_page ( entero ) y savedExtensions ( strings separados por comas ). Lo que representa cada campo: - db_host: Dirección de la base de datos. - db_user: Usuario de la base de datos. - db_passwd: Contraseña para la base de datos. - db_name: Nombre de la base de datos - db_prefix: Prefijo de los nombres de las tablas ( 'wp_' casi seguro ) - readMoreText: Texto que se muestra en los enlaces para continuar leyendo el post - reloc_force: Si se encuentra otro objeto ya descargado con el mismo nombre, forzar a volverlo  a descargar ( no recomendado, el nombre es el md5 de la url, así que es muy dificil que coincidan sin se el mismo ) - debug: Información de debugging ( poca a decir verdad :P ) - overwrite: Si se sobreescribirán los post o se detendrá la ejecución cuando coincida con uno anterior. - plantilla_f: Archivo que servirá de plantilla general ( más adelante explicación de como funciona ). - plantilla_post_f: Archivo de plantilla de los post. - savedExtensions: Extensiones cuyos archivos se descargarán para subir a Freenet ( sino los links seguirán apuntando a Internet ) separados por comas - savedDir: Donde se guardan los archivos descargados. - mainTitle: Título general. - post_per_page: Número de posts por página en el índice. * Como funcionan las plantillas ***

(Recuerda que Freenet no permite Javascript!)

Las plantillas es la parte que se encarga del aspecto, una página del blog editada puede funcionar bien, es simplemente código html con palabras clave donde haya que introducir determinadas variables: * General ( plantilla_f ) *

Para el título: %(title)s Para el enlace al anterior: %(previous)s Para el enlace al siguiente: %(next)s Para el/los post: %(post)s

* De post ( plantilla_post_f ) : *

Enlace al post: %(post_link)s Título del post: %(post_title)s Autor del post: %(author)s Momento del escritura: %(date)s Texto del post: %(post)s

El índice y los post comparten plantilla general, la diferencia es que en el índice se ponen varios post y en los enlaces de siguiente anterior ( siguiente página del índice o siguiente post ).

Ejemplo de plantilla de post:

%(post_title)s h2>
%(post)s

Plantilla general ( a partir del tema del blog ): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-strict.dtd">

%(title)s

%(posts)s

%(previous)s

%(next)s

  • Contacto

     <div class="textwidget">Por email o jabber en kenkeiras(*arroba*)gmail
    

    (pto.)com

    Clave PGP: [ 0x453125AC ]

  • Como preparar y como saltarse un antidebuggers sencillo en Gnu/Linux

    No se como llegó este tema aquí, pero la propuesta es esa, veremos:

    • Como hacer ingeniería inversa a un programa que nos pide una contraseña ( muy rápidamente ).
    • Como añadir un anti-debugger sencillo a ese programa para evitar que se recupere la contraseña.
    • Como eliminar nuestra propia protección.

    Veamos, entonces el programa, nos enfrentamos a esto:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv){
        if(argc != 2){
            printf("%s <contraseña>\n", argv[0]);
            exit(0);
        }
    
        char passwd[12];
        int i;
    
        memset(passwd, '\0', 12);
        for( i = 0; i < 11; i++ ){
            passwd[i] = i<5?i*2+0x30:i<10?i*2+0x41:i+0x61;
        }
    
        printf("%s\n",strcmp(argv[1],passwd)?"Error :/":"OK");
    }
    

    Así que lo compilamos e intentaremos extraer la contraseña:

    1
    gcc example.c -o example
    

    La contraseña se comprueba contra nuestro intento con strcmp, así que podemos obtener la original simplemente traceando las llamadas a librerías ( ltrace ):

    1
    2
    3
    4
    5
    6
    $ ltrace ./example aaa
    __libc_start_main(0x80484d4, 2, 0xbfeba454, 0x80485e0, 0x80485d0
    memset(0xbfeba390, '\000', 12) = 0xbfeba390
    strcmp("aaa", "02468KMOQSk")   = 1
    puts("Error :/")               = 9
    +++ exited (status 9) +++
    

    En el strcmp() se puede observar la contraseña, si se comprueba funciona :), ahora a lo interesante...

    Anti-debugging

    Por muy complicado que pueda sonar es bastante simple, el truco está en que tanto el gdb ( el debugger de GNU ) como las herramientas strace y ltrace se basan en el syscall ptrace, que permite controlar un proceso, pero con un detalle, un proceso solo puede ser controlado por otro ( o por si mismo a la vez ), nunca por más de uno, así que si nos traceamos a nosotros mismos, solucionado, si llamamos a ptrace con los argumentos adecuados y no nos deja tracearnos ya sabemos que pasa:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #include <sys/ptrace.h>
    
    int main(int argc, char **argv){
        if(argc != 2){
            printf("%s <contraseña>\n", argv[0]);
            exit(0);
        }
    
        if (ptrace(PTRACE_TRACEME, 0, 0, 0) == -1){
            printf( "Debuggers no, gracias\n" );
            exit(1);
        }
    
        char passwd[12];
        int i;
    
        memset(passwd, '\0', 12);
        for( i = 0; i < 11; i++ ){
            passwd[i] = i<5?i*2+0x30:i<10?i*2+0x41:i+0x61;
        }
    
        printf("%s\n",strcmp(argv[1],passwd)?"Error :/":"OK");
    }
    

     

    1
    gcc anti_example.c -o anti_example
    

     

    1
    2
    3
    4
    5
    6
    $ ltrace ./anti_example aaa
    __libc_start_main(0x8048504, 2, 0xbfd9c914, 0x8048650, 0x8048640
    ptrace(0, 0, 0, 0, 0x49fb60)    = -1
    puts("Debuggers no, gracias")   = 22
    exit(1
    +++ exited (status 1) +++
    

    Y con eso, evitamos a los cotillas, por ahora...

    Anti-Anti-debugging

    En este apartado mejor no esperar una solución tan sencilla como la anterior, editaremos el binario para evitar la protección, es un reversing trivial, pero es un momento tan bueno como otro cualquiera para desperezarse y sacar el desensamblador. Primero desensamblamos el ejecutable y localizamos el trozo de código a ejecutar, para el ejemplo usaré objdump para el desensamblado y gHex2 para editar los binarios, simples pero cumplen su cometido:

    1
    objdump anti_example -d > anti_example.asm
    

    Lo resaltado es el código que hace la comprobación, el detalle es que el call devolverá 0 si el resultado es satisfactorio y -1 si falla, si el traceado no se utiliza más podemos simplemente sobreescribirlo con un XOR EAX,EAX y NOPs. Buscamos la cadena de caracteres del string y la reemplazamos por:

    • 31 C0 : XOR eax, eax
    • 90 : NOP
    • 90 : NOP
    • 90 : NOP

    Y asunto resuelto:

    1
    2
    3
    4
    5
    6
    $ ltrace ./anti_example_cleaned 02468KMOQSk
    __libc_start_main(0x8048504, 2, 0xbfae5fc4, 0x8048650, 0x8048640
    memset(0xbfae5f00, '\000', 12)       = 0xbfae5f00
    strcmp("02468KMOQSk", "02468KMOQSk") = 0
    puts("OK")                           = 3
    +++ exited (status 3) +++
    

    Saludos

    Recuperar el teclado después de un SysRq-R [tip]

    Si por cualquier motivo, después de utilizar la combinación Alt+SysRq+R ( que pasa el modo de teclado de RAW a XLATE ) para poder utilizar los_comandos_de bajo_nivel_a_los_que_da_acceso quieres devolver el teclado a su modo normal, solo tienes que lanzar en la consola esto: sudo kbd_mode -s

    Pruebas con el canvas de HTML5

    Ya tocaba postear algo, que esto está descuidado por culpa de los exámenes y blablabla...

    Así que aquí queda, estas son pequeñas muestras de lo que permite hacer  fácilmente la etiqueta canvas de HTML5 ( se pueden probar pinchando en "las letras grandes" ). * Garabatos_con_curvas_Bézier ***

    Resulta que incluye soporte para curvas_Bézier, cosa curiosa :P

    * El_juego_de_la_vida_de_Conway ***

    No podría faltar la implementación de turno del más famoso de los autómatas celulares.

    * Gráficos_de_tortuga ***

    Una pequeña implementación de gráficos de tortuga como una clase de javascript [ turtle.js ], lenta y poco testeada.

    Hasta la próxima

    One liners( 7 ): listas de descarga

    for i in cat links;do plowdown --run-download='axel -n 1 "%url"' "$i";done

    Descarga todos los enlaces ( a servidores tipo megaupload de una lista ), a falta de axel se puede eliminar el --run-download..., pero permite reiniciar la descarga después.

    One liners( 6 ): Fortunes en el estado de pidgin

    purple-remote "setstatus?status=away&message=[fortune]"

    Muestra una fortune en el estado de pidgin, la idea salió al encontrar esto [ http://www.commandlinefu.com/commands/view/4554/change-pidgin-status ]

    Contra guía para el uso de internet

    Después de que la SGAE lanzara una guía para adoctrinar, no hay otra palabra, sobre la cultura en internet, la gente de Hacktivistas se puso manos a la obra y escribió una contra-guía en respuesta, el resultado es este (hay para descargar por torrent o descarga directa ).

    Todo lo que hay que leer está en esa página, añadir algo más sería hacer ruído, solo proponer algo, hechadle un vistazo ( a las dos, a la de la SGAE y a esta ) y se verá bastante claro quién tiene los pies en la tierra ;)

    La de la SGAE, Promusicae, FAP (vaya siglas... :P ) está aquí. La de hacktivistas aquí.

    Juzgad vosotrs misms.

    Actualización: una_descripción_más_pormenorizada.

    One liners( 3 ): Lector de RSS

    curl -sL "$url"|tr "\n" ' '|sed "s/<\/item>/\n/"|sed "s/.*

    //"|cut -d\< - f1|head -1 <p>Muestra el título de la primera entrada del RSS con la URL cargada en $url</p> <p>ps: pasa 10 caracteres de los 80 pero... es lo que hay :P</p>