суббота, 5 декабря 2015 г.

Current

Я давно уже не писал в блог по разным причинам. Нужно собрать мысли в кучу и расписать все, что должно быть рассказано.

Поэтому, пока что, просто анонс клуба codeX: https://ifmo.su/

CodeX - это клуб веб-разработки, дизайна и маркетинга. Мы строим команду молодых специалистов, способную создавать полноценные проекты в интернете на мировом уровне.

Ну и моя новая статейка (пока не знаю буду ли ее кросспостить сюда): https://ifmo.su/article/15

пятница, 23 октября 2015 г.

KrasCTF 2015. Итоги

А вы еще не видели крутой текст про итоги KrasCTF 2015?
Держите - http://ctfnews.ru/news/132

P.S. Надо бы написать статью про "кухню krasctf", но пока руки не доходят. А еще ведь готовить анонс нашей чек-системы. Кому интересно - пишите мне. Особенно, если вы готовите свою игру и хотите прервать процесс написания велосипедов и присоединиться к разработке универсального инструмента.

воскресенье, 18 октября 2015 г.

Linear feedback shift register writeup SPBCTF 2015


11 октября в Санкт-Петербурге во второй раз прошли межвузовские соревнования по информационной безопасности SPbCTF-2015. Участие в соревнованиях приняли 5 команд из ведущих ВУЗов Санкт-Петербурга, среди которых:
  • Санкт-Петербургский государственный университет (СПбГУ);
  • Санкт-Петербургский государственный экономический университет (СПбГЭУ);
  • Санкт-Петербургский государственный университет телекоммуникаций имени профессора М. А. Бонч-Бруевича (СПбГУТ);
  • ИТМО (Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики).
Выступали мы в составе команды ИТМО hardc0de и даже победили. Таски были, на мой взгляд, сложные для обычного очного CTF, поэтому нарешали мы не слишком много. Хочу поделиться writeup'ом задания на 200 баллов.

Дан файл crypto200.cpp (он чуть отличается, но у меня не осталось оригинального файла).

Данный код выполняет операцию зашифрования неизвестного нам текста с ключом 0x1a2b4de1219435c6 и выводит шифротекст. Шифротекст дан в условии задачи: 4b36342e80be9bce9c268becd18a5789fc.

Очевидно, что придется обращать функцию encrypt и писать декриптор. Впрочем, функция ничего сложного не делает – генерирует гамму от вектора инициализации, в качестве которого выступает ключ и затем производит побитовое сложение по модулю 2 с открытым текстом. Казалось бы, что все просто, однако количество итераций гаммы INIT_ROUNDS = 18446744073709550615, что не представляется возможным для перебора.

Первой мыслью было осознание того факта, что 18446744073709550615 = 2**64 – 1001. Возможно, что такие числа подобраны не случайно и где-нибудь произойдет зацикливание алгоритма. Поэтому я переписал код на питон и сделал обычный брутфорс с небольшими оптимизациями. Результирующая строка проверялась на соответствие ascii и выводилась на экран. Код я стер, поэтому приводить его не буду. В результате брутфорса было перебрано порядка миллиона итераций, среди которых ничего вразумительного не оказалось. Возможно, код был написан с ошибкой, или же данный вектор задачу решать не позволял.
    
Далее, уже после соревнований я решил задачу по-правильному (спасибо voz и hiruma52).
 
Для начала немного теории про LFSR (linear feedback shift register). Весь алгоритм генерации гаммы заключался в сдвиге битов состояния lfsrState влево и заполнению правого бита ксором 63-его, 62-го, 60-го и 59-го.


feedbackBit = ((lfsrState >> 63) ^ (lfsrState >> 62) ^ (lfsrState >> 60) ^ (lfsrState >> 59) ) & 1

lfsrState = ((lfsrState << 1) % 2**64) | feedbackBit

Главный интерес в том, что данное действие можно представить как умножение некоторой матрицы перехода на наш стобец состояния из 64 элементов. Покажем это на примере из 4 элементов:

