Arduino + microSD: el shield

Estos últimos días he estado jugando con el módulo microSD que venden en Libelium. Es un shield que permite añadir almacenamiento persistente a un Arduino mediante su bus ICSP.

En esencia, el módulo es una interfaz entre las patillas del bus y la tarjeta microSD. El resto de componentes son SMCs que juegan con la corriente, sin que haya ningún procesamiento intermedio de los mensajes, ni ninguna traducción entre el bus y la tarjeta.

El bus ICSP usa 6 patillas, aunque hay una variante de 10 patillas (y pareceser que para el ICSP esas cuatro patillas no aportan nada). Esas patillas son reloj (SCK), reset (SS), comunicación desde el AVR (MISO), comunicación hacia el AVR (MOSI) y las dos de alimentación.

El shield va conectado al Arduino con los pines digitales 9 (CD, Card Detection, no es ICSP, pero sí es de la tarjeta), 10 (SS, el reset), 11 (MOSI), 12 (MISO), 13 (SCK), el siguiente (14) que es GND, y el 8, si se pone alto, se puede usar para alimentar el shield (VCC).

No sólo se pueden usar esos pines, sino que en Arduino Duemilanove hay 6 pines junto al micro, al borde, a los que también se les puede conectar el shield, y que, de hecho, están puenteados con los de la fila lateral.

Arduino

Comments (0)

Permalink

Convertir ficheros CBR a PDF

El formato CBR (Comic Book Archive file) es habitual a la hora de guardar cómics escaneados. Hay varios lectores y dispositivos que leen este formato, pero hay otros que no, por lo que deberemos convertirlo, p.ej. a PDF, que es un formato bastante estándar.

Simplemente se trata de las imágenes de cada página empaquetadas en un fichero comprimido en formato RAR. Además, las imágenes están nombradas de manera que ordenadas alfabéticamente en orden ascendente, la primera de ellas se corresponde con la portada, la segunda, con la página siguiente a la portada, etc.

Así pues, lo primero sería descomprimir el fichero:

pablo@babuino:~/tmp$ unrar x comic.cbr

UNRAR 3.90 beta 2 freeware Copyright (c) 1993-2009 Alexander Roshal

Extracting from comic.cbr

Extracting Escanear0140.jpg OK
Extracting Escanear0141.jpg OK
Extracting Escanear0142.jpg OK
Extracting Escanear0143.jpg OK
Extracting Escanear0002.jpg OK
[...]
All OK
pablo@babuino:~/tmp$

Y ahora, gracias a la librería ImageMagick, disponemos del programa convert, que hace la conversión de todas las imágenes en un único PDF, tomándose su tiempo y su CPU:

pablo@babuino:~/tmp$ time convert *.jpg comic.pdf

real 1m27.699s
user 1m51.987s
sys 0m3.904s
pablo@babuino:~/tmp$

Así pues, ya tenemos un fichero comic.pdf, con las mismas páginas que comic.cbr, y en este caso, con un tamaño casi idéntico.

Similares a los CBR son los ficheros CBZ, CB7, CBT y CBA, sólo que en vez de utlizar RAR, usan, respectivamente, ZIP, 7z, TAR y ACE.

Fuentes:

Output

Comments (0)

Permalink

Google Chrome… el cómic

Descubrí hace unas semanas que la gente de Google había publicado documentación acerca de su navegador Chrome… en forma de cómic.

El cómic se puede leer directamente por la web, o bien descargarse el PDF que he creado compilando todas las imágenes. Para crearlo, lo hice desde la línea de comandos con un poco de ayuda del paquete ImageMagick (para instalar en Debian o Ubuntu: sudo apt-get install imagemagick) y el wget.

Con esto nos descargamos cada una de las 39 páginas del cómic a un directorio:

mkdir gccomic
cd gccomic/
for i in {1..39}; do wget -O pagina`printf %02u $i`.jpg http://www.google.com/googlebooks/chrome/images/big/$i.jpg; done;

La expresión `printf %02u $i` sirve para que el número de página siempre tenga dos dígitos, siendo el primero de ellos 0 para números entre 0 y 9: pagina09.pdf, pagina10.pdf, etc. De esta forma, al ordenarlos alfabéticamente, los 10 ficheros con las respectivas 10 primeras páginas apareceran los primeros.

Y con esto juntamos todas las imágenes (en shell se encargará de que sea en orden alfabético) en un único PDF:

convert *.jpg Google\ Chrome\ Comic.pdf

A continuación, nos quedamos con el PDF resultante, lo difundimos bajo licencia Creative Commons Attribution-Noncommercial-No Derivative Works 2.5 License, y borramos todo el directorio gccomic/.

El cómic merece leerlo porque ilustra muy bien el funcionamiento de Chrome y la gran cantidad de ideas innovadoras que hay en ese navegador.

