En esta entrada la solución a un reto de 'reversing' de una aplicación para el sistema operativo Android que aparece en https://www.hackplayers.com/2010/12/reto-android-crackme1.html
Este reto tiene el título "Android crackme#1" y mi valoración sobre su dificultad es: ★☆☆☆☆.
Nos dan un archivo APK (crackme1hpys.apk) y tenemos que conseguir completar el proceso de login con un usuario y contraseña correctos.
Solución: ejecuto la aplicación en un emulador de Android y se me pide que introduzca un usuario y una contraseña. Introduzco dos valores cualesquiera, pulso "Login" y se muestra un mensaje de error:
Para el análisis de la APK utilizo jadx, un decompilador de archivos APK.
Examinando las clases enseguida veo que la validación del usuario y de la contraseña que se introducen se realiza en la clase "crackme1hpys":
Tal y como se observa en el código de la figura anterior, para pasar el proceso de login con éxito el campo "Usuario" debe contener el valor "admin3" y, además, la contraseña introducida debe ser igual al resultado de la función "doConvert", a la que se le pasa como parámetro la cadena "PBAGENFRAN456", pero ¿qué se hace en esta función?. Pues fijándome bien, enseguida reconozco que para carácter alfabético en mayúsculas de la cadena que se le pasa como parámetro (códigos ASCII en decimal del 65 al 90) se realiza ROT13, es decir, se sustituye cada letra mayúscula de la cadena por la letra mayúscula que está trece posiciones por delante en el alfabeto.
Ejemplo: para la primera letra mayúscula de la cadena que se pasa como parámetro a la función, "P" (código ASCII 80 en decimal):
(resto ((80 - 65) + 13) / 26) + 65 = (resto 28 / 26) + 65 = 2 + 65 = 67 (código ASCII en decimal de "C").
Por tanto, para obtener la contraseña correcta creo un pequeño script en python:
secreto_enc = 'PBAGENFRAN456'
secreto = ''
for i in range(len(secreto_enc)):
if ord(secreto_enc[i]) < 65 or ord(secreto_enc[i]) > 90:
secreto=secreto+secreto_enc[i]
else:
secreto=secreto+chr((((ord(secreto_enc[i])- 65) + 13) % 26) + 65)
print 'password:', secreto
Ejecuto este script:
Por tanto, la contraseña correcta es: "CONTRASENA456".
Para comprobar si lo he hecho bien ejecuto la APK en el emulador de Android, introduzco los campos "Usuario" y "Contraseña" hallados y pulso "Login":
Y, tal y como se puede ver en la figura anterior, se muestra el mensaje de éxito.
Este reto tiene el título "Android crackme#1" y mi valoración sobre su dificultad es: ★☆☆☆☆.
Nos dan un archivo APK (crackme1hpys.apk) y tenemos que conseguir completar el proceso de login con un usuario y contraseña correctos.
Solución: ejecuto la aplicación en un emulador de Android y se me pide que introduzca un usuario y una contraseña. Introduzco dos valores cualesquiera, pulso "Login" y se muestra un mensaje de error:
Para el análisis de la APK utilizo jadx, un decompilador de archivos APK.
Examinando las clases enseguida veo que la validación del usuario y de la contraseña que se introducen se realiza en la clase "crackme1hpys":
Tal y como se observa en el código de la figura anterior, para pasar el proceso de login con éxito el campo "Usuario" debe contener el valor "admin3" y, además, la contraseña introducida debe ser igual al resultado de la función "doConvert", a la que se le pasa como parámetro la cadena "PBAGENFRAN456", pero ¿qué se hace en esta función?. Pues fijándome bien, enseguida reconozco que para carácter alfabético en mayúsculas de la cadena que se le pasa como parámetro (códigos ASCII en decimal del 65 al 90) se realiza ROT13, es decir, se sustituye cada letra mayúscula de la cadena por la letra mayúscula que está trece posiciones por delante en el alfabeto.
Ejemplo: para la primera letra mayúscula de la cadena que se pasa como parámetro a la función, "P" (código ASCII 80 en decimal):
(resto ((80 - 65) + 13) / 26) + 65 = (resto 28 / 26) + 65 = 2 + 65 = 67 (código ASCII en decimal de "C").
Por tanto, para obtener la contraseña correcta creo un pequeño script en python:
secreto_enc = 'PBAGENFRAN456'
secreto = ''
for i in range(len(secreto_enc)):
if ord(secreto_enc[i]) < 65 or ord(secreto_enc[i]) > 90:
secreto=secreto+secreto_enc[i]
else:
secreto=secreto+chr((((ord(secreto_enc[i])- 65) + 13) % 26) + 65)
print 'password:', secreto
Ejecuto este script:
Por tanto, la contraseña correcta es: "CONTRASENA456".
Para comprobar si lo he hecho bien ejecuto la APK en el emulador de Android, introduzco los campos "Usuario" y "Contraseña" hallados y pulso "Login":
Y, tal y como se puede ver en la figura anterior, se muestra el mensaje de éxito.
Muchas gracias!!! Habia leido sobre esto anteriormente, pero no lo imaginaba asi, enviamos un saludo desde espacioapk.
ResponderEliminar