Обложка статьи

Кубок обратной разработки

Кубок Реверса 2019 — это всероссийское соревнование по реверс-инжинирингу, организованное кафедрой системного программирования СПбГУ. Корреспондент «Мегабайт» пообщался с Эдгаром Казиахмедовым и Климом Киреевым, участниками команды-победительницы VIM и студентами совместной программы МФТИ и Сколтеха «Интеллектуальный анализ данных», и узнал, что нужно сделать, чтобы победить.

  • Реверс-инжиниринг — исследование программы для определения ее функциональных характеристик, внутренней архитектуры и принципа работы.
  • Стегоанализ — наука о выявлении факта передачи скрытой информации. Стеганография — способ передачи информации, когда факт передачи остается в тайне.
  • Обфускация — намеренное запутывание кода посредством компилятора, делающее бинарный файл программы стойким к анализу.
  • Системное программирование — работа над системным программным обеспечением.
  • IDA — интерактивный дизассемблер, широко используемый в реверс-инжиниринге. Позволяет превратить код программы в ассемблеровский текст, который используют для анализа работы программы.
  • Ghidra — открытый бесплатный инструмент для реверс-инжиниринга от Агентства национальной безопасности (NSA).

Какой опыт в реверсе у вас уже есть?

Эдгар Казиахмедов: На четвертом курсе бакалавриата мы обучались реверсу отдельных частей Windows ОС у Алексея Костюшко. Мы работали в компании Virtuozzo — занимались визуализацией, и потому у нас есть бэкграунд в системном программировании и в низкоуровневой разработке.

Клим Киреев: Мы никогда не имели дело с обфусцированными программами и в основном писали на языке С, а не на ассемблере, а это было необходимо на соревновании. 

Насколько опыт важен на соревновании?

Эдгар: Опыт в разных областях очень помогает. Наша научная сфера интересов — стеганография и стегоанализ. Это помогло при решение задач с картинками, как и знание ОС, низкоуровневого программирования и умение работать с отладчиками.

Клим: Было очень непривычно, что остальные участники пользовались IDA — основным инструментом в реверс-инжиниринге, — а мы не умели, потому что никогда серьезно реверсом не занимались. Для наших целей хватало стандартных утилит в Linux. Мы не стали учиться пользоваться IDA прямо на соревнованиях и были сильно ограничены в инструментарии.

Какие этапы были на соревновании? 

Клим: Был предэтап, где на почту пришли пять общих задач. Мы их делали из дома. А очный этап проходил уже в университете: три дня с 10 до 18, но по факту мы задерживались и дольше. Это очень жесткий формат — никакого перерыва на обед не предусмотрено. Ты можешь уйти и поесть, но время остановлено не будет. Поэтому мы по восемь часов подряд сидели и работали. 

Эдгар: На второй день соревнований нам представили список задач на выбор, а на третий — у каждой был еще и различный уровень сложности. То есть ты мог выбрать сложный вариант и не решить. А мог выбрать слишком простой и упустить возможность получить больше баллов. Приходилось искать баланс. 

Клим: Если изначально выберешь меньший уровень сложности, то по правилам не сможешь потом решить более сложный. В этом есть элемент игры, ты должен грамотно оценить риски.

Какие задачи вам показались слишком заурядными, а какие, наоборот, очень интересными?

Эдгар: Задачи первого этапа казались ничем не примечательными: в одной нужно было просто поменять формат, чтобы запустить программу. Вторая связана с достаточно несложной стеганографией. Мне лично она понравилась.

Клим: Задачи продуманы очень хорошо — тут не к чему придраться. Все они достаточно сложные: в одной нужно было не только зареверсить код, но и написать бота, чтобы он общался с сервером, на котором крутится код. Это нереально сделать, хотя, может, у кого-то и получилось. 
Насколько задачи были прикладными?

Клим: С одной стороны промышленный реверс-инжиниринг не предполагает наличие тех же обфускаций, 
а с другой — некоторые мелкие программы подвергаются этой операции. Тогда задачи оказываются полезными: если хочешь найти вирус, нужно уметь обходить такие вещи.

Какие качества помогли вам победить?

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

Эдгар: В первый день нам дали тренировочные задачи, тогда мы сидели и ничего не понимали: что-то знакомо, но был и абсолютно новый инструментарий. Это даже обескуражило немножко. Но на деле мы даже не стали пользоваться IDA, а нашли открытый аналогичный инструментарий на Ghidra. 

Как оцениваете организацию мероприятия?

Эдгар: Понравилось все. У нас были не только соревнования, но и лекции. Было очень неожиданно там увидеть Дмитрия Склярова (разработчик алгоритма программы Advanced eBook Processor — примеч. ред.)!

Клим: Хотелось бы добавить перерывы на питание. Это, на мой взгляд, единственный минус в организации. В таких мероприятиях сложно избежать каких-то накладок, но здесь их почти не было. Каждую задачу писал программист, а потом еще обфусцировал и проверял, решаема ли она. 
Как мастер-классы помогали в решении задач?

Эдгар: В первый день был семинар, на котором разбирали возможные задачи. Я тогда узнал, что можно производить реверс с помощью скриптов. Что-то пробовали на практике, что-то было просто интересно, но так чтобы помогло — нет.

Клим: Там были задания, на примере которых мы разбирали, каким образом организаторы обфусцируют код. Но это не особо помогло в решении задач.

Чем полезно участие в Кубке?

Эдгар: Сюда приехали ребята с разных регионов — полезно познакомиться с ними, с тем, чем они занимаются. Посмотреть новые задачи, которые не встречались раньше. Было несколько презентаций касательно мест работы, на которых предлагали подать резюме.

Какие советы вы дадите будущим участникам?

Клим: Не зацикливайтесь на одной задаче! Важно сразу пробовать все и решать, какая из них легче, а дальше двигаться по нарастающей. Например, на соревновании было очень сложное задание «Комнаты». Просидев над ним три часа, я понял, что могу потратить все оставшееся время, так его и не решив. Поэтому переключился и начал искать полегче.

Эдгар: На третий день была задача с растровыми картинками. Сначала я взял высокий уровень и просидел очень долго; понизил — решил за пятнадцать минут. Потом вернулся и понял, что изначально требовалось всего две строки изменений. 

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

Материал опубликован в газете «Мегабайт»
 

Еще почитать по теме

Обложка статьи
Дополнительные органы внутри нас
В сентябре в Journal of Anatomy вышла статья австралийских ученых. В ней исследователи предполагают, что к концу XXI века у всех людей появится дополнительная предплечевая артерия. С точки зрения хирургии ее можно будет использовать для пересадки в другие части тела.
Обложка статьи
Дополнительные органы внутри нас
В сентябре в Journal of Anatomy вышла статья австралийских ученых. В ней исследователи предполагают, что к концу XXI века у всех людей появится дополнительная предплечевая артерия. С точки зрения хирургии ее можно будет использовать для пересадки в другие части тела.