Pero además, opino que es un gran logro divulgativo presentar un producto y/o su documentación en forma de cómic, ya que simplifica enormemente su lectura y con ello acerca el producto al usuario final.Creo que puede ser un ejemplo a seguir para otros proyectos.

Shell scripting

Comments (0)

Permalink

DoS remoto en Windows Vista

El último bombazo: provocar una Blue Screen of Death (BSOD) en Windows Vista, Windows 7 RC o Windows 2008 Server (<R2)

La noticia original (con su exploit en python): Windows Vista/7: SMB2.0 NEGOTIATE PROTOCOL REQUEST Remote B.S.O.D. (con fecha de 7 de septiembre).

Esta mañana la he probado en un portátil con Windows Vista:

  1. He activado la compartición de archivos: en Panel de control hay una opción que dice algo así como Opciones de red y de compartir recursos, y ahí dentro hay varias opciones para elegir qué se comparte. Esto es necesario para activar la pila Samba del kernel de Windows.
  2. Si hubiera un firewall que cubriera el puerto 445 habría que desactivarlo. No era el caso.
  3. Utilizando el exploit de Laurent Gaffié y sabiendo la IP del portátil lo tiré abajo sin más que cortar el exploit, pegarlo en un fichero y ejecutarlo contra el portátil.

El funcionamiento

El exploit simplemente se conecta al puerto 445 de la víctima, envía un mensaje de sesión SMB y se desconecta.

En tal mensaje de sesión, en su cabecera, hay un atributo que se llama Process ID High, de 16 bits. Normalmente suele ser 0, pero lo que descubrió Laurent es que si en vez de ser 0 era 0×26 (lo que viene siendo un &), conseguía obtener un bonito fallo de página (error PAGE_FAULT_IN_NONPAGED_AREA).

Es decir, que manipulando ese atributo provocaba que algún puntero en algún lado apuntara hacia alguna zona de memoria que no pertenecía a nadie. Para más inri, el código del SMB2.0 está en el kernel, por lo que este fallo de página se lanzaba en modo kernel, con el consecuente reinicio de la máquina.

Hasta aquí lo que tenemos en un ataque remoto de denegación de servicio.

Lo que posteriormente ha descubierto Rubén Santamarta, de 48bits, es que se puede (con ciertas limitaciones) manipular la dirección a la que salta el kernel según el valor de ese atributo de la cabecera, pudiendo dar lugar a una inyección de código.

Tal y como explica en su artículo:

.text:000156B3                 movzx   eax, word ptr [esi+0Ch]; packet-&gt;SBM_Header-&gt;Process_ID_High
.text:000156B7                 mov     eax, _ValidateRoutines[eax*4]; FALLO – out-of-bounds dereference.
.text:000156BE                 test    eax, eax
.text:000156C0                 jnz     short loc_156C9
.text:000156C2                 mov     eax, 0C0000002h
.text:000156C7                 jmp     short loc_156CC
.text:000156C9 ; —————————————————————————
.text:000156C9
.text:000156C9 loc_156C9:  ; CODE XREF: Smb2ValidateProviderCallback(x)+4F3j
.text:000156C9                 push    ebx
.text:000156CA                 call    eax ; Smb2ValidateNegotiate(x) ;

Inicialmente partimos de que ESI apunta a una parte de la cabecera SMB del paquete recibido. ESI+0x0C es un puntero al atributo Process ID High de tal cabecera, por lo que

movzx   eax, word ptr [esi+0Ch]

Nos deja en EAX, los 16 bits de más peso a 0 (siempre) y los 16 de menor peso con el contenido de tal atributo copiado literalmente (ver movzx). Por ejemplo, si el Process ID High fuera 10,  EAX tendría el valor 0x0000000A,

La siguiente instrucción

mov     eax, _ValidateRoutines[eax*4]

va a la tabla (de punteros a función) _ValidateRoutines, y según el valor de EAX, escoge una entrada u otra (cada una ocupa 4 bytes).

Siguiendo con el ejemplo, esto cogería la undécima entrada de la tabla (en la dirección _ValidateRoutines + 0×28) y la copiaría en EAX, con lo que tendríamos en EAX la dirección de memoria de la función a ejecutar.

A continuación se comprueba si tal puntero no es nulo. De ser nulo, en EAX se guarda el valor 0x0C0000002 y se sigue con la ejecución en otra parte.

test    eax, eax
jnz     short loc_156C9
mov     eax, 0C0000002h
jmp     short loc_156CC

Por el contrario, si efectivamente no es nulo, se guarda EBX en la pila y se salta a tal función:

loc_156C9:
push    ebx
call    eax

Conclusión: según pongamos un valor N en el atributo Process ID High, podemos conseguir que el kernel salte a la posición de memoria indicada en la entrada (N+1)-ésima de la tabla _ValidateRoutines.

¿Y si la tabla tiene menos entradas que N+1? Pues la dirección de memoria la tomará de lo que venga después de esa tabla. Si pudiésemos controlar el contenido de esos datos que están después, se podría hacer que el kernel saltara a una posición a voluntad. Y por eso es que Rubén habla de cierta posibilidad de ejecución de código remoto.

