Rev 3DSCTF 2016

Райтап был написал Revervand'ом! Все таски вы можете скачать тут ->3ds_reverse.zip [229,02 Kb] (cкачиваний: 15)


Reverse 100 - Warmup
Описание :
[EN]
Rev warmup.
Flag format: "3DS{flag}"



Решение:
Скачиваем бинарник получаем ELF под 32битную систему. Закидываем в IDA, сразу видим функцию флаг.

Rev 3DSCTF 2016

Берём из функции всё что нам нужно, и получаем флаг.

Rev 3DSCTF 2016

Flag: 3DS{0p1n1@_te_pr3nd3}



Reverse 200 - shamecontrol

Описание:

[EN]
What if it is a Windows .exe, do you still can?
Flag format: "3DS{flag}"




Решение:

Скачиваем экзешник, закидываем в IDA, видим что это .NET – приложение. Для анализа .NET – приложений можно использовать ILSpy. Загрузим наше приложение в него.

Rev 3DSCTF 2016

Видим кастомный класс который является регистрационным ключом и если он не нуль выводится флаг. Я не особо хотел разбираться, что и как там выводится и просто закинул в онлайн компилятор, немного модифицировав.

Rev 3DSCTF 2016

Получаем флаг и радуемся.
Flag: 3DS{j4t4v4c4b4nd0}



Rev 200 - Blue Screen


Описание:

[EN]
This report generator software was good until stop works. I can't find my files. Now I don't know why the downloads doesn't works.
Solve the challenge and as a reward there is a flag into the report.



Переходим по ссылке в задание, попадаем на сайт, с которого можно скачать приложение start.exe

Rev 3DSCTF 2016


При запуске приложения оно скачивает и устанавливает другое приложении.
Я сразу не понял куда, как и почему оно установилось, но после последующего нажатия на setup.exe запускалась другое приложение и выглядело так:

Rev 3DSCTF 2016

При нажатие на кнопку происходило исключение.

Rev 3DSCTF 2016

Всё это действо почему-то дало мне мысль включить API – монитор и вообще посмотреть что происходит при запуске.

Rev 3DSCTF 2016

Может и не самым простым способом, но я нашёл папку в которой содержится программа, которую скачал установщик и которую он запускает.
Зайдя в папку я нашёл сам экзешник того, что на самом деле запускается, выгрузил его в IDA, понял , что это опять .NET, открыл в ILSpy и вот что увидел:

Rev 3DSCTF 2016


В ресурсах есть некий урл, который показался подозрительным я перешёл по нему. Сначала по картинке.

Rev 3DSCTF 2016

Получил картинку – поржал, погрустил и перешёл по второму урлу.

Он предложил скачать табличку, на что я согласился и открыл скачанную таблицу.
В 3 листе EXEL файла был флаг

Rev 3DSCTF 2016

Получаем флаг
Flag: 3DS{Windows_0/Windows_DotNet}


Rev 500 - High Power Computing

Описание:

[EN]
Santa Claus has sent us this program saying that we need to run it in order to get our Xmas gift.
"Ho ho ho, a great flag shall be seen after running this bin" - Said Santa in his letter.
Thing is: Santa's been a little sarcastic this year, and he also said maybe we'll need to ask "LNCC" and "Santos Dumont" to retrieve this flag.
Could you help us?



Смысл задания был довольно простой. Нам дан ELF64 который выполняет вычисления и выводит строку – которую нужно вставить в форму флага. Проблема которая была – цикл выполняется примерно 12.5 миллионов раз, и в цикле вызываются 4 функции многие из которых тоже вызывают функции и так далее. Решение заключалось в разборе работы всех функций и их упрощения.

Если получить декомпилированный код функции main(), то мы увидим примерно следующее:

Rev 3DSCTF 2016

__int64 – можно заменить на long long(далее мы и будем так делать).
Так же мы можем получить псевдокоды всех функций которые используются при вычислениях. Нам нужно их преобразовать для быстроты вычислений.

Начнём

Функция um() изначально выглядит так:

Rev 3DSCTF 2016


Не сложно догодаться, что она вернёт a1 + 1, соотвественно везде где она вызывается мы можем заменить её вызов на += 1 или на ++.
Например

Var = um(var) - > Var += 1

Функция feliz() изначально выглядит так:

Rev 3DSCTF 2016

Можно увидеть что это фактически противоположная функция прошлой. То есть места где она вызывается можно поменять на -= 1 или на --.

Таким образом нужно было проанализировать все функции, и все они заменялись на простые мат. выражения в итоге программа выглядела примерно так.

#include <stdio.h>
long long modpow(long long a, long long b) {
 long long res = 1;
 while(b > 0) {
  if(b & 1) {
   res = (res * a);
  }
  b = b >> 1;
  a = (a * a);
 }
 return res;
}
int  main()
{
  long long v3;
  long long v4;
  long long v5;
  long long v6;
  long long i;
  long long v9;
  v9 = 0LL;
  for ( i = 0LL; i <= 0xC0DE41; ++i )
  {
    v3 = i / 0x29uLL;
    v4 = modpow(3uLL,v3);
    v5 = v4 + v9;
    v6 = v5 * i;
    v9 = v6 % 0x41DEADBABEC0FFEEuLL;
  }
  printf(
   "%04llx%04llx%04llx%04llx\n",
    (long long)v9 >> 48,
    (v9 & 0xFFFF00000000uLL) >> 32,
    (long long)((unsigned int)v9 & 0xFFFF0000) >> 16,
    (unsigned short)v9,
    i);
  return 0;
}



При запуске этого кода можно было получить верное число и это и был флаг.

Flag: 3DS{39a667347306e209}
скачать dle 10.5фильмы бесплатно

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

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

Вы не авторизованы и вам запрещено писать комментарии. Для расширенных возможностей зарегистрируйтесь!