Декомпилируем .NET, внутри два языка: C# и Q# (квантовый язык от Microsoft)
Обфускаций нет, C# компилируется почти в код, Q# - это кодогенерация функций в классы, поэтому надо смотреть в метод
__Body__ классов
Квантовый алгоритм простой - он для каждого байта флага делает QFT на 8 кубитах, затем к ним применяет квантовые преобразования, которые отправил пользователь, после этого измеряет кубиты и выводит преобразованный флаг.
Простой путь решения - обратить QFT, то есть развернуть преобразование, написав обратное к нему. Для этого у нас есть все вентили, кроме преобразования Адамара. К счастью, оно выражается через имеющиеся. Мы можем работать только со старшим кубитом, переключаться между кубитами можно с помощью SWAP.
QFT:
https://qiskit.org/textbook/ch-algorithms/quantum-fourier-transform.htmlКак выразить Адамара:
https://einsteinrelativelyeasy.com/index.php/quantum-mechanics/164-hadamard-gate-decompositionСложный путь решения: после применения
Ry(pi/2) на кубитах они более-менее стабилизируются. Если собрать N раз алфавит (локально), на каждой позиции будет чётко видна картина распределения 0/1 битов, уникальная для каждого байта. Собираем статистику для алфавита, скачиваем флаг N раз и ищем корреляции
Репозиторий с исходниками и сложным решением:
https://github.com/keltecc/hackquest-2021-collapse