Outils d'utilisateurs

Outils du Site


csaw2012_quals:reversing:csawqualification.exe

CSAWQualification.exe

Overview

Dans cette épreuve, on nous fournit un exécutable Windows (qui se révèle être un fichier programmé en .NET).

First step

source.cs
private static void Main(string[] args)
{
   Console.WriteLine("Do you really just run random binaries given to you in challenges?");
   Console.ReadLine();
   Environment.Exit(0);
 
   MD5CryptoServiceProvider mD5CryptoServiceProvider = new MD5CryptoServiceProvider();
   AesCryptoServiceProvider aesCryptoServiceProvider = new AesCryptoServiceProvider();
 
   foreach (string current in Directory.EnumerateDirectories(Program.target)) // "C:\Program Files\"
   {
       byte[] first = mD5CryptoServiceProvider.ComputeHash(Encoding.UTF8.GetBytes(current.Replace(Program.target, ""))); // "C:\Program Files\"
 
       if (first.SequenceEqual(Program.marker))
       {
           byte[] rgbKey = mD5CryptoServiceProvider.ComputeHash(Encoding.UTF8.GetBytes("sneakyprefix" + current.Replace(Program.target, ""))); // "C:\Program Files\"
 
           ICryptoTransform cryptoTransform = aesCryptoServiceProvider.CreateDecryptor(rgbKey, new byte[]
           {
               0, 
               1, 
               2, 
               3, 
               4, 
               5, 
               6, 
               7, 
               8, 
               9, 
               10, 
               11, 
               12, 
               13, 
               14, 
               15
           });
 
           byte[] bytes = cryptoTransform.TransformFinalBlock(Program.data, 0, Program.data.Length);
 
           Console.Write(Encoding.UTF7.GetString(bytes));
       }
   }
 
   Console.ReadLine();
}

Le problème est simple, le fichier récupère le nom des dossiers du dossier “C:\Program Files\”, le hash à l'aide de la fonction MD5, compare le résultat avec une suite de bytes et si elle est égal à celle du fichier courant, l'utilise comme clé. Il est ainsi plus simplement de simplement patché l'exécutable.

Patching

                                   
0        L_0000:      ldstr        "Do you really just run random binaries given to you in challenges?"
1        L_0005:      call         System.Void System.Console::WriteLine(System.String)
2        L_000a:      call         System.String System.Console::ReadLine()
3        L_000f:      pop          
4        L_0010:      ldc.i4.0     
5        L_0011:      call         System.Void System.Environment::Exit(System.Int32)

Pour commencer, il est important de retirer les 6 premières instructions qui ne font qu'écrire un message et fermer le programme.

Solve me!

Maintenant, il faut prendre la suite de byte marker, la convertir en hexadécimal (pour avoir la forme la plus commune d'un hash MD5) et trouver une correspondance à celui-ci.

private static byte[] marker = new byte[]
{
   255, 
   151, 
   169, 
   253, 
   237, 
   224, 
   158, 
   175, 
   110, 
   28, 
   142, 
   201, 
   246, 
   166, 
   29, 
   213
};
ff97a9fdede09eaf6e1c8ec9f6a61dd5
md5('Intel') = 0xff97a9fdede09eaf6e1c8ec9f6a61dd5

Il suffit maintenant de simplement créer un dossier Intel dans le dossier target (il est bien sûr possible de changer ce répertoire pour gagner du temps si votre répertoire est immense ou si simplement il n'existe pas).

C:\Users\Xartrick>CSAWQualification.exe
That was pretty easy, wasn't it? \key{6a6c4d43668404041e67f0a6dc0fe243}
csaw2012_quals/reversing/csawqualification.exe.txt · Dernière modification: 2017/04/09 15:33 (modification externe)