Como habíamos quedado en la PARTE 1 el CrackmeBaby.apk desencripta un nuevo.apk
content.apk SHA256: 94317deb79ced2ece91b413d142492c76c876a320957a0f21bdf2a8150d6d427
Arrancamos la APP y nos muestra esta imagen, evidentemente algo mal estamos haciendo.
Decompilamos con APK-Multy-tool
Existen dos activities SuperActivity y SuperbActivity.
Esto lo vemos en el AndroidManifest.xml
SuperbActivity hace cosas mas interesantes y vemos que nunca arranca por lo que vamos a forzar su arranque
Para arrancar la actividad modificamos el AndroidManifest.xml para que arranque la SuperbActivity y luego volvemos a compilar y firmar.
Así vamos a obtener una segunda aplicación que siempre arrancará la actividad correcta para resolver este reto, por lo que a partir de ahora seguiremos trabajando con ella.
La arrancamos y vemos lo siguiente:
Una imagen de Fsociety y un contador decreciente, no tenemos ningún ingreso de datos como en el apk de la Parte 1.
En el código vemos
try
{
if ((SuperbActivity.b <= 0.0D) && (SuperbActivity.a < 0))
{
SuperbActivity.a += 1;
SuperbActivity.access$002(SuperbActivity.this, 10.0D * (int)Math.log(Math.pow(SuperbActivity.a, SuperbActivity.a)));
SuperbActivity.b = SuperbActivity.this.c;
String str = SuperbActivity.this.getPreferences(4).getString("password", "no_password");
if (e.SHA1(str).equalsIgnoreCase("249192f0a4f70aa25aa5c7521625f7d6e4021042"))
new a().execute(new b[] { new b(SuperbActivity.this.getApplicationContext(), d.decrypt(str, "Jhv1Bk0Qi07jOVEeyImynOQmiiz1MvZakazhOaAld-0=")) });
}
SuperbActivity.this.t.setText(String.format("Próximo intento: %.1f", new Object[] { Double.valueOf(SuperbActivity.b) }));
SuperbActivity.b -= 0.1D;
SuperbActivity.this.g.postDelayed(this, 100L);
return;
}
catch (Exception localException)
{
Log.e(SuperbActivity.this.getResources().getString(2131099668), "Oops!");
}
Podemos observar que por otro lado hay un hash de SHA1 y un d.decrypt que toma como ingreso la cadena Jhv1Bk0Qi07jOVEeyImynOQmiiz1MvZakazhOaAld-0=
Vemos también:
protected void onCreate(Bundle paramBundle)
{
......................................
paramBundle.putString("password", "insert_password_here");
paramBundle.apply();
}
.source "SuperbActivity.java"
.line 61
.local v0, "editor":Landroid/content/SharedPreferences$Editor;
const-string v2, "password"
Significa que existe una shared memory en la cual deberemos poner una clave para que luego sea comparada con el hash del SHA1 y si machea se ejecuta la función d.decrypt("clave",Jhv1Bk0Qi07jOVEeyImynOQmiiz1MvZakazhOaAld-0=)
Busque el hash por internet sin suerte, por lo que intente con hashcat y probar una clave de 10 dígitos incremental....
hashcat64.exe -m 100 -a 3 example0.hash ?s?s?s?s?s?s?s?s?s?s --incremental
Probé con solo numéricos, con alfa + may/minusculas sin éxito, para luego pasar al set con caracteres espaciales. Hasta los siete caracteres fue rápido y luego paso de horas a días y años... por lo que descartamos esté método debido a que un reto en una confer no nos puede llevar tanto tiempo a menos que tengamos una maquina cuántica...
Probe con hashcat porque al ver a Obi se me vino a la mente "Usa la Fuerza"...fuerza bruta....mmmm.... no...no.... solo fue una trampita :D
La password debería estar en otro lugar, revisando las imágenes de los recursos se las pase al exiftool y en la imagen de fsociety se puede ver lo siguiente en el Thumbnail
exiftool -b -ThumbnailImage image.jpg > my_thumbnail.jpg
Ahora que tengo la password r4bb!th0l3 se la puedo poner en el shared memory con el ADM en /data/data/eset.ekoparty.challenge.crackmeharder/shared_prefs/SuperbActivity.xml
O asignar la password directamente en el SuperbActivity.smali y me olvido.
Lógicamente vuelvo a compilar y firmar la aplicación.
.source "SuperbActivity.java"
.line 61
.local v0, "editor":Landroid/content/SharedPreferences$Editor;
const-string v2, "password"
const-string v3, "r4bb!th0l3"
Cuando machea el SHA1, como habíamos comentado antes, se
ejecuta d.decrypt( r4bb!th0l3,Jhv1Bk0Qi07jOVEeyImynOQmiiz1MvZakazhOaAld-0=)
obteniendo como resultado el string f0ll0w_th3_wh!t3_r4bb!t!
Acá la podemos ver en un dump de memoria previo.
Cada vez que el contador se pone en cero o se da click en el label, el apk llama a la class b y visita un sitio.
SuperbActivity.this.t.setText(String.format("Próximo intento: %.1f", new Object[] { Double.valueOf(SuperbActivity.b) }));
SuperbActivity.b -= 0.1D;
SuperbActivity.this.g.postDelayed(this, 100L);
class b
{
.................................
String getUrl()
{
return "http://desafioseset.com/";
}
}
En el LOGCAT se ve lo siguiente
Por otro lado se llama a la Class n a la cual se le pasa el string f0ll0w_th3_wh!t3_r4bb!t!
SuperbActivity.FLAG = new n().func(localb.getKeyword());
class n
{
static
{
System.loadLibrary("dostuff");
}
Por lo que si hacemos un DUMP de la memoria.
Obtenemos la FLAG :D
eko_eset_m0b!l35
El APK lo deje modificado para que ingrese directamente a la actividad que corresponde, tome la clave y la imprima en el logcat.
Les dejo el apk original y la modificada con los archivos SMALI que toque.
https://dl.dropboxusercontent.com/u/80008916/Crackmeharder.7z
No hay comentarios:
Publicar un comentario