Rev 3DSCTF 2016
Райтап был написал Revervand'ом! Все таски вы можете скачать тут ->
Reverse 100 - Warmup
Описание :
[EN]
Rev warmup.
Flag format: "3DS{flag}"
Решение:
Скачиваем бинарник получаем ELF под 32битную систему. Закидываем в IDA, сразу видим функцию флаг.
Берём из функции всё что нам нужно, и получаем флаг.
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. Загрузим наше приложение в него.
Видим кастомный класс который является регистрационным ключом и если он не нуль выводится флаг. Я не особо хотел разбираться, что и как там выводится и просто закинул в онлайн компилятор, немного модифицировав.
Получаем флаг и радуемся.
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
При запуске приложения оно скачивает и устанавливает другое приложении.
Я сразу не понял куда, как и почему оно установилось, но после последующего нажатия на setup.exe запускалась другое приложение и выглядело так:
При нажатие на кнопку происходило исключение.
Всё это действо почему-то дало мне мысль включить API – монитор и вообще посмотреть что происходит при запуске.
Может и не самым простым способом, но я нашёл папку в которой содержится программа, которую скачал установщик и которую он запускает.
Зайдя в папку я нашёл сам экзешник того, что на самом деле запускается, выгрузил его в IDA, понял , что это опять .NET, открыл в ILSpy и вот что увидел:
В ресурсах есть некий урл, который показался подозрительным я перешёл по нему. Сначала по картинке.
Получил картинку – поржал, погрустил и перешёл по второму урлу.
Он предложил скачать табличку, на что я согласился и открыл скачанную таблицу.
В 3 листе EXEL файла был флаг
Получаем флаг
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(), то мы увидим примерно следующее:
__int64 – можно заменить на long long(далее мы и будем так делать).
Так же мы можем получить псевдокоды всех функций которые используются при вычислениях. Нам нужно их преобразовать для быстроты вычислений.
Начнём
Функция um() изначально выглядит так:
Не сложно догодаться, что она вернёт a1 + 1, соотвественно везде где она вызывается мы можем заменить её вызов на += 1 или на ++.
Например
Var = um(var) - > Var += 1
Функция feliz() изначально выглядит так:
Можно увидеть что это фактически противоположная функция прошлой. То есть места где она вызывается можно поменять на -= 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}
- Автор: drakylar
- Комментарии: 0
- Просмотры: 3029