Solución: "Recupera la contraseña!"

Iniciado por MagoAstral, Diciembre 05, 2015, 02:00:15 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Diciembre 05, 2015, 02:00:15 PM Ultima modificación: Agosto 31, 2016, 09:37:15 AM por rollth
Hola a todos soy yo MagoAstral y en esta ocasión os brindo la solución al No tienes permitido ver enlaces. Registrate o Entra a tu cuenta que propuse ayer, sin mucho más que agregar comencemos con la solución.
Escenario:
  • ¿Qué tengo que hacer?: Descifrar una contraseña y realizar una función que descifre.
  • ¿Qué tenemos?: Tenemos la contraseña cifrada y tenemos un "programa".
Manos a la obra:
Ahora que sabemos lo que tenemos, barajamos por donde empezar y sin mucho que pensar elegimos el "programa". Tiene una extensión un tanto peculiar ".jar", si no sabemos lo que nos indica esto podríamos hacer uso de nuestro motor de búsqueda favorito y lo que nos indica es Java Archive y que está comprimido en en formato ZIP. Procedamos a hacer ingeniería inversa al archivo, simplemente extraeremos el contenido en una carpeta y nos dejará algo tal que así:

Otra manera de descomprimir el archivo sería mediante la siguiente sintaxis:
Código: text
$ jar -xvf nsa.jar

Ahora que ya tenemos descomprimido el archivo lo más suculento sería la clase llamada "Test.class", como sabemos Java compila a bytecode así que procedamos a decompilar la clase y para ello haremos uso de un famoso decompilador llamado "JAD", el cual podremos descargar desde su página: No tienes permitido ver enlaces. Registrate o Entra a tu cuenta.
Tras descargalo y extraerlo en el mismo directorio donde habíamos extraído la clase, procederemos a abrir nuestra consola o terminal. Tras situarnos en el directorio adecuado y haciendo uso de la sintaxis del decompilador:
Código: text
jad -sjava Test.class

El resultado será así:

Ahora ya tenemos nuestro código fuente "No tienes permitido ver enlaces. Registrate o Entra a tu cuenta", una vez importad analizaremos detenidamente su estructura:

Como vemos nos está dando una método que se llama "codificar" al cual le hay que pasar un parámetro, dentro de dicho método que podríamos clasificar como un poco chapucero, hay un diccionario que nos está dando 5 equivalencias.
Nosotros teníamos que descifrar la clave "#/?$*@", y sabemos su equivalencia a las letras aquí alguno fallo pues dijo que bien simplemente le doy a lo que equivale y el resultado es: "xirtam" y obviamente esa no es la solución.
El método convierte la cadena que se le pasa como parámetro a un array de caracteres y luego recorre el array haciendo la conversión del diccionario, fijémonos en la estructura iteractiva:
Código: java
for(int i = array_caracteres.length - 1; i >= 0; i--)

Como podemos ver recorremos el array partiendo de su ultima posición lo que quiere decir es: NO, las solución no es xirtam, es matrix (¿Agente Smith)
Bueno como vemos es algo sencillo pero que muchos fallaron y esto quiere decir que no es oro todo lo que reluce, ahora simplemente tocaría hacer la función que descifra:

El esquema espero que aclare las dudas, si de una palabra A aplicando una función P llegamos a B entonces si nos dan B para llegar a nuestro objetivo A  hay que aplicar la función inversa: P^-1
Bueno he rectificado, ya que es una solución completa también ofreceré la función que decodifica:
Código: java
import java.util.HashMap;
public class Solución {

public static void main(String[] args) {

System.out.print(descifrar("#/?$*@"));

}
public static String descifrar(String cadena){

String descifrado = "";

HashMap<Character, Character> diccionario = new HashMap<Character, Character>();
        diccionario.put('*', 'a');
        diccionario.put('$', 't');
        diccionario.put('@', 'm');
        diccionario.put('#', 'x');
        diccionario.put('/', 'i');
        diccionario.put('?', 'r');
       
        for(int i = cadena.length() - 1; i >= 0; i--){
        descifrado += diccionario.get(cadena.charAt(i)).toString();
        }

return descifrado;
}

}

Un saludo,
MagoAstral
Lo que sabemos es una gota de agua; lo que ignoramos es el océano.