lfsrState = [0, 1, 0, 1] – это наша переменная состояния в виде вектора из 4-х битовых элементов.
TransitionMatrix = [ [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [0, 1, 1, 1] ]

Каким образом она строится? Первые три строки иллюстрируют тот самый бинарный сдвиг элементов налево. Четвертая строка заполняется единицами соответственно тем элементам, которые участвуют в xor-е. Проводя аналогию с заданием, можно получить такой код:


feedbackBit = ((lfsrState >> 2) ^ (lfsrState >> 1) ^ (lfsrState >> 0) ) & 1

lfsrState = ((lfsrState << 1) % 2**4) | feedbackBit

Это хорошо описано на следующем слайде:



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

lfsrState_next = [1, 0, 1, 0]. (первые три бита – просто сдвинуты, а правый заполнен результатом 1^0^1=0).

Теперь проделаем умножение матрицы TransitionMatrix на столбец lfsrState.



 = (1, 0, 1, 0).



Думаю, что здесь хорошо видно как происходит преобразование. Теперь вопрос – зачем городить матричную форму цикла? А затем, что поскольку мы свели задачу нахождения lfsrState_next к умножению TransitionMatrix на lfsrState, то мы можем получить произвольный элемент просто умножая первый lfsrState на TransitionMatrix слева много раз. А значит нам нужно лишь возвести матрицу в определенную степень, что мы можем сделать очень быстро при помощи бинарного возведения в степень.

Осталось чуть-чуть кода и готово.


четверг, 15 октября 2015 г.

KrasCTF уже на этой неделе

KrasCTF - это межрегиональные межвузовские соревнования в области информационной безопасности по принципам игры формата CTF, проводимые Сибирским федеральным университетом (СФУ), при поддержке Межрегиональной общественной организации «Ассоциация руководителей служб информационной безопасности»
Соревнования KrasCTF-2015 состоятся с 17 по 19 октября 2015 года в Институте космических и информационных технологий Сибирского федерального университета в рамках XII специализированной выставки-форума «itCOM – Информационные технологии. Телекоммуникации».

Легенда соревнований:
Каждый  юноша  мечтает  стать  офицером... Мы  конечно  не  столь всемогущи, чтобы дать Вам погоны. Однако мы предлагаем Вам ненадолго окунуться в мир политического сыска, разведки и госбезопасности.
«Кофе, алкоголь, сахар, воспоминания, злость,
все вместе прогоняют сон».
В. Миронов(«Глаза войны»)
Представьте себя в роли молодого сотрудника, которому выпала честь решать самые сложные задачи нашей Конторы, связанные с криптографией, web-уязвимостями, программированием, стеганографией и обратной разработкой.
Теперь запасёмся необходимым количеством материально-технических средств (вкусняшками и кофе), запишемся в Книгу учёта участников KrasCTF и на 8 часов погрузимся в атмосферу борьбы «с контрреволюцией и саботажем».
На данный момент зарегистрированы уже более 10 команд из Красноярска, Томска, Новосибирска, Барнаула, Владивостока, Москвы и Нижневартовска.

четверг, 24 сентября 2015 г.

Комментируем коммиты


Примерно так выглядят обычно мои комментарии и комментарии некоторых моих коллег :)

А между тем, есть замечательные руководства как правильно составлять commit message: http://chris.beams.io/posts/git-commit/

Ну и напоследок, если совсем нет времени на фантазирование: http://whatthecommit.com/

Upd: Немного перевода полезных советов из статьи.

Во-первых, нужно потратить 5 минут и посмотреть на хорошие примеры. Где их взять? Linux kernel и сам git.

Автор вводит 7 правил хорошего коммита:
1. Разделяйте заголовок и содержание коммита пустой строчкой
Это очень удобно при просмотре лога коммитов - там не будет показываться полный перечень того, что вы исправили, а только короткий заголовок. При необходимости можно будет перейти по нему и посмотреть текст.

2. Ограничивайте заголовок 50 символами

3. Пишите заголовок с заглавной буквы

4. Не ставьте точку в конце заголовка

5. Используйте повелительное наклонение в заголовке
Например, "Clean your room". Никаких "Fixed bug with Y". Только "Fix bug".

6. Ограничивайте длину строки сообщения 72 символами

7. Используйте текст коммита для описания "что сделано" и "почему сделано", но не "как сделано"

пятница, 18 сентября 2015 г.

Готовимся к CTF

Тут мне иногда пишут разные люди с вопросом "хочу круто решать CTF, с чего начать?". Вообще, было бы неплохо систематизировать онлайн ресурсы для всего этого дела. Раньше, как водится, ресурсов было меньше чем нужно, а сейчас многообразие такое, что не знаешь с чего начать.

Наш топ ресурсов для подготовки открывает категория WEB:

