MicrosoftProgram.exe QCTF 2016

Нам дан файл MicrosoftProgram.exe (microsoftprogram.exe [6 Kb] (cкачиваний: 10) )

При его запуске через cmd.exe получаем следующее:
MicrosoftProgram.exe QCTF 2016


Попробуем открыть программу с помощью IDAPro:
MicrosoftProgram.exe QCTF 2016


Заметим, что IDAPro определила, что код написан на Microsoft.Net assembly, или проще говоря на C#.
Следовательно мы можем декомпилировать нашу программу!

Для этого воспользуемся .NET Reflector:

MicrosoftProgram.exe QCTF 2016

Вот уже целый код для удобства чтения:

namespace DateReverse
{
    using System;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Text;

    internal class Program
    {
        private static Random rand = new Random(0xc5b8);

        private static string GetFlag()
        {
            byte[] source = new byte[] { 
                0x9c, 0x3e, 0xe9, 0x69, 0xc4, 0xf6, 0x8f, 0xd0, 0x37, 200, 0x92, 0x29, 0x93, 0xd6, 0xf6, 0xf7, 
                240, 0xd9, 0xb8, 0x20, 7, 0xf9, 0x6c, 0xbc, 0x6a, 0xef, 170, 0xf5, 0x35, 0x18, 0x1a, 0x35, 
                10, 0x91, 0x9f, 0x3d, 160
             };
            byte[] key = Enumerable.Range(0, 0x25).Select<int, byte>((<>c.<>9__2_0 ?? (<>c.<>9__2_0 = new Func<int, byte>(<>c.<>9.<GetFlag>b__2_0)))).ToArray<byte>();
            byte[] bytes = source.Select<byte, byte>(((Func<byte, int, byte>) ((t, i) => ((byte) (t ^ key[i]))))).ToArray<byte>();
            return Encoding.UTF8.GetString(bytes);
        }

        private static void Main(string[] args)
        {
            DateTime now = DateTime.Now;
            Console.WriteLine((((now.DayOfYear == 94) && (now.Year == 2016)) && (now.DayOfWeek == DayOfWeek.Friday)) ? GetFlag() : "Sorry, try it another day");
        }

        [Serializable, CompilerGenerated]
        private sealed class <>c
        {
            public static readonly Program.<>c <>9 = new Program.<>c();
            public static Func<int, byte> <>9__2_0;

            internal byte <GetFlag>b__2_0(int x)
            {
                return (byte) Program.rand.Next(0xff);
            }
        }
    }
}



Найдем данную строку:

Console.WriteLine((((now.DayOfYear == 94) && (now.Year == 2016)) && (now.DayOfWeek == DayOfWeek.Friday)) ? GetFlag() : "Sorry, try it another day");



Даже для тех, кто не изучал C# становится очевидно, что для получения флага нам требуется,чтобы системное время было настроено на:

1. 94 день в году
2. 2016 год
3. день недели - пятницу

Но это невозможно, т.к. 94 день в году - 3 апреля 2016 года является воскресеньем!

Для решения данной проблемы найдем ближайшую пятницу - это будет 1 апреля 2016 года, 92 день в году.

Далее запускаем HexEdit, открываем MicrosoftProgram.exe и заменяем в бинарнике 16-разрядное представление числа 94 (это будет 5E) на 16-разрядное представление числа 92 (это будет 5С). Стоит заметить, что для того, чтобы догадаться до такого решения, пришлось повозиться с IDAPro, где я выделил нужную переменную и нашел её местоположение в hex-представлении файла (ведь у файла может быть несколько вставок 5E).

На фото вы можете увидеть данный фрагмент.
MicrosoftProgram.exe QCTF 2016

После того, как мы заменили 5E на 5C, нам требуется поменять системное время на 1 апреля 2016 года..

MicrosoftProgram.exe QCTF 2016


..и запустить программу!

MicrosoftProgram.exe QCTF 2016

FLAG: QCTF_22b21624c7119f3775910a7b1f89d5fa

Так же видео от участника команды r00t:
скачать dle 10.5фильмы бесплатно

  • Автор: drakylar
  • Комментарии: 2
  • Просмотры: 989

Добавить комментарий

Вы не авторизованы и вам запрещено писать комментарии. Для расширенных возможностей зарегистрируйтесь!
    • Написал: ANARH1ST47
    • Комментарии: 1
    • 4 апреля 2016 16:29
      • Нравится
      • 1
    Я просто после декомпиляции удалил тернарный оператор, оставив только
    Console.WriteLine(GetFlag());
    и пересобрал на сайте ideone. т.к. использовались только System либы все собралось без проблем
    • Написал: drakylar
    • Комментарии: 12
    • 5 апреля 2016 15:32
      • Нравится
      • 0
    Цитата: aka huj_from_mountain
    Я просто после декомпиляции удалил тернарный оператор, оставив только
    Console.WriteLine(GetFlag());
    и пересобрал на сайте ideone. т.к. использовались только System либы все собралось без проблем

    у меня что на компе, что на ideone ругалось на компиляцию (ideone через раз работала). Поэтому пришлось выкручиваться:)