seguridad

Comments (0)

Permalink

Comprar kits de iniciación a Arduino

El 30 de junio se unía a los foros de arduino.cc un post acerca de un artículo de Aaron Eechie: Arduino Starter Rundown – Part 2.

Aaron es ese artículo analiza uno por uno los kits de iniciación que ofrecen dos proveedores estadounidenses y tres europeos.

Si bien los tres proveedores europeos nos pueden servir a los que vivimos en España o en Portugal, he preferido hacer un análisis similar para los proveedores ubicados en nuestros países. Los seis proveedores que trataré los he sacado de la página oficial de Arduino.

Todos estos proveedores venden lo que llaman el Kit Workshop – Base level, que es idéntico en componentes en todas las tiendas:

  • 1 Arduino Diecimila Board (suele ser opcional)
  • 1 USB cable para alimentar y programar el cacharro
  • 1 Straight single line pinhead connectors 2,54 40×1
  • 1 Breadboard, 840 tie points
  • 1 Set of 70 breadboard jumper wires
  • 5 10K Ohm Resistors 1/4W
  • 5 2.2K Ohm Resistor 1/4 W
  • 10 220 Ohm Resistors 1/4W
  • 5 330K Ohm Resistors 1/4W
  • 5 100nF capacitor polyester
  • 5 10nF capacitor polyester
  • 3 100uF electrolytic capacitor 25Vdc
  • 1 4,7K Ohm Thermistor
  • 1 70..100K Ohm LDR VT90N2
  • 3 5mm RED LED
  • 1 5mm GREEN LED
  • 1 5mm YELLOW LED
  • 1 10Kohm linear potentiometer, pcb terminals
  • 2 BC547 Transistor in TO92 Package
  • 1 Piezo buzzer
  • 5 PCB Pushbutton, 12x12mm size
  • 2 4N35 Optocoupler DIL-6 package
  • 2 Tilt sensor
  • 1 Diode 1n4007
  • 1 MOS Irf540

BricoGeek.com
Proveedor español ubicado en A Coruña.

Trabajan con electrónica en general, no sólo Arduino. Cuentan con gran variedad de dispositivos para desarrollo (servos, ruedas, pantallas LCD, etc.).

Ofertan un Arduino Kit Workshop sin el microcontrolador Arduino por algo más de 41,76 euros (16% IVA incluído).

e-lioness
Proveedor español de la provincia de Granada.

Aunque venden algún producto más aparte de Arduinos, la tienda está enteramente centrada en estos dispositivos.

Ofertan dos KIT Workshop – Base level, uno con una placa Arduino por 58 euros y otra sin ella por 34,8 euros (16% IVA incluído en ambos precios).

Tuxbrain S.L.
Proveedor español

Se centran en todo lo que son dispositivos de código abierto: Arduino, OpenMoko y GP2X entre otros. Matienen una lista de correo sobre OpenMoko en español.

Al igual que e-lioness vende dos KIT Workshop – Base, uno con placa Arduino por 58,00 euros (IVA incluído) y otra sin por 34,80 (IVA incluído).

GTrónica
Proveedor portugués, de Loura

No sólo venden Arduinos, también electrónica y microcontroladores en general (aunque no tanto como bricogeek.com)

Igualmente, vende ambos kits con y sin Arduino por, respectivamente 58.50 y 34.50 euros.

InMotion
Proveedor portugués

Venden Arduinos, Phidgets, ZigBees y sensores varios.

De nuevo lo mismo: el mismo kit con (51 euros) y sin Arduino (32 euros).

Libelium
Proveedor español ubicado en Zaragoza.

Esta empresa es una spin-off surgida en la Universidad de Zaragoza. Se dedica al desarrollo de sensores, redes malladas y sus aplicaciones a distintos entornos. Así mismo coordina redSens: un grupo de trabajo sobre redes sensoriales inalámbricas donde participan varias empresas y universidades españolas.

Al margen de sus actividades con las redes mesh, mantienen una tienda virtual de dispositivos Arduino (y SquidBee).

En esta tienda ofertan diversos kits, ninguno de ellos de iniciación. En cualquier caso, me parece una tienda y un proyecto interesante y por eso he creído importante mencionarlo aquí.

Conclusiones

  1. Sale más barato comprar un kit con Arduino que comprarlos por separado
  2. Los precios suelen ser muy similares. El kit es el mismo.
  3. El kit completo más barato son 51 euros, lo normal son 58 euros.
  4. El kit sin placa ronda los 34 euros.
  5. No hay diferencia entre comprarlo en España o en Portugal. De las tiendas francesas ninguna vende kits.
  6. Ninguno incluye un libro sobre Arduino, aunque en e-lioness por lo menos se puede comprar junto con el kit.

Arduino

Comments (4)

Permalink