MicrosoftProgram.exe QCTF 2016
Нам дан файл MicrosoftProgram.exe (
При его запуске через cmd.exe получаем следующее:
Попробуем открыть программу с помощью IDAPro:
Заметим, что IDAPro определила, что код написан на Microsoft.Net assembly, или проще говоря на C#.
Следовательно мы можем декомпилировать нашу программу!
Для этого воспользуемся .NET Reflector:
Вот уже целый код для удобства чтения:
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).
На фото вы можете увидеть данный фрагмент.
После того, как мы заменили 5E на 5C, нам требуется поменять системное время на 1 апреля 2016 года..
..и запустить программу!
FLAG: QCTF_22b21624c7119f3775910a7b1f89d5fa
Так же видео от участника команды r00t:
- Автор: drakylar
- Комментарии: 2
- Просмотры: 2894