This site uses cookies own and third. If you continue to browse consider to accept the use of cookies. OK More Info.

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

  • 0 Replies
  • 5921 Views

0 Members and 1 Guest are viewing this topic.

Offline MagoAstral

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

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

  • on: December 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:
Code: (text) You are not allowed to view links. Register or Login
$ jar -xvf nsa.jarAhora 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:
Code: (text) You are not allowed to view links. Register or Login
jad -sjava Test.classEl 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:
Code: (java) You are not allowed to view links. Register or Login
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:
Code: (java) You are not allowed to view links. Register or Login
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
« Last Edit: August 31, 2016, 09:37:15 am by rollth »
Lo que sabemos es una gota de agua; lo que ignoramos es el océano.