
«Реверс» — внешнее приложение к программе AutoCAD, nanoCAD, BricsCAD, ZWCAD+, GstarCAD, которое позволяет выполнить:
- автоматическое создание форматов листов и основной надписи (СПДС и ЕСКД);
- удобное заполнение основной надписи (СПДС и ЕСКД);
- автоматическое распознавание и пакетная печать множества чертежей;
- автоматическая пакетная печать чертежей больших форматов на малых принтерах.
Узнать больше ↓ Скрыть подробности ↑
Оставить отзыв
Ваш отзыв отправлен на модерацию и будет опубликован после проверки
К сожалению, добавление отзывов доступно только после авторизации на сайте
Всего 1 отзыв
Добавить отзыв
Достоинства: Простая, удобная, адекватная цена
Недостатки: нет
Комментарий: Пользуюсь программой «Реверс» ка ктолько случайно узнала о ней на форуме проектировщиков с 2016г. В своём копицентре распечатываю чертежи студентам градостроительного колледжа из Автокада. Очень выручает. Стоимость на год низкая, что радует и даёт возможность покупать лицензию на 2ПК и продлевать её каждый год. Спасибо разработчику- Дмитрию Кириллову за программу.
АССЕМБЛЕР в 2023? Что такое «Reverse Engineering» и «Cyber Security». Показываю как ломают софт.
По настройкам часто обращаюсь к нему, никогда не отказывает в помощи.
Посадскова А.В.
Бесплатная ознакомительная версия
Скачать версия на 7 дней, объём: 5,5 МБ
Варианты покупки
Реверс
Автоматическая пакетная печать множества рамок (форматов) из пространства модели и листов.
Для скачивания доступна полная версия программы. Бесплатная ознакомительная версия не ограничена по функционалу, но действует в течение 7 дней.
Языки интерфейса: Русский
Операционные системы: Windows
Способ доставки: электронная доставка
Цена за копию (от 1 и более)
Товар добавлен в корзину
Электронная лицензия на 1 год
800 ₽
Продолжить покупки
Все онлайн
Добавьте товар в корзину, выберите способ оплаты «Покупка в кредит через ЮMoney», заполните простую анкету и получите одобрение через пару минут.
Все под контролем
Итоговую сумму и график платежей вы увидите перед тем как взять кредит. Условия вы всегда можете посмотреть в кошельке ЮMoney.
Выгодные условия
Если погасить кредит в 5 дней, то переплаты нет.
Подпишитесь на рассылку об акциях и распродажах!
для бесплатных звонков из регионов России
Ежедневно с 9.00 до 19.00
Продукты
Поддержка
- О магазине
- Адреса и телефоны
- Оформление заказа
- Оплата заказа
- Доставка заказа
- Помощь
- Уведомление о конфиденциальности
- Правила продажи
- Политика использования файлов Cookie
Скидки и акции
Юридическим лицам
- Продажа программ юридическим лицам
- Юридические аспекты покупки ПО
- Программы для образовательных учреждений
- Программы для компьютера
Сотрудничество
- Разработчикам программ
- Помощь разработчику
- Партнерская программа
- For software developers
- Реклама на сайте
- Вакансии
Allsoft — интернет-магазин лицензионного программного обеспечения. Открылся в 2004 году. Allsoft предлагает покупателям более 15 000 программ от 3000 разработчиков, обеспечивает быструю доставку (электронную и физическую), предоставляет 20 способов оплаты и накопительную систему скидок. Специалисты Allsoft оказывают покупателям все необходимые консультации, связанные с покупкой лицензионного программного обеспечения. Продажа программного обеспечения — наша профессия!
как ВЗЛАМЫВАЮТ игры? Что такое РЕВЕРС ИНЖИНИРИНГ (обратная разработка)?!

