En este apartado del curso de Reversing tenemos un algoritmo básico de descifrado de una función en C. El binario es un ejecutable ELF. Es interesante siempre una vez aprendido a interpretar código ensamblador de la sintaxis de Intel, ver el pseudocódigo en C y realizar análisis estático del mismo para poder escribir nuestro script y ahorrar tiempo. Siempre en caso de duda usar el debugger GDB o r2.
Es de vital importancia el input, donde nosotros tenemos el control de la aplicación, ya que el descifrado se realiza según el input que nosotros introduzcamos.
Se descifra 100 bytes correspondiente a la función que finalmente se llamará. Pero la comprobación con el valor 0xFD94E6E84A0A
es con nuestro input, transformado 100 veces por la función func_input_transf que realiza la siguiente operación aritmética:
Si después de 100 veces de transformaciones la comprobación es correcta con el valor hardcodeado antes mencionado, entonces se realizará de manera correcta el descifrado de la función final crypted_func. Podemos usar Z3 para resolver este problema, si obtenemos el valor en decimal input_transf cuando sea igual a 0xFD94E6E84A0A, entonces tendremos el input esperado. El input_transf sera un valor en decimal, y en little endian, del valor en hexadecimal que vemos en el debugger.
[x = 79427706059334] es lo mismo que 0x483d34347a46
, correspondiente a H=44zF
. Como es little endian el input es: Fz44=H
. Entonces sacamos de conclusión que la ‘password’ para poder descifrar la función que llamará al final es la antes mencionada. Es muy típico en malware, tener cosas parecidas a esta, descifrar una función en memoria y llamarse una vez descifrada.
Finalmente usando el debugger, tenemos la función descifrada: