Hackit’2012, solucionario. Level 4

Así que tenemos que destripar un binario .apk para Android… bien, empecemos con la cirugía.

1) Comprobemos material quirúrgico. Vamos a necesitar apktool para abrir al paciente.
2) Un vademecum de cómo y por dónde cortar tampoco vendrá mal.
3) Proceder a abrir en canal el .apk

apktool d AndroidLevel0.apk

4) Buscar un poco dentro de las tripas, a ver si encontramos algo valioso

$ grep -irn "password" * 
...
AndroidLevel0/smali/com/mobandme/hackit/euskal20/level0/services/CryptographyService.smali:114:   
direct {p0}, Lcom/mobandme/hackit/euskal20/level0/services/CryptographyService;->decodePassword()Ljava/lang/String;
 ...

5. Yo creo que tendremos que empezar examinando esa zona (decodePassword() suena bien 🙂
6. Editamos el services/CryptographyService.smali para incluir una llamada de log justo en el punto en el que la aplicación comprueba nuestro password con el que tiene almacenado.

 
const-string v0, "DL_Rules"
# Después de 
#    invoke-direct {p0}, Lcom/mobandme/hackit/euskal20/level0/services/CryptographyService;->decodePassword()Ljava/lang/String;
 #   move-result-object v2
 
invoke-static {v0, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

Por cierto, no conocíamos mucho de las interioridades de un paciente Android, asi que tuvimos que revisar varios tutoriales en la guía anteriormente citada hasta entender cómo llamar al método de la clase Log (que nos mostrará en pantalla el password en claro)

7. Ya podemos cerrar el cuerpo del delito. Sutura.

apktool b AndroidLevel0 /tmp/hack.apk

8. Firmamos nuestra obra de arte

jarsigner -keystore ~/.android/debug.keystore  /tmp/hack.apk  androiddebugkey

9. Y le decimos al paciente que se tome esta pastilla:

adb install /tmp/hack.apk

10. No perder de vista su reacción, porque seguro que nos dice algo interesante que nos permitirá pasar al nivel 5 😉

adb logcat

Hackit’2012, solucionario. Level 3.

Descargamos el fichero enlazado y vemos que es un zip con ficheros binarios .class (Java) dentro:

$ unzip jkhil.zip 
Archive:  jkhil.zip
   creating: org/
   creating: org/euskal/
   creating: org/euskal/hackit/
   creating: org/euskal/hackit/crypt/
  inflating: org/euskal/hackit/crypt/CryptUtil.class  
  inflating: org/euskal/hackit/PasswordRevealer.class  
  inflating: org/euskal/hackit/FileClassLoader.class  
  inflating: org/euskal/hackit/trololo.clazz

Vamos a ejecutar el que más llama la atención:

$ java org.euskal.hackit.PasswordRevealer
Exception in thread "main" java.lang.VerifyError: Bad local variable type in method org.euskal.hackit.trololo.damagedMethod()I at offset 7
	at java.lang.Class.getDeclaredConstructors0(Native Method)
	at java.lang.Class.privateGetDeclaredConstructors(Class.java:2404)
	at java.lang.Class.getConstructor0(Class.java:2714)
	at java.lang.Class.newInstance0(Class.java:343)
	at java.lang.Class.newInstance(Class.java:325)
	at org.euskal.hackit.PasswordRevealer.main(PasswordRevealer.java:23)

¡Anda!, un método que se llama damagedMethod()… con un tipo de datos de variable local incorrecto (menudo binario nos ha «regalado» cymo, el autor de este level 😉

Curiosamente, al ejecutar el .class anterior se ha creado el fichero trololo.clazz.dec (deciphered?) :

$ ls -alt org/euskal/hackit/
total 28
drwxr-xr-x 3 juanan juanan 4096 Sep 18 00:24 .
-rw-rw-r-- 1 juanan juanan 2320 Sep 18 00:24 trololo.clazz.dec
-rw-r--r-- 1 juanan juanan 1672 Jul 19 19:04 PasswordRevealer.class
-rw-r--r-- 1 juanan juanan 3101 Jul 19 18:57 FileClassLoader.class
-rw-r--r-- 1 juanan juanan 2320 Jul 19 18:53 trololo.clazz
drwxr-xr-x 2 juanan juanan 4096 Jul 19 14:53 crypt
drwxr-xr-x 3 juanan juanan 4096 Jul 19 13:59 ..

Antes de seguir investigando ese fichero, ¿qué ocurriría si le decimos a la máquina virtual Java que no verifique el bytecode del .class anterior? (la idea sería saltarse la excepción java.lang.VerifyError de algún modo):

$ java -noverify org.euskal.hackit.PasswordRevealer
Exception in thread "main" java.lang.SecurityException: Can't run unmannaged code. System error: 0x1337
	at org.euskal.hackit.PasswordRevealer.main(PasswordRevealer.java:20)

Pues no le ha gustado…

Ahora no sé si el camino que seguimos en mi grupo (kudos to @ochoto por ser el que rompió este nivel) es el que el autor del level pensó, pero a nosotros nos funcionó O:-)

Estos son los pasos: renombrar el trololo.clazz.dec a trololo.class y crear una clase que lo use:

 
// guardarlo en un fichero dl.java en /tmp
// compilarlo con javac dl.java
 
import org.euskal.hackit.trololo;
 
public class dl {
	public static void main(String args[]) {
		try {
			trololo t = new trololo();
 
		}
		catch(java.lang.VerifyError ve) {
                          System.err.println("Errooooooor....");
		}
	}
}

Si ejecutamos el main anterior, veremos que salta la excepcion «VerifyError». Por lo que vamos a volver a intentar la ejecución sin verificación del bytecode con la opción -noverify (ver documentación de esta opción en la especificación oficial de la máquina virtual Java):

$ cd /tmp
$ java -noverify dl
Mr. Trololo was born ...
Please enter: Year: >

Premio! 🙂 Buscamos los datos que nos piden y tendremos acceso al siguiente nivel. Si algún grupo (o el autor del level) siguió otro camino para resolver, le agradecería que añadiera sus comentarios. Nos vemos en el level 4.

[LibreOffice] Aplicar coloreado de sintaxis a un trozo de código

Supongamos que has insertado un trozo de código fuente en Python en tu documento .odt.
Por defecto, Writer no dispone de ninguna utilidad para colorear las líneas como haría un buen IDE (lo que se conoce como Syntax Highlighting) y tu código se vería bastante feucho.

Para realizar el coloreado de sintaxis en LibreOffice Writer, instalaremos la extensión «Code Colorizer Formatter» de Andrew Pitonyak, al que algunos conoceréis por su excelente documento sobre programación de macros en LibreOffice/OpenOffice.org. Una vez instalada la extensión y antes de poderla usar, también tendréis que copiar el estilo _OOoComputerCode de este documento, tal y como se explicó en DiarioLinux.

Aplica el estilo _OOoComputerCode a la sección de código que quieras colorear. Selecciona ahora: Tools/Macros/Run Macro…/My Macros/MacroFormaterADP, elige el lenguaje en el que está programada la sección de código de tu documento (Python en nuestro caso) y a continuación pulsa MainPython y «Run…», tal y como se ve en la figura adjunta.

[LibreOffice] Instalar LibreOffice 3.6 en Ubuntu 12.04

Receta rápida para instalar LibreOffice 3.6 en Ubuntu 12.04 (dado que la versión 3.6 no está aún en el repositorio principal de Ubuntu tiene una pequeña complejidad su instalación, de ahí el tip)

Puedes descargar los .deb a mano (vienen en un paquete tgz que tendrás que descomprimir) e instalar de forma paralela una versión anterior a la 3.6 y la propia 3.6 haciendo:

$ cd /tmp/LibO_3.6.0.2_Linux_x86_install-deb_en-US/
$ sudo dpkg -i *deb

O más fácil aún, sustituir la versión vieja por la nueva usando un repo PPA:

sudo add-apt-repository ppa:libreoffice/ppa
sudo apt-get update
sudo apt-get install libreoffice libreoffice-gnome

[LibreOffice] Copiar estilos entre documentos

Así que has creado una serie de estilos en tu documento .odt (LibreOffice) que te gustaría reutilizar en otro .odt distinto… Bien, aquí va una receta rápid para hacerlo.

Abre los dos .odt y desde cualquiera de ellos, selecciona File/Templates/Organize

Doble click en el nombre de los documentos. Se abrirá un submenú «Styles». Doble click en «Styles». Se abrirá un listado de los estilos que tiene el documento. Ahora, elige el estilo que quieres copiar, pulsa la tecla Control y arrastra ese estilo de un documento a otro (es importante que pulses Control porque en otro caso, en lugar de copiar, lo moverías). ¡Listo!