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

  • 0 Respuestas
  • 4957 Vistas

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

Desconectado MagoAstral

  • *
  • Underc0der
  • Mensajes: 115
  • Actividad:
    0%
  • Reputación 0
  • Nada resulta más engañoso que un hecho evidente.
    • Ver Perfil

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

  • en: Diciembre 05, 2015, 02:00:15 pm
Hola a todos soy yo MagoAstral y en esta ocasión os brindo la solución al You are not allowed to view links. Register or Login 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
  1. $ 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: You are not allowed to view links. Register or Login.
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
  1. jad -sjava Test.class
El resultado será así:

Ahora ya tenemos nuestro código fuente "Test.java", 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
  1. 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
  1. import java.util.HashMap;
  2. public class Solución {
  3.  
  4.    public static void main(You are not allowed to view links. Register or Login[] args) {
  5.      
  6.       You are not allowed to view links. Register or Login.out.print(descifrar("#/?$*@"));
  7.  
  8.    }
  9.    public static You are not allowed to view links. Register or Login descifrar(You are not allowed to view links. Register or Login cadena){
  10.      
  11.    You are not allowed to view links. Register or Login descifrado = "";
  12.      
  13.    HashMap<You are not allowed to view links. Register or Login, Character> diccionario = new HashMap<You are not allowed to view links. Register or Login, Character>();
  14.         diccionario.put('*', 'a');
  15.         diccionario.put('$', 't');
  16.         diccionario.put('@', 'm');
  17.         diccionario.put('#', 'x');
  18.         diccionario.put('/', 'i');
  19.         diccionario.put('?', 'r');
  20.        
  21.         for(int i = cadena.length() - 1; i >= 0; i--){
  22.            descifrado += diccionario.get(cadena.charAt(i)).toString();
  23.         }
  24.      
  25.       return descifrado;
  26.    }
  27.  
  28. }
Un saludo,
MagoAstral
« Última modificación: Agosto 31, 2016, 09:37:15 am por rollth »
Lo que sabemos es una gota de agua; lo que ignoramos es el océano.