Вы используете устаревшую версию браузера .
Наш сайт построен на передовых и современных технологиях, поэтому при использовании устаревших версий браузера некоторые элементы могут отображаться некорректно.
Мы рекомендуем вам обновить браузер до последней версии.
Продолжая использовать данный веб-сайт, вы даете согласие на использование нами файлов «cookie», в целях хранения ваших учетных данных, параметров и предпочтений, оптимизации работы веб-сайта.
Источник: allsoft.ru
Статья Хищник среди нас. Учимся реверсить на примере Predator
Введение
Наверное тебе всегда было интересно, как работают современные малвари. Шифровальщики, ратники, стиллеры и другие популярные вирусы это всего лишь разновидность программ заточенные под определенные задачи. Описывать каждый из них я не стану, а лучше расскажу тебе как специалисты по информационной безопасности вскрывают такое. Для примера я взял когда-то знаменитый стиллер Predator.
Он имеет обширный арсенал функций и конечно же крякнутую версию по которой будет проще ориентироваться. Давай приступим к делу.
План работы
Хуже чем отсутствия плана ничего быть не может. Поэтому давай я введу тебя в курс дела. Сначала мы разберем теоретическую часть, где я опишу основы реверс-инженерии и расскажу как это работает. Также тебе придется познакомиться с матчастью, которая плотно связанна с таким типом деятельности. Ну а какая же теория без практики!
Для этого мы настроим среду анализа и попробуем вскрыть нашего хищника при помощи популярных утилит. Не буду задерживать, перейдем к основам.
Основы реверс-инженерии
Сейчас, в условиях цифрового мира многие вирусописатели стали прибегать к изощренным способам защиты своего детища от откладки, дизассемблирования и дальнейшего анализа кода. В связи с этим теперь каждый уважающий себя реверс-инженер обязан знать как распаковывать исполняемые файлы. Самые распространенные упаковщики это UPX, VMProtect, FSG и другие.
По мимо них создатели вирусов применяют протекторы. Их основная задача это защита исходного кода от посторонних глаз. Как метод защиты применяют обфускацию, шифрование или встраивание функций антиотладки.
Как ты уже догадался, чтобы добраться до заветной частички кода приходится снимать весь обвес, который применял сам разработчик вируса. Такой процесс зависит от запутанности кода. Бывают ситуации, когда вирус имеет стандартный набор защиты, который снимается несколькими утилитами. В других же случаях приходится включать творческий режим и часами колупать защиту, которую придумал автор. Можешь не волноваться, дальше стандартных протекторов в статье я не уйду.
Итак, ты столкнулся с самым стандартным вирусом, который покрыт защитой. Тут есть несколько вариантов развития событий. Ты можешь использовать автоматический распаковщик, которые специально заточены под это. Они основываются уже на известных алгоритмах упаковки и защиты. К примеру, чтобы снять UPX ты можешь использовать UN-PACK.
Чтобы вынести защиту ACProtect следует использовать ACKiller, ну а ASProtect ты можешь вынести с ноги используя Stripper.
Второй вариант развития событий это использовать универсальные распаковщики. К примеру QuickUnpack, RL!dePacker или Dr.Web FLY-CODE Unpacker, который основан на движке FLY-CODE антивируса Dr.Web. Отличие от первой ситуации в том, что большую часть работы придется делать самим. В любом случаи такой расклад событий гораздо лучше, чем последний метод о котором я расскажу далее.
Если все же тебе в руки попался профессионал своего дела, то вирус будет покрыть особым типом защиты, который скорее всего будет создан самим разработчиком малвари. Здесь потребуется ручная распаковка с помощью x64dbg или любого другого дизассемблера. Если файл запакован чем-то неизвестным, то это можно распознать по функциям GetProcAddressA, LoadLibraryA или GetModuleHandle из библиотеки kernal.
Как работать с вирусом
- Определение сигнатуры упаковщика;
- Поиск Original Entry Point (OEP);
- Дамп вируса на диске;
- Восстановление кода вируса (таблицы импорта/экспорта);
- Пересборка.
- Entry Point — адрес, по которому передается управление после загрузки программы в оперативную память.
- Breakpoints — точки останова, их используют для анализа выполняемого кода. Таким образом можно узнать где и что выполняется в вирусе.
- Original Entry Point (OEP) — это адрес, с которого бы начала выполняться программа, если бы не была упакован.
- Остановка при чтении;
- Остановка при записи;
- Выполнение памяти по заданному адресу.
- PE-файл — исполняемый EXE-файл, который содержит в себе исполняемый код и данные необходимые для правильной работы программы в системе.
- Virtual Address (VA) — виртуальный адрес элемента в памяти. Адрес загрузки берется из поля OptionalHeader в том случаи если он равен ImageBase.
- Relative Virtual Address (RVA) — относительный виртуальный адрес, он отсчитывается от адреса загрузки, который либо равен ImageBase, либо нет.
- RVA = VA – адрес загрузки
- Находим относительный виртуальный адрес у OEP;
- Дампим полученную малварь;
- Восстанавливаем таблицу импорта;
- Подменяем точку входа на оригинальную.
Разбираем малварь на пальцах
Из заголовка статьи ты мог узнать с какой малварью мы будем работать. Итак наш подозреваемый носит название Predator, что в переводе с английского означает хищник. Красиво звучит, не так ли? Находится в классе стиллеров, программ нацеленных на кражу и передачу паролей пользователя. Имеет обширный выбор функции и может красть не только из браузеров.
В наличие есть три типа передачи информации: PHP, FTP и E-Mail. Думаю объяснять как это работает не стоит. Заглянем в раздел настроек и посмотрим, как там обстоят дела. Из основных моментов это заметание следов путем очистки журнала, запись в автозапуск и отключения различных функций, к примеру вызов диспетчера задач. Дальше описывать я не буду, а попробую создать вирус.
Для этого переходим на последнюю вкладку и собираем PE-файл.
Начнем анализ как всегда со статического анализа. Воспользуемся нашим любимым DiE и посмотрим, что он найдет в нашей малвари.
Итак, наш подозреваемый построен при помощи библиотеки NET Framework, значит дела обстоят не так плохо и шансы разреверсить программу не прибегая к ручному дизассемблированию у нас есть. Поэтому можешь выдохнуть, так как учить ассемблер в статье мы не будем. Теперь откроем вкладку с энтропией и посмотрим какие же секции спрятал от нас разработчик.
Как ты видишь статус сжатия присутствует только на секции text. Она является одной из главных и порой именно в ней содержится вся необходимая нам информация. По статусу ты также можешь определить, покрыт ли файл упаковщиком или нет. Обычно если автор программы не прибегает к каким либо мерам защиты своего детища, то процесс сжатия не будет переваливать за 80%.
Если же он додумался накинуть оберег для своего творения, то твоя шкала уйдет дальше этих несчастных цифр. Еще это все можно увидеть из графика и его скачкообразного движения вниз и вверх.
А теперь давай закрепим знания по теоретической части. Знания относительных виртуальных адресов тебе пригодится для работы с картой памятью. В DiE ты можешь открыть вкладку Карта памяти и посмотреть, что там происходит.
Здесь тебе и пригодились знания виртуальных адресов. Также ты можешь ознакомиться с расположением секций в коде. Зачастую это полезно, поскольку тебе не приходится часами копашиться в ассемблере и искать нужный адрес. Итак, чтобы продвинуться в нашем расследовании заглянем в таблицу импорта и посмотрим, что у нас твориться там.
А в таблицах импорта у нас все глухо. Лишь одно доказательство того, что вирус использует библиотеку NET. Это ты можешь увидеть если обратишь внимание на библиотеку mscoree.dll. Она отвечает за шаблоны NET Framework.
Итак, теперь мы знаем краткую информацию о нашем вирусе, поэтому давай попробуем добраться до его исходного кода при помощи известных утилит. Более подробно узнать о всех утилитах для вскрытия вирусов и программ можно найти в моей предыдущей статье.
Включаем динамику
Чтобы докопаться до заветной информации воспользуемся ExtremeDumper. Это утилита динамического анализа и с помощью нее мы сможем снять весь обвес по типу обфускатора или криптора. Давай запустим ее попробуем поймать процесс нашего вируса. Заранее предупреждаю, запуск вредоносной программы производить следует только в виртуальной среде.
Так ты обезопасишь себя от несанкционированного доступа. После запуска дважды кликаем по нашему вирусу. Далее наведи мышку на окно ExtremeDumper и в выпадающем меню выбери функцию Refresh. Теперь у тебя в поле появился наш вирус. Дампим его и идем по пути готовой работы.
Прежде чем оценить труды дампера закинем сдампленный файл в pestudio. Да, ты сейчас начнешь возмущаться, что мы работаем на динамическом анализе, а не на статическом. Но с помощью этой утилиты ты сможешь посмотреть строки, которые содержит вирус. Выглядит все следующим образом.
Если присмотреться, то наш стиллер создает SQL базу и записывает туда всю собранную информацию. Также в строчках ты можешь найти ссылки и методы подключения по протоколу SMTP (почтовый протокол). Создание, хранение и сохранение — все это ты увидишь в этой утилите.
Повторно запустим наш вирус, но перед этим будем фильтровать трафик при помощи Wireshark. Перед запуском тебе требуется выбрать адаптер. У меня в его роли выступает Беспроводная сеть и поэтому я буду работать именно с ним. Все готово и теперь спустя пару минут перехвата давай попробуем отфильтровать нужные пакеты.
Из pestudio мы выяснили, что стиллер делает запросы к определенным сайтам. Начнем копать с протокола HTTP. Для этого в поле фильтрации вводим http. После этого ты увидишь такую картину.
Как ты мог заметить, вирус отправляет уведомления и возвращает ошибку, поскольку я собрал малварь без способов передачи информации. Ты можешь развлечься при помощи фильтров Wireshark и узнать больше информации о нашем подозреваемом. Я этим заниматься не буду, поскольку моя основная задача была убедиться в том, что программа обращается к определенным сайтам для передачи информации. Теперь ты знаешь нужные данные для работы, что же мешает заглянуть под капот и узнать, как написан такой софт?
Для этого я буду использовать достаточно известную утилиту от JetBrains с названием dotPeek. Скачать ты его можешь с
Ссылка скрыта от гостей
. Загружаем, запускаем и работаем. Перетяни вирус на окно декомпилятора и буквально через пару минут случиться магия. Перед тобой явится исходный код вируса в полном объеме. На деле это выглядит так.
Интерфейс хищника стоит на Windows Forms, а также в части импорта библиотек у нас есть сокеты и почты для работы. Все же какая-то защита данных от несанкционированного доступа у нас есть. Это ты можешь увидеть из следующего скриншота.
Малварь шифрует информацию при помощи AES, это ты можешь увидеть в коде, ну а ключи для декодирования у тебя перед глазами. Передача данных проходит по порту 587. Воспользуйся этим при последующем перехвате трафика через акулу. Дам наводку по фильтру. Используй такую строчку, чтобы найти нужную информацию.
tcp.port == 587 || udp.port == 587
Ну или если тебе лень это делать, то читай статью дальше и я расскажу, что нам даст такой фильтр. Этот порт будет работать в том случаи и только в том случаи если ты не оставлял поля отправки данных пустыми. В моем случаи они ничем не заполнены, поэтому вирус передает информацию по стандартному порту 80.
Но в основном здесь ты можешь ознакомиться только с пакетами SYN и ACK. Напомню, для чего они нужны.
Обычно, перед тем, как передать пакеты с информацией серверу твое устройство делает предварительное соединения при помощи отправки TCP-пакета с флагом SYN. Он означает то, что устройство хочет провести подключение. Логично? Как по мне вполне. Если ответ от сервера будет положителен то передача начнется. Ну а флаг ACK в пакете TCP говорят о завершении подключения.
Я объяснил все максимально коротко, более подробно о работе с TCP соединениями ты узнаешь в других моих статьях. Повторюсь, в моем случаи нет никакой информации кроме этих флагов так как я не указал место, куда стоит отправлять информацию.
Продолжим наше увлекательное путешествие по строчкам кода хищника. Переключимся на ветку RunPE и посмотрим, что импортировал наш софт. Здесь ты увидишь библиотеку kernal32 и ntdll. Импортированных модулей на горизонте не видно. Вернемся к Form1. Тут продолжаем импортируемые модули и натыкаемся на user32.
Обычно, если ты такое видишь, то жди беды. Точка входа у нас это SetWindowsHookExA.
Также вирус регистрирует нажатие клавиш, это можно увидеть если ты пролистаешь код ниже. Записывает информацию наш вирус в файл с названием SysInfo.txt. А теперь я расскажу тебе, что за информацию пытался передать наша малварь в акуле. Файл записывается с именем Predator_Painv13_Notification. К нему добавляется имя компьютера, с которого будет отправлено письмо и имеет расширение TXT.
В нем содержится текст такого формата: This is an email notifying you that has ran your logger and emails should be sent to you shortly and at interval choosen.
Далее идут детали подключения, а также несколько адресов. Еще вирус меняет значения реестра по пути: HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced\Hidden. На заметку, это еще не автозапуск. Он тут реализуется совершенно иным образом. Для этого создается файл с названием autorun.inf и в него записывается следующие строчки:
[autorun] open=Sys.exe action=Run win32
Далее все это дело помещается по такому пути: SoftwareMicrosoftWindowsCurrentVersionRun. Да, работа автозапуска работает очень странно, но не нам судить творения других людей. Также наш подозреваемый опирается на программу vbc.exe. Поэтому чисто в теории если ты не установишь библиотеку NET Framework, то хищник обойдет тебя стороной. Советы странные.
Такие же странные как заставить пользователя выключить интернет. При первом запуске, чтобы сразу не спалиться стиллер использует timesleep. Не забудем про самое главное, где хранятся логи для дальнейшей отправки. Вся информация как не странно хранится в AppData. Для многих это будет очевидно, но все же не указать это при анализе очень не вежливо.
Также при помощи условного цикла реализуется функция отключения диспетчера задач. На коде все выглядит примерно следующим образом.
while (true) < if (Operators.CompareString(this.TaskManager, «DisableTaskManager», false) != 0) < Process[] processes = Process.GetProcesses(); int index = 0; while (index < processes.Length) < Process process = processes[index]; if (Operators.CompareString(process.ProcessName, «Taskmgr», false) == 0) process.Kill(); checked < ++index; >> > if (Operators.CompareString(this.TaskManager, «DisableTaskManager», false) != 0) < Process[] processes = Process.GetProcesses(); int index = 0; while (index < processes.Length) < Process process = processes[index]; if (Operators.CompareString(process.ProcessName, «taskmgr», false) == 0) process.Kill(); checked < ++index; >>
Помимо этого стиллер убивает реестр, консоль и конфигуратор. Поэтому если ты попытаешься что-либо запустить у тебя ничего не получится. А теперь перейдем к моменту о том, как малварь узнает IP адрес. Способов для определения адреса много, но наш подозреваемый делает запрос к сайту
Ссылка скрыта от гостей
и возвращает ответ для записи. Больше в ветке Form1 искать нечего. Все данные по типу хоста, порта, паролей и логинов храниться в ветке Resources.
Здесь я рассказал как работать с вирусом и что нужно, чтобы получить его исходный код. Давай подведем итоги по нашей статье.
Заключение
Здесь я описал реверс стиллера Хищник, который как и остальные заслуживает должного внимания среди вирусологов. Также мы разобрали основы реверс-инженерии и теперь ты знаешь на базовом уровне то, как работать с малварью. Конечно, это еще не все, что может произойти в реальных условиях. Ты можешь столкнуться с самодельным шифрованием кода и тогда придется прибегать к ручному дизассемблированию. Но об этом я расскажу тебе в другой статье.
Источник: codeby.net
CTFzone write-ups – Shall I reverse it?

