R0 CREW

Kaspersky crackme (ZN2014)

На ZeroNights каспер запустил еще один конкурс по решению крякми, в этот раз крякмисов 3 штуки. пруфлинк.

Так что у кого есть время и желание то можете что нить выйграть.

И я тоже конечно хотел бы решить это дело, не призов ради а скила для. Но как и ожидалось далеко не ушел (.

2 - крякми самый легкий, там ничего сложного и решается быстро.
1 - вот тут и зактык.

Посидел почти целый день и ни к чему особо не пришел (. Вроде как там юзается хеширование (кажется md5). Вот и хотел попросить совета , куда копать? Не хотелось бы в лоб переписывать каждую инструкцию на си, и судя по всему что первое решение этого задание появилось в течении нескольких часов, то наверное можно и без этого обойтись.

Не дадут нам жизни с этими крякмисами )))

Ахах) Согласен, наверное уже далеко не всем интересно ковыряться в песочнице)
Но как мне кажется, не плохой способ немного прокачать скил, для новичков.

Как всегда в крипто, проблема с определением, что за алгоритм. Вот что за алго начинается по адресу 0040DD80 ?? Я думаю, что определив это, таск будет почти решён.

Архангел, у меня по этому адресу ничего нет, но вот что я пока нашёл (неправильно - поправьте): сначала мыло паддится до 64 символов (не просто нулями, а как-то по-хитрому, не стал разбирать), потом вычисляется его хеш sha1 (причём последний параметр инициализации - пятый, равен длине вашего исходного мыла), от него берётся murmur3 и это всё xorится с 0x4B4C434D. Дальше ещё не успел разобрать.
UPD:
из дебаггера же смотрю, потому ничего там и нет

ARCHANGEL имхо говорит о 3м задании, а ololoshenka о 1м.

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

Телефон - 7й
Лотерея - 12й
Приступлю завтра к “Зловреду”.

А не натолкнешь пожалуйста на мысль как мне быть дальше.
Там в функции ( которая вызывается через edx) мыло хешируется мд5 , и еще ключ(вроде как каким - то простым самопальным алгоритмом) но дальше затык. Никак не могу понять как пройти эту функцию,
if ( sub_1322A00((int *)v17, a5, v11, 256) == 256 ), это тоже какой то самопальный алгоритм или как там вообще быть ?

 do
    {
      *(_BYTE *)(v22 + ((unsigned int)*(_BYTE *)v9 >> 4) + 16 * (*(_BYTE *)v9 & 0xF)) ^= sub_1322820(
                                                                                           (int)((char *)v20 + 620),
                                                                                           0,
                                                                                           32767);
      ++v9;
      --v23;
    }
    while ( v23 );
    v11 = (unsigned int)((char *)v20 + 364);
    memset((char *)v20 + 364, 0, 0x100u);
    v12 = v17;
    if ( sub_1322A00((int *)v17, a5, v11, 256) == 256 )
    {
      v13 = 256;
      v14 = v11;

На основании оработки мыла получили разреженную таблицу 256 байт. Эта функция должна “разархивировать” строку полученную из пароля в точно такую же таблицу. Архивирование типа RLE (для повторяющихся нулевых последовательностей хранится счетчик повтора, для ненулевых байт сами байты).

Хм… спасибо, но все равно есть несколько вопросов, первый - а как понял (какой примерно ход мысли) что это именно RLE архивация?

И второй, я получил таблицу разреженную на основе мыла, но вот беда, какие бы значения я не подставлял, больше чем на 24 байта они не влияют (то есть в новой таблице которая разархивируется из пароля не получается изменить дальше чем 24 байт). или может не там смотрю…? какой то странный формат rle там, не на из вики и из хабра алго вроде как не похож

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

Он вываливается раньше времени, если находит некорректный байт/бит.

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

Есть подозрение, что я где-то сделал ошибку с условной инструкцией, но вроде всё норм. Не помешала бы валидная пара, чтобы проверить работу кода… Был бы очень благодарен за неё.

Aналогично, восстановил вроде правильно так как и под отладчиком и в моем алго, выходной массив один и тот же. Ну и логичный вопрос что теперь делать, подозреваю что тут должно быть какое то линейное (а может и нет ) уравнение, или что то на подобие, потому что в ручную подбирать не резон уже. Не подскажете как теперь дальше ?

Ничего такого нет. Надо разобраться, как заставить этот алго, записывать по любому смещению (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, … , 32). Берем карандаш и рисуем представление четырех байтов в битовом представлении и наблюдаем за выборкой битов. Я хотел это сделать без бумажки, в итоге запутался и потерял день. Сейчас написал конвертер, он мне сам все расстояния считает. Я ему только задаю кол-во нулей и байт который нужно записать после.

Сам сейчас застопорился на таблице преобразования, та которая преобразует введенные данные, в байты по которым строится таблица.

Да тоже блин день потерял, хотел уже плюнуть, вроде как и дорешать хочется, но уже надежду потерял. Сейчас попробую написать конвертер, но не понятно честно говоря как вообще все высчитывать.

Туго и нудно крякми пошёл… Я бы лучше пару виртуалок разреверсил. 11-й по телефону.

Круто, слушай, я и с бумагой и карандашем, все таки не понял закономерности конвертации из хеша пароля в матрицу. ек макарек, уже не знаю что и делать.

У меня был затык с тем, что я поспешил и людей насмешил. А конкретно, решил что можно писать только по конкретным смещениям, а не по всем. Вместо того, чтобы взять карандаш и нормально все пересчитать, начал искать способ записи нулевого байта по конкретному смещению. Но так делать было нельзя, там есть на это проверка… Пострадав еще немного фигней, взялся пересчитывать и в итоге понял где ошибся. Ушло на это 5 минут, фигней же страдал очень долго.

Скорее всего твое представление не лучше обычного асма, поэтому ты не видишь того, что, куда и как переходит. У меня получился хороший сишник, без всяких goto, есть циклы, с break / continue и видно три основные блока (блок записи, блок подсчета ширины, блок записи нулей).

Еще одна подсказка: Последовательность байтов нужно рассматривать, как битовый stream, а не как отдельные байты указывающие на кол-во нулей и байтов, которые нужно записать, т.е. задание ширины (нулей) и байта (после нулей), может потребовать, например, 13-бит, тогда расчет следующей ширины и байта начнется с 14-бита.

На самом деле понять, что там происходит можно и без восстановления кода, нужно просто сесть и внимательно проанализировать действия.

Ребят, можете подсказать, как лучше реализовать восстановление пароля из rle последовательности? Я уже получил оную последовательность и сейчас на последнем шаге - нужно подобрать к ней пароль.
Начал писать свой вариант, однако столкнулся с трудностями и понял, что код придётся сильно усложнять. Дайте совет.