0. Понятно, что базой для решения CTF в любой категории является умение программировать. Поэтому берем php, python, perl, mysql и штудируем. Для большинства соревнований знания этих 4 технологий на уровне базового фриланса будет достаточно. Эзотерика и функциональщина пойдет уже сама по накатанной.
1. Видео-курсы по вебу. Пока что их не так много.
2. Блоги по вебу.
3. Онлайн варгеймы.
Думаю, что пост будет обновляться.

среда, 16 сентября 2015 г.

Книги по информационной безопасности

Знаю, знаю, что мой блог читает один, может два человека. Адресую вопрос скорее сам себе.
Дело в том, что для сдачи канд. минимума по английскому требуется прочесть книгу 250 страниц по теме защиты информации. Уверен, что можно и не читать, но это же отличный повод пнуть себя и наконец-то от корки до корки изучить какое-нибудь современное и трендовое произведение.
Вопрос - какое? Не так уж и просто выбрать что-нибудь, да еще и в англоязычном интернете. В итоге, я решил воспользоваться подсказкой лаборатории касперского и прочесть Threat Modeling: Designing for Security. Уж не знаю стоит ли, но во-первых тема моделирования угроз в любом случае must have для тех, кому интересна тематика комплексной защиты информации, а во-вторых, рецензии на амазоне обещают применимые на практике методики и много троллинга.

Ух, ну посмотрим-посмотрим.

понедельник, 6 июля 2015 г.

KrasCTF Preannouncement

Встречайте новый, замечательный сайт для krasctf 2015!
Пока что по ощущениям - самый представительный в плане дизайна-юзабилити.

[http://krasctf.ru]

среда, 29 апреля 2015 г.

RuCTF 2015


RuCTF – это всероссийские командные соревнования по защите информации, проводимые в формате классического CTF. Это когда команды получают одинаковые образы игровых сервисов и защищают их от взлома, попутно атакуя аналогичные сервисы команд соперников. Но обо всем по порядку.


RuCTF – это не просто соревнования. Это конференция. Это мероприятия и турниры. Это дружба.



пятница, 13 февраля 2015 г.

Padding Oracle Attack или почему криптография пугает

Все мы знаем, что не следует самостоятельно реализовывать криптографические примитивы. Мы также в курсе, что даже если мы хитрым образом развернем порядок букв во всех словах сообщения, сдвинем каждую букву по алфавиту на 5 позиций и разбавим текст случайными фразами, чтобы сбить атакующих с пути, наш замечательный шифр скорее всего вскроет любой мало-мальски знакомый с криптографией человек (а в данном случае с задачей справится и в меру умный 12-летний подросток). Однако, и внедрение известных и стойких алгоритмов не является панацеей. Даже если вы возьмете готовую реализацию данного алгоритма, сгенерируете секретные ключи согласно всем требованиям и тому подобное, все-равно вы останетесь потенциально подвержены некоторым весьма эффективным атакам. Опытному злоумышленнику достаточно крошечной, казалось бы, совершенно несвязанной с криптосистемой толики информации, чтобы обойти шифрование. Мой посыл не в том, что убедить вас отказаться от самостоятельного использования криптографических средств или пойти и нанять консультанта с зарплатой от $1000 в час всякий раз когда вы задумываетесь о шифровании. Частично я веду к тому, что вам никогда не следует расслабляться, всегда нужно быть начеку, изыскивая пути, которые злоумышленник может использовать для получения дополнительной информации о вашей системе, а частично к тому, что Padding Oracle Attack является крутой демонстрацией всего этого. Итак, начнем.

воскресенье, 4 января 2015 г.

x64 strcmp

Странно, что я раньше с этим не сталкивался, но strcmp на x64, оказывается, возвращает не 0, -1, +1, а значения меньше, равные или больше нуля.
В общем, это довольно очевидно т.к. документация, ничего не говорит про -1 и +1., однако может быть читателю будет любопытно.

The strcmp function returns an integer greater than, equal to, or less than zero, accordingly as the string pointed to by s1 is greater than, equal to, or less than the string pointed to by s2.

Вот тут можно найти ответ с нужными отсылками: http://stackoverflow.com/a/18099554

Просто, будьте внимательны, когда пишите код.

четверг, 1 января 2015 г.

Новый год!

Новый год начинается с перевода :)
Интересно, что с должной мотивацией, перевести 12000 символов, не является такой уж сложной и напряжной задачей. Пожалуй, нужно чаще заниматься данным видом досуга.