Друзья, бурные выходные прошли, и мы готовы представить вам новую партию райтапов – на этот раз мы подробно разберем задания ветки Reverse. Надеемся, вы уже разобрались с двумя заданиями из OSINT и готовы полностью погрузиться в процесс реверс-инжиниринга. Обещаем, будет интересно 😉
Это направление имело большую популярность среди участников — одно только задание на 100 решили 103 человека. Однако, таск на 1000 так и остался нерешенным. Поэтому, как и в случае с OSINT, райтап на самое сложное задание CTFzone будет опубликован несколько позже в отдельном посте. А сейчас бросайте все свои дела, и полный вперед!
Reverse_50. Console version 1.337
A.U.R.O.R.A.: Lieutenant, you are standing in the Alpha base in front of the SCI430422 mainframe art console where its sixty-four LED lights are blinking in hypnotic patterns. As you know, this system is renowned for its top-notch security measures. Only the most expert or resourceful hackers are able to break in — and you are definitely one of them.
Решение:
В этом задании нам нужно было попасть в систему консоли. Для начала запускаем файл на исполнение и видим окно с приветствием и предложением ввести пароль:

Что же делать? Открываем файл в отладчике OllyDbg и находим строчку «Please enter password:» — в основном окне пролистаем листинг вверх, до адреса 004010F9:

Как вы можете видеть, проверка введенного пароля осуществляется в функции, расположенной по адресу 00401000. Попробуем поставить на этот адрес брейкпоинт (клавиша F2 в OllyDbg), затем нажмем F9 (продолжить исполнение) и для примера введем какую-нибудь строку в окне программы:

Нажимаем «Enter», и происходит срабатывание брейкпоинта. Далее переходим в OllyDbg и нажимаем клавишу F7, чтобы перейти внутрь функции по адресу 00401000:

Сразу можно заметить, что по адресу 004010CF производится вызов функции strcmp() из стандартной библиотеки C. Эта функция сравнивает две строки и возвращает 0, если эти строки одинаковы. Ставим брейкпоинт на вызов функции (клавиша F2), нажимаем F9 (продолжить исполнение) и смотрим, какая еще строка, кроме введенной нами «password123», будет в нее передаваться:

В окне стека (и в окне регистров) мы видим, что строка s1 равна «ctfzone» (без кавычек).

Ответ: ctfzone
Reverse_100. The Doors of Dorun
*A.U.R.O.R.A.: Lieutenant, your co-pilot was abducted by aliens and put into prison. They are out hunting now and it’s your chance to set him free! He is held behind the Doors, the jambs invisible to the eye, and matched so perfectly with the metal bulkhead that when closed the Doors could not be seen.
The inscription on the archivolt read:
«The Doors of Dorun, Lord of Omega. Speak, friend, and enter. I, Norvy, made them. Calabrimbor of Alpha Centauri drew these signs».
But be careful and hurry up. They can be back any moment.*

