Curve Logic
Задание
Наши разведчики нашли в пустоши заброшенный сервер, который остался от тех, кто создавал системы безопасности еще до Великой Войны. Он принимает числа и выполняет какие-то сложные расчеты. Если твой ввод будет правильным, сервер откроет доступ к засекреченной информации. Постарайся, нам очень нужны эти данные!
Решение
Подключение для выполнения данного задания происходит по Netcat.
Для выполнения задания был дан файл с исходным кодом сервиса:
После краткого анализа кода становится понятно, что в данном задании использованы операции на эллиптической кривой P-521.
Если вы не знаете, как работают эллиптические кривые, и зачем они нужны, прочитать про это можно здесь и здесь.
При подключении к сервису пользователю доступно меню с выбором десятичной или двоичной формы ввода.
This super computer uses elliptic curves for its calculations.
Enter the decimal representation of the number or its binary form to begin the calculation
1 - decimal or 2 - binary:
Определим, в каком случае пользователю будет выдан флаг. Из анализа кода становится понятно, что для этого необходимо, чтобы переменная result была равна 1.
При этом result является результатом работы функций для обработки ввода пользователя в десятичной или двоичной форме.
Рассмотрим отдельно логику функций, используемых для обработки десятичного и двоичного ввода. Начнем с функции для десятичного ввода:
Разберемся с параметрами, передаваемыми в эту функцию. Параметры order, Q и O являются параметрами эллиптической кривой и генерируются ранее в коде. Параметр nbit также задан в коде. Параметр n является числом в десятичной форме, введенным пользователем.
В первую очередь в данной функции происходит проверка ввода пользователя на соответствие некоторым условиям с помощью функции check_number. Проанализировав код данной функции, прийдем к выводу о том, что ввод пользователя должен быть числом длиной nbit (в нашем случае 521) и должен содержать более nbit // 2 + 1 единиц в двоичном представлении (в нащем случае 261).
Если ввод пользователя прошел проверку, то происходит определение некоторых параметров. Параметр R приравнивается точке на бесконечности, а параметр P - точке Q, сгенерированной для эллиптической кривой. Также задается счетчик counter, равный нулю.
Далее происходит обработка введенного пользователем числа. При этом число рассматривается побитово в обратном порядке (от младшего бита к старшему). Если бит равен 1, то к точке R прибавляется точка P и значение счетчика counter увеличивается на 1. При этом независимо от значения бита происходит удвоение точки P и увеличение счетчика counter на 1. Когда выполняется условие 406 * counter >= 522 * nbit, то перебор битов числа останавливается.
Потом происходит проверка условия:
Для получения флага необходимо, чтобы рассчитанная точка R была равна сложению точки Q с самой собой n раз. Вспомним, что n - это введенное пользователем числом в десятичной форме. Также n равно сумме степеней двойки на местах единичных бит. Добавление Q к R происходит только, если бит n равен 1. Таким образом, для выполнения данного условия необходимо, чтобы при рассмотрении числа по битам было пройдено все число.
Так как перебор битов останавливается, когда выполняется условие 406 * counter >= 522 * nbit, то при значении counter равном 670 перебор будет остановлен. При этом, чтобы пройти все число длиной 521 бит с минимум 261 единицей (условие для прохождения первой проверки) необходимо прибавить counter 782 раза. Соответственно, не получится пройти такое число целиком. Из этого можно сделать вывод о том, что при выборе десятичного ввода пользователю не удастся получить флаг.
Рассмотрим работу функции для двоичного ввода пользователя:
В данном случае также длина введенного числа должна быть равна 521 бит, однако НЕТ УСЛОВИЯ ДЛЯ МИНИМАЛЬНОГО КОЛИЧЕСТВА ЕДИНИЦ!
Помимо параметров R, Q и counter, заданных аналогично случаю с десятичным вводом, вводится переменные n и i для сборки числа, введенного пользователем, в десятичном виде.
Сложение точек на кривой в данном случае происходит также, как и в случае с десятичным вводом пользователя. Побитовый перебор будет завершен, когда выполнится условие 594 * counter >= 600 * nbit. Таким образом предельное значение counter будет равно 527.
Для получения флага необходим пройти следующее условие:
То есть для получения флага необходимо пройти все биты числа, введенного пользователем. Так как в данном случае нет условия на минимальное количество единиц в числе и предельное значение counter равно 527, а длина числа 521 бит, то пользователь может ввести число, содержащее до 6 единиц.
Выполним ввод такого числа, пользователь получит флаг:
This super computer uses elliptic curves for its calculations.
Enter the decimal representation of the number or its binary form to begin the calculation
1 - decimal or 2 - binary:
2
Enter binary form of number separated by commas:
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Calculations completed successfully. There is your flag: ptech2024{17d2c5ab414a641c1620623cb5b8cd081f6e749f}