← Volver al inicio
Android APK Reversing dex2jar Smali CTF

Android Reversing: InsecureBankv2 y KGB Messenger

15/03/2022

Práctica de ingeniería inversa de APKs Android sobre InsecureBankv2 y el CTF KGB Messenger: obtención de código Java, modificación de smali y bypass de controles de acceso.

1. InsecureBankv2 — Reversing y corrección de vulnerabilidad

Paso 1: Descompilar el APK con APK Easy Tool

Abrimos APK Easy Tool, cargamos la APK y pulsamos Decompile. Se genera el directorio con todos los archivos del proyecto.

Paso 2: Obtener el código Java con dex2jar + JD-GUI

En el directorio descompilado encontramos el archivo classes.dex. Lo convertimos a JAR:

# Arrastrar classes.dex sobre d2j-dex2jar.bat o ejecutar:
d2j-dex2jar.bat classes.dex

Abrimos el .jar generado con JD-GUIFile → Save All Sources para obtener los archivos .java.

Los fuentes se encuentran en la ruta: com.android.insecurebankv2

Paso 3: Corregir la vulnerabilidad exported=true

Las actividades con android:exported="true" en el Manifest pueden ser invocadas desde cualquier otra aplicación. Para corregirlo:

<!-- AndroidManifest.xml: cambiar exported a false -->
<activity android:name=".PostLogin"
          android:exported="false" />

Recompilamos el APK (APK Easy Tool firma automáticamente), lo desinstalamos del emulador y lo reinstalamos para verificar el cambio.

2. CTF KGB Messenger — Bypass completo

Análisis inicial

# Analizar con VirusTotal antes de instalar
# Descompilar con APK Easy Tool
# Revisar AndroidManifest.xml → MainActivity como actividad principal

Bypass del control de idioma (Rusia)

El código en MainActivity.java verifica que el locale sea "Russia". En el archivo MainActivity.smali cambiamos los saltos condicionales:

# Cambiar if-nez que salta a :cond_0 → que salte a :cond_1
# Cambiar saltos de :cond_2 → :cond_3
# Esto hace que se salte la verificación de idioma

Recompilamos e instalamos: ahora muestra directamente la pantalla de login.

Obtener usuario y contraseña

En MainActivty.smali encontramos la referencia 7f0d0000. En res/values/strings.xml:

<!-- strings.xml contiene:
  - Una cadena codificada en Base64 (flag)
  - El usuario: Stearling Archer
  - La contraseña se obtiene por ingeniería social: "Guest" -->

Descifrar mensajes del chat

En MessengerActivity.java los strings p y r contienen cadenas cifradas que son los mensajes a descifrar para obtener las flags finales.