Considere la siguiente aplicación de consola .NET 4.5:
using System; namespace ReversingMSIL101 {class Program {static void Main (string [] args) {if (args.Length > 0 && args [0] == "Secreto") Autenticado (); más Anónimo (); } vacío estático privado Authenticated () {Console.WriteLine ("¡Oro para la gente!"); } private static void Anonymous () {Console.WriteLine ("Dales cobre ..."); }}}
Compile y abra Ildasm. Empezaremos cargando el ejecutable (Archivo-> Abrir). Una vez hecho esto: volcarlo (Archivo-> Volcar). Ildasm responde con un bonito diálogo lleno de casillas de verificación, ya que queremos tanta información como sea posible, ¡compruébalo todo!
Ahora echemos un vistazo a nuestras instrucciones IL desensambladas, inicie su editor preferido y abra el anterior volcado generado. Estamos especialmente interesados en la instrucción if
ya que controla si la contraseña proporcionada es correcta; tenga en cuenta que puede detectarlo fácilmente utilizando los comentarios generados.
// 000009: if (args.Length > 0 && args [0] == "Secret") IL_0001: / * 02 | * / ldarg.0IL_0002: / * 8E | * / ldlenIL_0003: / * 69 | * / conv.i4IL_0004: / * 16 | * / ldc.i4.0IL_0005: / * 31 | 12 * / ble.s IL_0019IL_0007: / * 02 | * / ldarg.0IL_0008: / * 16 | * / ldc.i4.0IL_0009: / * 9A | * / ldelem.refIL_000a: / * 72 | (70) 000001 * / ldstr "Secreto" / * 70000001 * / IL_000f: / * 28 | (0A) 000011 * / call bool [mscorlib / * 23000001 * /] System.String / * 01000013 * / :: op_Equality (cadena, cadena) / * 0A000011 * / IL_0014: / * 16 | * / ldc.i4.0IL_0015: / * FE01 | * / ceq
IL_0017: / * 2B | 01 * / br.s IL_001aIL_0019: / * 17 | * / ldc.i4.1IL_001a: / * 00 | * / nopIL_001b: / * 0A | * / stloc.0IL_001c: / * 06 | * / ldloc.0IL_001d: / * 2D | 08 * / brtrue.s IL_0027
Dejo al lector la tarea de revertir y analizar las instrucciones. Continuaremos mirando el último. Para resumir: si el primer argumento no es la cadena "Secret"
, tomaremos la rama y terminaremos en IL_0027
:
IL_0027: / * 28 | (06) 000003 * / call void ReversingMSIL101.Program / * 02000002 * / :: Anónimo () / * 06000003 * /
Bastante mal, ¿eh? Así que simplemente modificaremos un poco la última instrucción, además de reemplazarla por brfalse.s
:
IL_001d: / * 2B | 08 * / brfalse.s IL_0027
¡Y eso es todo, hemos terminado! Guarde el archivo y abra un shell, navegue hasta la carpeta que contiene el volcado de IL y emita ilasm ReversingMSIL101.il
para volver a ensamblar el volcado en un ejecutable.
¡Ahora es el momento de verifique nuestro trabajo:
C: \ Users \ dna \ Documents \ Visual Studio 2012 \ Projects \ ReversingMSIL101 \ ReversingMSIL101 \ bin \ Debug>ReversingMSIL101.exe ¡IdoNotKnowGold para la gente!