Решение:
В этом задании нам нужно было подобрать пароль к вратам, за которыми держали в плену нашего второго пилота. В первую очередь мы запускаем CrackMe, и на экране появляется следующее окно:

Попробуем ввести любое слово и нажать «Try», но пароль не подходит, и мы видим такое сообщение:

Сам по себе CrackMe представляет собой 64-битный исполняемый файл PE формата. Откроем его в IdaPro и попробуем найти строчку «the door is still closed!»:

На эту строчку существует только одна перекрестная ссылка:

Вот функция, в которой IdaPro нашла обращения к этой строчке:

Здесь мы также видим зашифрованный флаг (легко убедится, что функция sub_140001160 занимается дешифровкой) и функцию, определяющую правильность пароля: «sub_1400012C0». При помощи GetDlgItemTextW в эту функцию передается строка, введенная в поле для ввода пароля. Проанализируем эту функцию:

Здесь прослеживается цикл и два массива из пяти элементов. Также происходит проверка длины введенного пароля:

Проанализировав эту функцию, мы видим, что пароль из четырёх символов в кодировке UTF-16 (кодировка для WideChar в Windows) состоит из двух чисел c размером DWORD. Далее мы видим, что остатки от деления этих чисел на числа ((1 сравниваются с захардкоженными значениями.
Можно заметить, что ((1 , и что это числа Ферма: 3, 5, 17, 257, 65537. Алгоритм проверки пароля далее можно свести к двум системам сравнений:
X1 % 3 = 0 X1 % 5 = 0 X1 % 17 = 1 X1 % 257 = 241 X1 % 65537 = 995
X2 % 3 = 1 X2 % 5 = 4 X2 % 17 = 6 X2 % 257 = 104 X2 % 65537 = 413
Восстановить исходные числа нам поможет Китайская Теорема об Остатках. В интернете можно найти решатели таких сравнений:


Итак, мы получили два числа, которые теперь необходимо преобразовать в строку UTF16. Для этого можно использовать Python (при этом не забываем про обратный порядок байт):

Теперь осталось проверить полученный результат. Введем эту строку в окно для ввода пароля.


Вот и все! Мы открыли врата.
Ответ: ctfzone
Reverse_300. Python’s urn
A.U.R.O.R.A.: Lieutenant, the Doors are open but there is one more lock behind them. You will find the key in the Japanese vase, but be careful – don’t wake this sleeping python up otherwise we won’t get out.
Решение:
После того, как мы открыли врата, оказалось, что перед нами следующая дверь. Новое задание – новый ключ 🙂 Поехали!
Запускаем файл на исполнение, вводим ключ, но ничего не выходит.

Попробуем разобраться. Прежде всего следует выяснить, с чем мы вообще имеем дело. Чтобы определить тип исполняемого файла, можно воспользоваться CFF explorer:

Очевидно, что .Net Assembly, Ida и традиционные отладчики в данном случае бессильны. В этот момент можно было вспомнить про dnSpy — один из инструментов, которые могут помочь в исследовании кода, использующего .Net. Загружаем в него исполняемый файл.

По названию основного класса (PythonMain) и названию ресурсов можно сделать вывод, что эта программа была написана на IronPython. В основной функции происходит лишь подгрузка .NET сборки из ресурса «IPDll.WFCrackMe». Придется извлечь ресурс с этим именем и загрузить его в dnSpy.

Здесь все гораздо интересней, есть даже названия функций. Сразу предположим, что функция с названием «verifyPassword» проверяет введенный нами пароль, и чтобы убедиться в этом, достаточно протестировать в отладчике, какая строка будет передана ей в качестве аргумента.
Далее нам необходимо понять, как проверяется пароль. Самая большая проблема при анализе кода – это разобраться с функционированием «strongBox» и «globalArrayFromContext». Эти переменные на самом деле заполнялись в функции « __main__ ».
Рассмотрим процесс реверсинга verifyPassword на примере небольшого куска кода с ветвлением:
if ((arg = (CallSite>)strongBox.Value[37]).Target(arg, (arg2 = (CallSite>)strongBox.Value[38]).Target(arg2, globalContext, globalArrayFromContext[26].get_CurrentValue(), password), 81))
В первую очередь нам необходимо подставить значения на места «strongBox» и «globalArrayFromContext». Значения берем из следующих строк « __main__ »:
strongBox.Value[38] = CallSite>.Create(PythonOps.MakeInvokeAction($globalContext, new CallSignature(1))); strongBox.Value[37] = CallSite>.Create(PythonOps.MakeComboAction($globalContext, PythonOps.MakeBinaryOperationAction($globalContext, ExpressionType.NotEqual), PythonOps.MakeConversionAction($globalContext, typeof(bool), 1)));
Если нет уверенности в правильности полученного для «strongBox» значения, его можно проверить в отладчике. Подставим значения в исследуемый участок кода и упростим его:
if (NotEqual(len(password), 81)) < result = false; >Или if (len(password) != 81) result = false;
Таким образом мы выяснили, что длина пароля должна быть равна 81 символу. Дальнейший анализ функции затруднителен, т.к. функция довольно большая, но, благодаря поверхностному анализу и отладке, мы сможем сделать несколько выводов:
- При дальнейшем анализе мы сразу заметим таблицу 9×9 из 81 числа.
- При попытке ввести в качестве пароля строку из 81 символов, содержащую не только цифры, мы попадем на обработку исключения: «IronPython.Runtime.Exceptions.ValueErrorException: Invalid integer literal». Следовательно, необходимо вводить только цифры.
- Также одно из ветвлений укажет нам на то, что все цифры, кроме 0, должны совпадать с цифрами из массива.
- Нулевые ячейки таблицы заполняются соответствующими ячейками во введенной строке.
Далее мы попадаем в ветвление со страшным, на первый взгляд, условием:
if ((arg49 = (CallSite>)strongBox.Value[59]).Target(arg49, (!(arg50 = (CallSite>)strongBox.Value[60]).Target(arg50, obj9 = (arg51 = (CallSite>)strongBox.Value[61]).Target(arg51, globalContext, globalArrayFromContext[11].get_CurrentValue(), obj))) ? obj9 : ((!(arg52 = (CallSite>)strongBox.Value[62]).Target(arg52, obj10 = (arg53 = (CallSite>)strongBox.Value[63]).Target(arg53, globalContext, globalArrayFromContext[12].get_CurrentValue(), obj))) ? obj10 : (arg54 = (CallSite>)strongBox.Value[64]).Target(arg54, globalContext, globalArrayFromContext[13].get_CurrentValue(), obj))))
После подстановки соответствующих значений и упрощения это условие превращается в простую проверку:
if (BoolConvert((!BoolConvert(obj9 = CheckLines(obj))) ? obj9 : ((!BoolConvert(obj10 = checkColumns(obj))) ? obj10 : CheckSquares(obj)))) Можем убрать лишние BoolConvert и раскрыть конструкцию «a?b:c». Получается еще проще: if(CheckLines(obj) СheckColumns(obj) CheckSquares(obj))
Нам нужно попасть на истинную ветку данного условия, т.е. все функции должны вернуть «True».
Теперь проанализируем функцию CheckLines. Она довольно простая — функция проверяет, что в каждой строке встречаются цифры от 1 до 9. Функции СheckColumns и CheckSquares посложнее, но на этом этапе уже можно догадаться, что мы имеем дело с Судоку:

В интернете можно найти массу решателей, так что вы можете поупражняться самостоятельно 😉
Итак, воспользовавшись решателем, мы получаем искомый ключ.

Ответ: ctfzone
Reverse_500. Bridge repair
A.U.R.O.R.A.: Lieutenant, watch your step! There is a pit infested with worms down the road. There is a bridge over the pit but it’s in ruins and you can restore it only in the same way it was destroyed. I’ve got one worm in the quarantine, go for him and repair the bridge. Hurry up, we have to save our pilot!
Решение:
Итак, в этом задании необходимо спасти пилота, однако добраться до него можно только преодолев разрушенный мост. Нам нужно его восстановить. В качестве «моста» предлагается файл «Bridge.txt».
Открыв файл «Bridge.txt» в шестнадцатеричном редакторе, мы можем убедиться, что он зашифрован. Из описания задания понятно, что нам предоставили программу, которая зашифровала этот файл, и нам необходимо его дешифровать.
Далее проверим, что не так с файлом «reverse500.exe». Запускаем файл, и в ответ на консоли появляется сообщение — «you must specify the file for encryption»:

С помощью перекрестных ссылок поищем использование этой строчки в исполняемом файле. Для этого откроем файл в компиляторе IdaPro. Очевидно, что шифруется файл, передаваемый в качестве аргумента командной строки.

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

Далее попробуем понять структуру зашифрованного файла, изучив простенькую функцию «WriteCryptedData»:

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

Посмотрим на файл «Bridge.txt»:

Далее определим последний байт вектора «IV». Для этого откроем программу в отладчике, указав в качестве аргумента любой файл, и поставим брейкпоинт на адрес функции «WriteCryptedData». После чего, предварительно немного поправив ассемблерный код, организуем перебор последнего байта вектора «IV». Результат перебора показан на скриншоте:

Теперь у нас есть полный вектор «IV»: [47 08 8F E7 C4 C0 E9 AB].
Далее необходимо проверить режим шифрования и симметричность используемого шифра.
Вернемся к функции «CryptData» в отладчике, подав на вход программе тестовый файл (в моем случае файл содержал строку «HelloWorld!»). Далее запишем вектор «IV» (находится в EAX перед вызовом CryptData) и результат шифрования (находится в EAX после вызова CryptData).

Проверим идентичность процедуры дешифрования и шифрования. Для этого перезапустим программу под отладчиком и снова поставим брейкпонт на «CryptData». Только теперь перед ее исполнением поправим вектор «IV» и шифруемый буфер.

В результате повторного шифрования зашифрованных данных мы получим исходный текст!
Теперь можно расшифровать файл из задания. Для этого удалим из него первые 15 байт и запустим программу под отладчиком, указав в качестве параметра файл с зашифрованными данными. Вновь поставим брейкпоинт на «CryptData» и перед вызовом функции исправим вектор «IV» на [47 08 8F E7 C4 C0 E9 AB]. После исправления вектора «IV» нажимаем клавишу F9, в результате чего программа зашифрует данные. Из результирующего файла удалим первые 15 байт и откроем его в текстовом редакторе:

Ответ: ctfzone
P.S. Для тех, кому интересно, мы использовали в этом задании алгоритм шифрования Salsa и алгоритм хэширования CubeHash. Но это может заметить только опытный глаз 😉
Кажется, теперь все встало на свои места. Если у вас есть какие-то вопросы или пожелания – пишите в наш чат в телеграме и оставляйте комментарии. А новые познания в области реверс-инжиниринга можно продемонстрировать по этой ссылке — задания будут доступны до 15 декабря.
Всем удачи и до новых встреч!
Источник: habr.com