No cON Name CTF Pre Quals: Access Level 2

En el segundo nivel nos enfrentamos a una aplicación Android. Lo primero que hacemos aquí es expandir el .apk con la herramienta apktool.

Primero miramos el contenido del fichero AndroidManifest.xml, donde podemos ver la clase inicial de la aplicacion:

También nos encontramos en el directorio res con un subdirectorio llamado raw, el cual contiene 17 imágenes, 16 de las mismas parecen ser trozos de un QR-Code. Parece que nuestro objetivo es leer dicho código. El problema es que no sabemos el orden de los trozos.

Lo siguiente que haremos será echar un vistazo por el código de com.facebook_ctf.challenge.MainActivity. Para ello usamos otra herramienta llamada dex2jar y luego usamos la herramienta jad para decompilar dicha clase.

Dentro de la misma vemos un método llamado public void yaaaay() con el siguiente código: Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 0x7f040005); Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), 0x7f04000d); Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), 0x7f04000c); Bitmap bitmap3 = BitmapFactory.decodeResource(getResources(), 0x7f040004); arraylist.add(bitmap); arraylist.add(bitmap1); arraylist.add(bitmap2); arraylist.add(bitmap3); Bitmap bitmap4 = BitmapFactory.decodeResource(getResources(), 0x7f040006); Bitmap bitmap5 = BitmapFactory.decodeResource(getResources(), 0x7f04000b); Bitmap bitmap6 = BitmapFactory.decodeResource(getResources(), 0x7f040002); Bitmap bitmap7 = BitmapFactory.decodeResource(getResources(), 0x7f04000f); arraylist.add(bitmap4); arraylist.add(bitmap5); arraylist.add(bitmap6); arraylist.add(bitmap7); Bitmap bitmap8 = BitmapFactory.decodeResource(getResources(), 0x7f040010); Bitmap bitmap9 = BitmapFactory.decodeResource(getResources(), 0x7f040000); Bitmap bitmap10 = BitmapFactory.decodeResource(getResources(), 0x7f040001); Bitmap bitmap11 = BitmapFactory.decodeResource(getResources(), 0x7f04000e); arraylist.add(bitmap8); arraylist.add(bitmap9); arraylist.add(bitmap10); arraylist.add(bitmap11); Bitmap bitmap12 = BitmapFactory.decodeResource(getResources(), 0x7f040007); Bitmap bitmap13 = BitmapFactory.decodeResource(getResources(), 0x7f040003); Bitmap bitmap14 = BitmapFactory.decodeResource(getResources(), 0x7f04000a); Bitmap bitmap15 = BitmapFactory.decodeResource(getResources(), 0x7f040008);

Tiene toda la pinta que este código es el que pone todas las imágenes juntas para crear nuestro QR. Lo siguiente es averiguar que imagen corresponde con cada identificador. Para ello, usando la utilidad jad de nuevo, decompilamos el fichero R.class y en este vemos claramente la correspondencia entre los identificaros y los nombres de las imágenes:

public static final class raw {

public static final int a = 0x7f040000; public static final int b = 0x7f040001; public static final int c = 0x7f040002; public static final int d = 0x7f040003; public static final int e = 0x7f040004; public static final int f = 0x7f040005; public static final int g = 0x7f040006; public static final int h = 0x7f040007; public static final int i = 0x7f040008; public static final int ic_secret = 0x7f040009; public static final int j = 0x7f04000a; public static final int k = 0x7f04000b; public static final int l = 0x7f04000c; public static final int m = 0x7f04000d; public static final int n = 0x7f04000e; public static final int o = 0x7f04000f; public static final int p = 0x7f040010;

public raw() { } }

Poniendo todas las imágenes en ese orden, tenemos 4 filas por 4 columnas, todas las filas parecen estar correcta, menos la segunda. La cuarta imagen de la segunda fila parece que está en su posición, como podemos vez por la franja negra, pero las 3 primeras están en sentido contrario.

Al final el código QR obtenido es el siguiente:

Y usando mi móvil como lector, obtuve: 788f5ff85d370646d4caa9af0a103b338dbe4c4bb9ccbd816b585c69de96d9da